将 EFS 接入点挂载到 ECS 卷时出现问题

Posted

技术标签:

【中文标题】将 EFS 接入点挂载到 ECS 卷时出现问题【英文标题】:Trouble mounting EFS Access Point to ECS Volume 【发布时间】:2021-01-11 10:52:50 【问题描述】:

我在尝试通过 EFS 访问点将 ECS 卷挂载到 EFS 时遇到问题。

任务角色设置为对该文件系统的 ClientWrite、ClientRead 和 ClientRootAccess。

使用 posix userid 1001 和 groupid 1001 设置接入点,权限为 755。

集群和文件系统位于正确的 VPC 中。

但 ECS 未能启动任务并出现此错误:

来自守护程序的错误响应:无法复制文件信息 /var/lib/ecs/volumes/task-name:chown 失败 /var/lib/ecs/volumes/任务名称

如果我在 root 中将接入点的 POSIX 用户 ID 和 groupid 设置为 0,我就能够启动任务。但我觉得它不是共享 FS 中出于安全原因的最佳选择。

经过一些常规搜索后,我假设在挂载卷后,容器或其主机的用户已从 root 更改,这与 Dockerfile 中任何进一步的文件/目录操作相混淆。 AWS 接入点文档指出:

启用用户强制后,Amazon EFS 将替换 NFS 客户端的 具有在接入点上配置的身份的用户和组 ID 用于所有文件系统操作。

因为我认为/var/lib/ecs/volumes/... 实际上要么是容器目录,要么是主机目录。

我该如何规避这个问题?

仅供参考:该任务在 Spot 实例集群中运行,因此在这种情况下手动挂载卷不是理想的解决方案

【问题讨论】:

嗨。我遇到了同样的问题。我通过删除 Dockerfile 中的现有文件夹解决了这个问题。似乎当图像中存在文件夹时,docker(或 ECS ?)想要 chown/chmod/copy 到目标中...... 【参考方案1】:

您尝试运行的 Docker 映像中定义的 uid/gid 与您尝试使用的 1001/1001 uid/gid 是否可能不匹配?

我们在获取已定义卷的基本映像并尝试更改映像中主要用户的 uid 时遇到了同样的错误。由于您无法更改卷的文件所有权或权限,因此一旦创建,docker 守护程序将尝试将原始 uid 所有权应用于已安装的 EFS 卷,从而导致 EFS 访问点阻止所有权/权限的更改。

您可以通过在本地进入 docker 容器或运行 docker execls -la /path/to/container/folder 来检查这一点,并检查该文件夹的所有权是否设置为具有 uid 1001 的用户。

【讨论】:

【参考方案2】:

我最近遇到了同样的问题。我有一个带有访问点的 EFS,它允许 755 访问 1001:1001 (ec2-user)。

通过 AP 安装和访问工作正常,但我在使用卷并将它们安装在 ECS 中时遇到了同样的错误。

最后,对我来说快速简单的解决方法是将 root 权限 ("elasticfilesystem:ClientRootAccess") 添加到文件系统策略中。

【讨论】:

以上是关于将 EFS 接入点挂载到 ECS 卷时出现问题的主要内容,如果未能解决你的问题,请参考以下文章

ECS CLI - 启动容器实例时挂载 EFS

我们可以在 AWS ECS docker 容器上挂载 EFS 吗?

ECS 中的 EFS 挂载“无法解决”

EFS 卷绑定在 ECS 任务定义的每个“terraform apply”上自动分离/重新附加

用于挂载EFS存储的ECS容器实例的引导用户数据

ECS Fargate 上的 EFS 挂载 - 非 root 用户的读/写权限被拒绝