You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Jenkins结合AWS SAM:withAWS无法扮演IAM角色问题排查

问题:SAM Deploy在Jenkins流水线中报错无法假定IAM角色

流水线配置

使用SAM CLI自动生成的Hello World Jenkinsfile部署步骤如下:

steps {
    sh 'sam build --template ${SAM_TEMPLATE}'
    withAWS(
        credentials: env.PIPELINE_USER_CREDENTIAL_ID,
        region: env.TESTING_REGION,
        role: env.TESTING_PIPELINE_EXECUTION_ROLE,
        roleSessionName: 'deploying-feature') {
      sh '''
        sam deploy --stack-name $(echo ${BRANCH_NAME} | tr -cd '[a-zA-Z0-9-]') \\
          --capabilities CAPABILITY_IAM \\
          --region ${TESTING_REGION} \\
          --s3-bucket ${TESTING_ARTIFACTS_BUCKET} \\
          --no-fail-on-empty-changeset \\
          --role-arn ${TESTING_CLOUDFORMATION_EXECUTION_ROLE}
      '''
    }
  }
}

关键配置说明

  • PIPELINE_USER_CREDENTIAL_ID:Jenkins中存储的IAM用户访问密钥凭证,该IAM用户拥有扮演目标IAM角色的权限
  • TESTING_PIPELINE_EXECUTION_ROLE:已将上述IAM用户设为可信实体,且附加AdminAccess策略的IAM角色

报错信息

执行sam deploy时失败,报错内容:

File with same data already exists at a6dc4a9f480ec00ce6c24c290c1e5099.template, skipping upload
Error: Failed to create changeset for the stack: feature-001, An error occurred (ValidationError) when calling the CreateChangeSet operation: Role arn:aws:iam::xxx:role/myrole is invalid or cannot be assumed

已完成排查

  • 确认Jenkins存储的IAM访问密钥正确
  • 确认IAM用户已添加为TESTING_PIPELINE_EXECUTION_ROLE的可信实体
  • 确认TESTING_PIPELINE_EXECUTION_ROLE附加了AdminAccess策略

疑问

Jenkins部署在EC2实例上,是否需要配置实例配置文件?或使用withAWS插件时需调整角色的信任策略?


解决方案建议

1. 检查CloudFormation执行角色的信任策略

报错中提到的无法假定的角色是TESTING_CLOUDFORMATION_EXECUTION_ROLE(即报错里的myrole),而非TESTING_PIPELINE_EXECUTION_ROLE。你需要确保该CloudFormation角色的信任策略允许当前执行SAM Deploy的身份(也就是TESTING_PIPELINE_EXECUTION_ROLE)来假定它。

示例信任策略:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::xxx:role/TESTING_PIPELINE_EXECUTION_ROLE"
      },
      "Action": "sts:AssumeRole"
    }
  ]
}

2. 验证角色链的权限传递

你的流水线权限链是:Jenkins中的IAM用户 → 扮演TESTING_PIPELINE_EXECUTION_ROLE → 让CloudFormation扮演TESTING_CLOUDFORMATION_EXECUTION_ROLE。需确保:

  • IAM用户拥有sts:AssumeRole权限,目标为TESTING_PIPELINE_EXECUTION_ROLE
  • TESTING_PIPELINE_EXECUTION_ROLE拥有sts:AssumeRole权限,目标为TESTING_CLOUDFORMATION_EXECUTION_ROLE

3. 确认withAWS插件参数正确性

检查withAWS中的role参数是否为TESTING_PIPELINE_EXECUTION_ROLE的完整ARN,而非仅角色名。若环境变量仅存储角色名,可能导致插件无法正确识别角色。

4. 排查EC2实例配置文件影响

若Jenkins所在EC2实例配置了实例IAM角色,withAWS插件可能优先使用实例角色而非你指定的credentials。可尝试在withAWS中添加roleAccount参数,或明确禁用实例元数据使用,确保插件采用你提供的凭证。


内容的提问来源于stack exchange,提问作者Josh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.19 07:43:18