案例4

题目

某公司使用AWS构建了一个机器学习训练管道,架构如下:通过CodePipeline触发CodeBuild构建Docker镜像并推送到ECR,然后由Step Functions调用SageMaker进行模型训练。近期管道执行时,在CodeBuild阶段报错“无法将镜像推送到ECR存储库”,且SageMaker训练任务提示“权限不足”。以下是关键配置信息,请排查并解决问题。

相关配置信息

  1. CodePipeline配置

    • 管道阶段:
      1. 源阶段:监控CodeCommit存储库(代码包含Dockerfile)。
      2. 构建阶段:使用CodeBuild项目,指定的IAM角色为codebuild - role
      3. 执行阶段:通过Step Functions状态机调用SageMaker训练任务。
  2. 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/*"  
              }  
          ]  
      }  
      
  3. ECR存储库配置

    • 存储库名称:my-ecr-repo,位于us-east-1区域,未启用公共访问。
  4. Step Functions状态机

    • 调用SageMaker的API为CreateTrainingJob,指定的IAM角色为stepfunctions - role,该角色策略仅包含基础的states:StartExecution权限。
  5. SageMaker训练任务配置

    • 输入数据存储在S3桶my-training-data-bucket中,输出模型存储在S3桶my-model-output-bucket中。

解题思路

1. 明确问题范围

  • CodeBuild报错:无法推送镜像到ECR,说明CodeBuild角色缺少ECR相关权限。
  • SageMaker权限不足:Step Functions调用SageMaker时,角色权限不足,无法访问S3数据或创建训练任务。

2. 排查CodeBuild权限问题

  • 错误原因分析

    • CodeBuild需要向ECR推送镜像,必须具备ecr:BatchCheckLayerAvailabilityecr:GetAuthorizationTokenecr:PutImage等权限。
    • 当前codebuild - role的策略仅包含CodeCommit和S3权限,缺少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训练任务需要以下权限:
      1. 读取输入数据S3桶(my-training-data-bucket)的权限(s3:GetObject)。
      2. 写入输出模型S3桶(my-model-output-bucket)的权限(s3:PutObject)。
      3. 创建训练任务的权限(sagemaker:CreateTrainingJob)。
    • 当前stepfunctions - role仅包含states:StartExecution权限,缺少SageMaker和S3相关权限
  • 修正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命令无权限错误。
  • 检查Step Functions状态机是否成功启动SageMaker训练任务:
    • 在SageMaker控制台查看训练任务状态,确认输入/输出S3路径可正常访问。

总结

核心问题是IAM角色权限缺失

  1. CodeBuild角色缺少ECR操作权限,导致无法推送镜像。
  2. Step Functions角色缺少SageMaker和S3权限,导致训练任务启动失败。
    通过为角色添加必要的权限策略,并确保资源ARN正确,即可恢复管道正常运行。AWS排错中,服务间的权限传递是最常见的问题,需严格按照“最小权限原则”配置角色策略,并通过CloudTrail日志或服务控制台日志定位具体权限缺失的操作。
posted @ 2025-04-16 23:54  cat桑  阅读(80)  评论(0)    收藏  举报