为什么我无法在 Amazon ECS 任务上挂载 Amazon EFS 卷?
当我在我的 Amazon Elastic Container Service (Amazon ECS) 任务上挂载 Amazon Elastic File System (Amazon EFS) 卷时,收到错误。
简短描述
当您在 Amazon ECS 任务上挂载 Amazon EFS 卷时,以下设置中的错误配置可能会导致问题:
- EFS 文件系统
- 安全组和网络访问控制列表(网络 ACL)
- Amazon Virtual Private Cloud (Amazon VPC) 设置
- 当您的 Amazon EFS 卷与任务位于不同的 VPC 中时,跨越 VPC 设置
- AWS Identity and Access Management (IAM) 角色策略和权限
解决方法
确定问题的原因
使用 AWSSupport-TroubleshootECSTaskFailedToStart 运行手册来确定问题。您必须在您的 Amazon ECS 集群资源所在的 AWS 区域使用运行手册。另外,使用最近失败的任务的 ID。如果失败的任务是 Amazon ECS 服务的一部分,则使用服务中最近一次失败的任务。在自动化执行期间,失败任务必须在 ECS:DescribeTasks 中可见。默认情况下,已停止的 ECS 任务将在进入 Stopped(已停止)状态后的 1 小时内保持可见。
根据自动化的输出,使用以下任一手动故障排除步骤。
检查您的 EFS 文件系统、安全组和网络 ACL 配置
如果您错误地配置了 EFS 文件系统、安全组或网络 ACL,则会收到与以下示例类似的错误:
“ResourceInitializationError:未能调用 EFS utils 命令来设置 EFS 卷:stderr: b'mount.nfs4: 连接超时':EFS utils 命令执行失败;代码: 32”
-或-
“ResourceInitializationError:未能调用 EFS utils 命令来设置 EFS 卷:stderr: mount.nfs4: 对方重置连接:EFS utils 命令执行失败;代码: 32”
EFS 文件系统
确保您已创建 EFS 文件系统挂载目标,并且它们与您的任务在同一个可用区和子网中可用。
要检查装载目标的可用区,请完成以下步骤:
- 打开 Amazon EFS 控制台。
- 在导航窗格中,选择 File systems(文件系统)。
- 选择您的文件系统。
- 选择 Network(网络)以显示现有挂载目标及其网络配置的列表。
- 记下 Amazon EFS 文件系统挂载卷的子网的可用区。
- 打开 Amazon ECS 控制台。
- 在导航窗格中,选择 Clusters(集群)。
- 选择您的集群。
- 选择 Tasks(任务)选项卡。
- 选择您的任务 ID。
- 在 Configuration(配置)下,选择子网 ID。
**注意:**此操作会在 Amazon VPC 控制台的浏览器中打开新标签页。 - 检查子网的可用区以验证其是否与 Amazon EFS 文件系统可用区相匹配。如果 Amazon EFS 文件系统的可用区不匹配,请在正确的可用区中创建挂载目标。
安全组和网络 ACL
EFS 文件系统挂载目标安全组必须允许来自您的任务的 NFS 流量通过 TCP 在端口 2049 上传输。
要检查状态,请完成以下步骤:
- 打开 Amazon EFS 控制台。
- 在导航窗格中,选择 File systems(文件系统)。
- 选择要检查的文件系统。
- 选择 Network(网络)以显示现有挂载目标及其关联安全组的列表。检查入站规则,以确保其允许端口 2049 上来自任务 IP 地址的 TCP 流量。
- (可选)要修改关联的安全组,请选择 Manage(管理)。
最佳做法是根据您的连接来源限制端口 2049 的访问。如果所有客户端都在特定的子网内,请使用该子网的 IP 地址范围。如果所有客户端都在与 Amazon EFS 关联的 VPC 内,请使用 VPC CIDR。如果客户端来自远程网络,请使用与这些网络匹配的 IP 地址范围。
子网必须允许您的 Amazon EFS 文件系统和您的 Amazon ECS 任务之间的网络流量。
要检查网络流量配置,请完成以下步骤:
- 打开 Amazon VPC 控制台。
- 在导航窗格中,选择 Your VPCs(您的 VPC)。
- 选择您的 VPC。
- 在 Details(详细信息)下,对于 Main network ACL(主网络 ACL),选择您的 ID。
- 确保您的 VPC 中的入站和出站规则允许通过 TCP 从端口 2049 上的任务 IP 地址发出 NFS 流量。
检查您的 Amazon VPC 配置
如果您未正确配置 Amazon VPC,则会收到与以下示例类似的错误:
“ResourceInitializationError:未能调用 EFS utils 命令来设置 EFS 卷:stderr: 无法解析 ‘fs-abcdefgxyz.efs.us-east-1.amazonaws.com’ - 检查您的文件系统 ID 是否正确,并确保 VPC 有针对该文件系统 ID 的 EFS 挂载目标。”
激活 DNS 解析和主机名
您必须在 VPC 的动态主机配置协议 (DHCP) 选项集中激活 DNS 解析和 DNS 主机名。
**注意:**默认情况下,DNS 主机名处于禁用状态。
确保您的自定义 DNS 服务器可以解析您的卷的 DNS 名称
最佳做法是将 AmazonProvidedDNS 用于 VPC DHCP 选项集。如果您改用自定义 DNS 服务器,则必须在 DNS 服务器配置文件中配置条件 DNS 转发器。
包含以下设置:
- AWS 资源 (*.amazonaws.com) 的所有 DNS 查询都必须发送到 VPC 的默认 DNS 服务器。
- IP 地址必须是配置给您的 VPC 的主要私有 IPV4 CIDR 范围加上两个 (x.y.z.2) 或 169.254.169.253。例如,对于 CIDR 10.0.0.0/16,VPC 的默认 DNS 服务器 IP 地址为 10.0.0.2。
为与您的容器实例不同的 VPC 中的 Amazon EFS 卷配置设置
要从与容器实例不同的 VPC 挂载 Amazon EFS 卷,您必须在 VPC 之间创建 VPC 对等连接。或者,创建中转网关。然后,根据任务的运行位置使用以下解决方法步骤。
Amazon EC2 实例
对于在 Amazon Elastic Compute Cloud (Amazon EC2) 上运行的任务,请登录您的 EC2 实例,然后安装 botocore。
注意:efs-utils 使用 botocore 与其他 AWS 服务进行交互。有关安装步骤,请参阅 GitHub 网站上的 Install botocore。
只有 Amazon 在与 EFS 文件系统相同的 VPC 中提供的 DNS 服务才能解析 Amazon EFS DNS 名称。要在计算机的 /etc/hosts 文件中对 Amazon EFS 挂载的 IP 地址进行硬编码,请运行以下命令:
echo "mount-target-IP-address fs-id.efs.region.amazonaws.com" | sudo tee -a /etc/hosts
**注意:**将 mount-target-IP-address 替换为挂载目标 IP 地址,将 fs-id 替换为 EFS 文件系统 ID,将 region 替换为您的区域。VPC 之外的资源仍然无法解析 DNS 名称。
Fargate 任务
在以下解决方法中,VPC A 是您的 Amazon ECS 任务运行的 VPC 以及 Amazon EFS 客户端所在的 VPC。VPC B 是您的 Amazon EFS 卷的 VPC。该解决方法使用 Amazon Route 53 Resolver 不对数据进行硬编码。有关定价的信息,请参阅 Amazon Route 53 定价。
先决条件:
- VPC A 和 B 使用 Amazon 提供的 DNS 服务。或者,您的自定义 DNS 服务器在 DNS 服务器配置文件中使用条件 DNS 转发器。
- Amazon EFS 安全组入站规则允许通过 TCP 在 VPC A CIDR 端口 2049 上传输 NFS 流量。
如果您的任务在 AWS Fargate 上运行,请完成以下步骤:
- 在 VPC B 中创建 Route 53 入站端点并配置以下设置:
对于** region-name 区域中的 VPC,选择 VPC B。
对于此端点的安全组**,选择允许端口 53 上来自 VPC A 的入站 TCP 和 UDP 流量的安全组。
对于 IP 地址,创建两个 IP 地址。
**注意:**当您的服务器解析 DNS 名称时,它通常会返回与您的客户端位于同一可用区的挂载点的 IP 地址。当您使用此解决方法时,您的 DNS 查询源自入站端点。因此,入站端点的可用区决定返回的 IP 地址。
要返回 EFS 文件系统的单个 IP 地址,请配置单个挂载点。或者,将两个 IP 地址放在同一个可用区中。如果您选择不同的可用区,则 DNS 名称会根据转发您的查询的入站端点返回不同的 IP 地址。 - 在 VPC A 中创建 Route 53 出站端点并配置以下设置:
对于** region-name 区域中的 VPC,选择 VPC A。
对于此端点的安全组**,选择允许通过端口 53 流向 VPC B 的出站 TCP 和 UDP 流量的安全组。 - 创建 Route 53 Resolver 规则以将 Amazon EFS DNS 名称的 DNS 查询转发到 VPC B 中的 Amazon DNS。
配置以下设置:
对于域名,输入您的 EFS 文件系统的完整 DNS 名称,例如 fs-abcdef.efs.eu-west-1.amazonaws.com。
对于使用此规则的 VPC,选择 VPC A。
对于出站端点,选择 VPC A 中的出站端点。
对于目标 IP 地址,输入 VPC B 中 Route 53 入站端点的两个 IP 地址。 - 要验证您是否可以使用 DNS 名称挂载 Amazon EFS 卷,请从您的客户端运行以下命令:
sudo mount.efs fs-abcdefxyz /mnt
**注意:**将 region 替换为您的区域,将您的 fs-abdcexzy 替换为文件系统卷 ID。dig fs-abcdefxyz.efs.region.amazonaws.com
检查您的 IAM 角色策略和权限
如果您的 IAM 角色策略和权限存在问题,则会收到与以下示例类似的错误:
“ResourceInitializationError:未能调用 EFS utils 命令来设置 EFS 卷:stderr:b'mount.nfs4:挂载 127.0.0.1:/ 时服务器拒绝访问':EFS utils 命令执行失败;代码: 32”
-或-
“ResourceInitializationError:未能调用 EFS utils 命令来设置 EFS 卷:stderr:b'mount.nfs4:挂载 fs-xxx.efs.us-east-1.amazonaws.com:/dir 失败,服务器给出的原因如下: 没有此类文件或目录':EFS utils 命令执行不成功;代码: 32”
您在以下资源中定义的权限可能会控制对 EFS 文件系统的访问权限:
- Amazon ECS 任务角色 IAM 策略
- EFS 文件系统策略
- 分配给您的接入点的 POSIX 权限
- 网络 ACL 和安全组
**注意:**要检查您的网络 ACL 和安全组,请参阅 Security groups and network ACLs(安全组和网络 ACL)部分。
检查您的 Amazon ECS 任务权限
**注意:**要识别任务执行角色 ID,请检查任务定义 JSON 文件中的 executionRoleARN 值。有关如何访问 JSON 文件的详细信息,请参阅步骤 5: 创建任务定义。
确保 Amazon ECS 任务执行角色具有查找 Amazon EFS 文件系统并将其挂载到任务中所需的权限。
完成以下步骤:
- 打开 IAM 控制台。
- 在导航窗格中,选择 Roles(角色)。
- 在搜索栏中,输入任务执行角色的名称,然后选择任务执行角色。
- 选择 Permissions policies(权限策略)以展开所有附加的策略。确保该列表包含以下权限:
elasticfilesystem:ClientMount
elasticfilesystem:ClientWrite
elasticfilesystem:DescribeMountTargets
elasticfilesystem:DescribeFileSystems
要向任务执行角色添加权限,请完成以下步骤:
- 打开 IAM 控制台。
- 在导航窗格中,选择 Policies(策略)。
- 选择 Create policy(创建策略)。
- 对于 Service(服务),选择 EFS。
- 展开 Actions allowed(允许的操作)部分。
- 选择 ClientMount、ClientWrite、DescribeMountTargets 和 DescribeFileSystems 权限。
- 选择角色可以对其执行这些操作的资源,然后选择 Next(下一步)。
- 输入策略名称和描述,然后选择 Create policy(创建策略)。
- 在导航窗格中,选择 Roles(角色)。
- 在搜索栏中,输入任务执行角色的名称,然后选择任务执行角色。
- 选择 Add permissions(添加权限),然后选择 Attach policies(附加策略)。
- 选择您的新策略。
- 选择 Add permissions(添加权限)。
查看您的 EFS 文件系统策略
完成以下步骤:
-
打开 Amazon EFS 控制台。
-
选择 File systems(文件系统),然后选择您的文件系统。
-
确保您的文件系统策略允许任务执行角色挂载 EFS 卷。
策略示例:{ "Version": "2012-10-17", "Statement": [ { "Sid": "ECS Tasks - EFS Access", "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::account-id:role/ecs-task-execution-role-name" }, "Action": [ "elasticfilesystem:ClientMount", "elasticfilesystem:ClientWrite", "elasticfilesystem:DescribeMountTargets", "elasticfilesystem:DescribeFileSystems", ] } ] } -
要向您的策略添加更多 IAM 权限,请添加新的文件系统策略。或者,添加语句以允许您的客户端使用您的 Amazon EFS 卷修改现有策略。
检查您的 POSIX 权限
如果您[使用具有自定义根目录路径的接入点](https://docs.aws.amazon.com/efs/latest/ug/create-access-point.html),请确保您拥有 POSIX 用户和根目录创建权限。有关更多故障排除信息,请参阅使用接入点挂载失败。
相关信息
如何将 Amazon EFS 文件系统挂载到 Amazon ECS 容器上或 Fargate 上运行的任务中?
Developers guide to using Amazon EFS with Amazon ECS and AWS Fargate – part 2
- 语言
- 中文 (简体)
