案例4
题目
某公司使用AWS构建了一个机器学习训练管道,架构如下:通过CodePipeline触发CodeBuild构建Docker镜像并推送到ECR,然后由Step Functions调用SageMaker进行模型训练。近期管道执行时,在CodeBuild阶段报错“无法将镜像推送到ECR存储库”,且SageMaker训练任务提示“权限不足”。以下是关键配置信息,请排查并解决问题。
相关配置信息
-
CodePipeline配置
- 管道阶段:
- 源阶段:监控CodeCommit存储库(代码包含Dockerfile)。
- 构建阶段:使用CodeBuild项目,指定的IAM角色为
codebuild - role。 - 执行阶段:通过Step Functions状态机调用SageMaker训练任务。
- 管道阶段:
-
CodeBuild项目配置
- 构建spec文件(buildspec.yml):
version: 0.2 phases: build: commands: - docker build -t my-model:latest . - aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 123456789012.dkr.ecr.us-east-1.amazonaws.com - docker tag my-model:latest 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-ecr-repo:latest - docker push 123456789012.dkr.ecr.us-east-1.amazonaws.com/my-ecr-repo:latest - CodeBuild角色
codebuild - role的策略:{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "codecommit:Get*", "Resource": "arn:aws:codecommit:us-east-1:123456789012:my-repo" }, { "Effect": "Allow", "Action": "s3:*", "Resource": "arn:aws:s3:::my-artifact-bucket/*" } ] }
- 构建spec文件(buildspec.yml):
-
ECR存储库配置
- 存储库名称:
my-ecr-repo,位于us-east-1区域,未启用公共访问。
- 存储库名称:
-
Step Functions状态机
- 调用SageMaker的API为
CreateTrainingJob,指定的IAM角色为stepfunctions - role,该角色策略仅包含基础的states:StartExecution权限。
- 调用SageMaker的API为
-
SageMaker训练任务配置
- 输入数据存储在S3桶
my-training-data-bucket中,输出模型存储在S3桶my-model-output-bucket中。
- 输入数据存储在S3桶
解题思路
1. 明确问题范围
- CodeBuild报错:无法推送镜像到ECR,说明CodeBuild角色缺少ECR相关权限。
- SageMaker权限不足:Step Functions调用SageMaker时,角色权限不足,无法访问S3数据或创建训练任务。
2. 排查CodeBuild权限问题
-
错误原因分析:
- CodeBuild需要向ECR推送镜像,必须具备
ecr:BatchCheckLayerAvailability、ecr:GetAuthorizationToken、ecr:PutImage等权限。 - 当前
codebuild - role的策略仅包含CodeCommit和S3权限,缺少ECR相关操作权限。
- CodeBuild需要向ECR推送镜像,必须具备
-
修正CodeBuild角色策略:
在codebuild - role中添加ECR权限:{ "Effect": "Allow", "Action": [ "ecr:GetAuthorizationToken", "ecr:BatchCheckLayerAvailability", "ecr:CompleteLayerUpload", "ecr:UploadLayerPart", "ecr:PutImage" ], "Resource": "arn:aws:ecr:us-east-1:123456789012:repository/my-ecr-repo" }
3. 排查SageMaker权限问题
-
错误原因分析:
- SageMaker训练任务需要以下权限:
- 读取输入数据S3桶(
my-training-data-bucket)的权限(s3:GetObject)。 - 写入输出模型S3桶(
my-model-output-bucket)的权限(s3:PutObject)。 - 创建训练任务的权限(
sagemaker:CreateTrainingJob)。
- 读取输入数据S3桶(
- 当前
stepfunctions - role仅包含states:StartExecution权限,缺少SageMaker和S3相关权限。
- SageMaker训练任务需要以下权限:
-
修正Step Functions角色策略:
为stepfunctions - role添加以下权限:{ "Effect": "Allow", "Action": [ "sagemaker:CreateTrainingJob", "sagemaker:DescribeTrainingJob", "s3:GetObject", "s3:PutObject" ], "Resource": [ "arn:aws:sagemaker:us-east-1:123456789012:training-job/*", "arn:aws:s3:::my-training-data-bucket/*", "arn:aws:s3:::my-model-output-bucket/*" ] }
4. 额外检查:ECR登录命令中的账户ID
- 问题发现:
CodeBuild的buildspec.yml中,ECR仓库URI为123456789012.dkr.ecr.us-east-1.amazonaws.com/my-ecr-repo,但需确保账户ID(123456789012)与实际AWS账户一致,否则会导致认证失败。 - 修正:
替换为当前账户的真实ID(可通过AWS控制台查看账户ID)。
5. 验证管道执行
- 重新触发CodePipeline,观察CodeBuild是否成功推送镜像到ECR:
- 检查CodeBuild日志,确认
docker push命令无权限错误。
- 检查CodeBuild日志,确认
- 检查Step Functions状态机是否成功启动SageMaker训练任务:
- 在SageMaker控制台查看训练任务状态,确认输入/输出S3路径可正常访问。
总结
核心问题是IAM角色权限缺失:
- CodeBuild角色缺少ECR操作权限,导致无法推送镜像。
- Step Functions角色缺少SageMaker和S3权限,导致训练任务启动失败。
通过为角色添加必要的权限策略,并确保资源ARN正确,即可恢复管道正常运行。AWS排错中,服务间的权限传递是最常见的问题,需严格按照“最小权限原则”配置角色策略,并通过CloudTrail日志或服务控制台日志定位具体权限缺失的操作。

浙公网安备 33010602011771号