AWS batch task使用了自定义镜像,在提作业后出现错误
具体错误是ResourceInitializationError: unable to pull secrets or registry auth: The task cannot pull registry auth from Amazon ECR: There is a connection issue between the task and Amazon ECR. Check your task network configuration. RequestError: send request failed caused by: Post "https://api.ecr.ap-northeast-2.amazonaws.com/": dial tcp 54.180.184.245:443: i/o timeout
错误信息表明:
- 任务无法从 Amazon ECR 拉取镜像或认证信息:The task cannot pull registry auth from Amazon ECR: There is a connection issue between the task and Amazon ECR。
- 网络请求失败:RequestError: send request failed caused by: Post "https://api.ecr.ap-northeast-2.amazonaws.com/": dial tcp 54.180.184.245:443: i/o timeout。
- 这表明任务尝试连接 ECR 的 API 端点(api.ecr.ap-northeast-2.amazonaws.com)时发生了超时,可能是网络配置或连接问题。
可能的根本原因包括:
- 任务的网络配置错误(例如 VPC、子网、安全组或路由表)。
- IAM 权限不足。
- ECR 端点无法访问(可能是 VPC 端点缺失或配置错误)。
- 网络超时或防火墙限制。
总结了下这个问题的排查思路
1. 检查任务的网络配置
子网:确保任务运行所在的子网能够访问公网(如果使用 NAT 网关或 Internet 网关)或私有 VPC 端点(如果配置了 ECR 的 VPC 端点)。
- 如果使用私有子网,确保有 NAT 网关或 VPC 端点连接到 ECR。
- 检查子网的路由表是否正确指向 NAT 网关或 VPC 端点。
安全组:任务的安全组需要允许出站流量到 ECR 的 HTTPS 端口(443)。
- 验证安全组规则是否允许出站 TCP 443 到 54.180.184.245(或更广泛的 ECR IP 范围)。
- 注意:ECR 的 IP 地址可能会变化,建议使用域名 api.ecr.ap-northeast-2.amazonaws.com 而不是硬编码 IP。
操作:
- 进入 AWS 控制台,检查 Batch 任务的 Compute Environment 和 Job Definition,确保使用的 VPC、子网和安全组配置正确。
- 运行 telnet api.ecr.ap-northeast-2.amazonaws.com 443(如果可以从任务环境访问)或类似命令,测试连接性。
2 验证 VPC 端点配置(如果适用)
如果你的任务运行在私有 VPC 中,且不使用 NAT 网关,则需要配置 Amazon ECR 的 VPC 端点(com.amazonaws.ap-northeast-2.ecr.api 和 com.amazonaws.ap-northeast-2.ecr.dkr)。
检查点:
- 是否已创建 ECR 的 VPC 端点?
- 端点是否关联到任务所在子网的路由表?
- 端点的安全组是否允许入站 HTTPS(443)流量?
- 如果未配置 VPC 端点,且子网无法访问公网,则任务无法连接 ECR。
操作:
- 在 VPC 控制台中,检查是否存在 ECR 的 VPC 端点。
- 如果没有,参考 AWS 文档创建端点并更新路由表。
3 检查 IAM 权限
- Batch 任务需要正确的 IAM 权限才能从 ECR 拉取镜像。
- 任务执行角色(Task Execution Role)需要以下权限:
{"Effect": "Allow","Action": ["ecr:GetAuthorizationToken","ecr:BatchCheckLayerAvailability","ecr:GetDownloadUrlForLayer","ecr:BatchGetImage"],"Resource": "*"
}
检查点:
- 任务使用的 IAM 角色是否正确配置?
- 是否将此角色绑定到 Batch 的 Job Definition
操作:
- 在 IAM 控制台中,检查任务执行角色的权限策略。
- 如果缺少权限,添加上述策略并保存。
4. 测试 ECR 连接性
根据文档建议,可以手动测试任务环境是否能访问 ECR。
- 在同一 VPC 和子网中启动一个临时的 EC2 实例,使用相同的 IAM 角色和安全组。
- 运行以下命令测试 ECR API 是否可达:
curl -v https://api.ecr.ap-northeast-2.amazonaws.com/
如果返回 i/o timeout 或无法连接,则说明网络配置有问题。
5 检查网络超时和防火墙
错误中的 i/o timeout 表明任务尝试连接 ECR 时超过了超时限制。
可能原因:
- NAT 网关或 Internet 网关故障。
- 公司防火墙或 VPC 网络 ACL(NACL)阻止了出站 443 流量。
操作:
- 检查 VPC 的 NACL,确保允许出站 443 流量。
- 如果使用 NAT 网关,确认其状态正常且有足够的带宽。
解决步骤总结
根据排查结果,采取以下措施:
- 修复网络配置:
- 如果子网无公网访问,配置 ECR VPC 端点。
- 确保安全组和路由表允许访问 api.ecr.ap-northeast-2.amazonaws.com:443。
- 更新 IAM 权限:
- 为任务执行角色添加必要的 ECR 权限。
- 测试连接:
- 使用临时实例验证 ECR API 可达性。
根据上面总结的步骤我排查了下
1, VPC 拥有igw,安全组允许所有流量的出站请求 (check)
2, 给执行角色添加相应权限
新增ecr-access-policy.json
{"Version": "2012-10-17","Statement": [{"Effect": "Allow","Action": ["ecr:GetAuthorizationToken","ecr:BatchCheckLayerAvailability","ecr:GetDownloadUrlForLayer","ecr:BatchGetImage"],"Resource": "*"}]
}
创建策略:
使用 AWS CLI 创建策略,保存为 ecr-access-policy.json
文件。
aws iam create-policy --policy-name ECRAccessPolicy --policy-document file://ecr-access-policy.json
返回
{
"Policy": {
"PolicyName": "ECRAccessPolicy",
"PolicyId": "ANPAQUOZSCFKMHPNMK23C",
"Arn": "arn:aws:iam::<account_id>:policy/ECRAccessPolicy",
"Path": "/",
"DefaultVersionId": "v1",
"AttachmentCount": 0,
"PermissionsBoundaryUsageCount": 0,
"IsAttachable": true,
"CreateDate": "2025-03-05T12:58:14+00:00",
"UpdateDate": "2025-03-05T12:58:14+00:00"
}
}
附加策略到角色:
使用以下命令将策略附加到 ecsTaskExecutionRole
角色
aws iam attach-role-policy --role-name ecsTaskExecutionRole --policy-arn arn:aws:iam::<YOUR_ACCOUNT_ID>:policy/ECRAccessPolicy
完成上述步骤后,您可以通过以下命令验证策略是否已成功附加:
aws iam list-attached-role-policies --role-name ecsTaskExecutionRole
关于配置 ECR VPC 端点, aws doc给出一篇参考文档
https://docs.aws.amazon.com/AmazonECS/latest/developerguide/verify-connectivity.html
服务 | 服务的 VPC 端点信息 |
---|---|
Amazon ECR | Amazon ECS 接口 VPC 端点(AWS PrivateLink) |
配置 VPC 连接 ECR 的步骤
1. 了解需求和前提条件
- 目标: 通过 VPC 端点私有访问 Amazon ECR,避免通过公共互联网。
- 需要的端点类型:
- 接口端点(Interface VPC Endpoint): 用于 ECR 的 Docker Registry API(如 docker push 和 docker pull)以及 ECR API(如 DescribeImages 和 CreateRepository)。
- 网关端点(Gateway VPC Endpoint): 用于访问 Amazon S3,因为 ECR 使用 S3 存储镜像层。
- 前提条件:
- 确保您的 VPC 已配置好子网和路由表。
- 确认您有权限创建 VPC 端点和管理相关资源。
2. 创建 ECR 接口端点
按照文档中的“创建接口端点”流程:
- 步骤:
- 登录 AWS 管理控制台,进入 VPC 控制台(https://console.aws.amazon.com/vpc/)。
- 在导航栏中选择 Endpoints(端点),然后点击 Create Endpoint(创建端点)。
- 在 Service Category(服务类别) 中选择 AWS services。
- 在 Service Name(服务名称) 中选择以下两种 ECR 服务(根据需要):
- com.amazonaws.<region>.ecr.dkr: 用于 Docker 客户端命令(推送和拉取镜像)。
- com.amazonaws.<region>.ecr.api: 用于 ECR API 调用。
- 替换 <region> 为您的 AWS 区域(例如 us-east-1)。
- 选择您的 VPC。
- 选择要关联的 子网(Subnets),建议为每个可用区选择一个子网。
- 启用私有 DNS 名称(Enable Private DNS Name):
- 勾选此选项(推荐),以便通过默认 DNS 名称(如 ecr.us-east-1.amazonaws.com)访问 ECR,无需手动指定端点 URL。
- 确保 VPC 已启用 DNS 主机名和 DNS 解析(在 VPC 设置中检查)。
- 为端点关联一个安全组(Security Group):
- 确保安全组允许入站 HTTPS 流量(端口 443),来源为 VPC 的 CIDR 范围。
- 点击 Create Endpoint(创建端点)。
- 注意:
- 创建两个接口端点,一个用于 ecr.dkr,一个用于 ecr.api,以支持完整功能。
- 如果不启用私有 DNS,需要在命令中显式指定端点 URL(例如 aws ecr --endpoint-url https://<vpc-endpoint-id>.api.ecr.<region>.vpce.amazonaws.com)
在 Amazon ECR(Elastic Container Registry)中,com.amazonaws.<region>.ecr.api 和 com.amazonaws.<region>.ecr.dkr 是两种不同的服务端点,用于支持 ECR 的不同功能。通过 VPC 端点(VPC Endpoints)配置时,这两个端点分别对应不同的用途。以下是它们的作用详细解释
1. com.amazonaws.ap-northeast-2.ecr.api
- 作用: 提供 Amazon ECR 的 API 操作接口。
- 用途:
- 用于与 ECR 的管理功能交互,例如通过 AWS CLI、SDK 或控制台执行的操作。
- 支持的操作包括:
- 创建或删除存储库(CreateRepository, DeleteRepository)。
- 列出镜像或描述镜像(DescribeImages, ListImages)。
- 设置存储库策略(SetRepositoryPolicy)。
- 获取授权令牌(GetAuthorizationToken),用于认证 Docker 客户端。
- 典型场景:
- 当您运行以下命令时,会使用此端点:
aws ecr describe-repositories --region ap-northeast-2 aws ecr get-login-password --region ap-northeast-2
- 当您运行以下命令时,会使用此端点:
- 连接方式:
- 通过 HTTPS(端口 443)访问。
- 如果配置了 VPC 接口端点,流量将通过私有网络路由到此服务,而不是公共互联网。
2. com.amazonaws.ap-northeast-2.ecr.dkr
- 作用: 提供 ECR 的 Docker Registry 接口。
- 用途:
- 用于 Docker 客户端与 ECR 交互,直接推送(docker push)或拉取(docker pull)容器镜像。
- 支持 Docker Registry HTTP API V2,负责处理镜像的 manifest 和层数据的传输。
- 典型场景:
- 当您运行以下命令时,会使用此端点:
docker pull xx.dkr.ecr.ap-northeast-2.amazonaws.com/test/batch:latest docker push xx.dkr.ecr.ap-northeast-2.amazonaws.com/test/batch:latest
- 在 ECS 或 EKS 中拉取镜像时,容器运行时也会调用此端点。
- 当您运行以下命令时,会使用此端点:
- 连接方式:
- 通过 HTTPS(端口 443)访问。
- 需要先通过 ecr.api 获取认证令牌(GetAuthorizationToken),然后才能访问 ecr.dkr。
不能连接ECR的问题解除,一个新的问题抛了出来
ResourceInitializationError: failed to validate logger args: The task cannot find the Amazon CloudWatch log group defined in the task definition. There is a connection issue between the task and Amazon CloudWatch. Check your network configuration. : signal: killed
同理配置一个vpc endpoint
com.amazonaws.ap-northeast-2.logs
再次运行成功