AWS Cloudformation 角色无权对角色执行 AssumeRole

Posted

技术标签:

【中文标题】AWS Cloudformation 角色无权对角色执行 AssumeRole【英文标题】:AWS Cloudformation Role is not authorized to perform AssumeRole on Role 【发布时间】:2019-04-25 10:43:33 【问题描述】:

我正在尝试执行包含以下资源的 cloudformation 堆栈:

代码构建项目 代码管道管道 需要角色

在尝试执行堆栈时,它失败并出现以下错误:

arn:aws:iam::ACCOUNT_ID:role/CodePipelineRole 无权对角色 arn:aws:iam::ACCOUNT_ID:role/CodePipelineRole 执行 AssumeRole(服务:AWSCodePipeline;状态代码:400;错误代码:InvalidStructureException;请求 ID:7de2b1c6-a432-47e6-8208-2c0072ebaf4b)

我使用托管策略创建了角色,但我已经尝试使用普通策略,但它也不起作用。

这是角色政策:

CodePipelinePolicy:
Type: AWS::IAM::ManagedPolicy
Properties:
  Description: 'This policy grants permissions to a service role to enable Codepipeline to use multiple AWS Resources on the users behalf'
  Path: "/"
  PolicyDocument:
    Version: "2012-10-17"
    Statement:
      - Resource: "*"
        Effect: "Allow"
        Condition: 
        Action:
          - autoscaling:*
          - cloudwatch:*
          - cloudtrail:*
          - cloudformation:*
          - codebuild:*
          - codecommit:*
          - codedeploy:*
          - codepipeline:*
          - ec2:*
          - ecs:*
          - ecr:*
          - elasticbeanstalk:*
          - elasticloadbalancing:*
          - iam:*
          - lambda:*
          - logs:*
          - rds:*
          - s3:*
          - sns:*
          - ssm:*
          - sqs:*
          - kms:*

这就是角色

CodePipelineRole:
Type: "AWS::IAM::Role"
Properties:
  RoleName: !Sub $EnvironmentName-CodePipelineRole
  AssumeRolePolicyDocument:
    Version: '2012-10-17'
    Statement:
      - Action:
        - 'sts:AssumeRole'
        Effect: Allow
        Principal:
          Service:
          - codepipeline.amazonaws.com
  Path: /
  ManagedPolicyArns:
    - !Ref CodePipelinePolicy

最让我感兴趣的是,CodePipelineRole 似乎试图为自己承担角色。我不明白这里会发生什么。

当我将策略的操作设置为 * 时,它起作用了!我不知道可能缺少哪些权限。

谢谢

【问题讨论】:

您是否尝试为 CodePipeline 角色和 CloudFormation 或操作角色使用相同的角色?换一个角色试试,看看错误是否仍然存在。 你有没有想过这个问题?我也有同样的问题。 同样的问题,有答案了吗? 刚刚发生在我身上的代码管道。我最终等了几分钟,然后再次单击创建,它就成功了 也许您需要在Trust Relationships 标签上进行编辑,不确定。 【参考方案1】:

这与您创建的角色的信任关系有关,即 CodePipelineRole

    转到 IAM 中的角色

    选择信任关系选项卡...

    然后编辑信任关系以包含代码管道

      "Version": "2012-10-17",
      "Statement": [
        
          "Effect": "Allow",
          "Principal": 
            "Service": [
              "codepipeline.amazonaws.com"
            ]
          ,
          "Action": "sts:AssumeRole"
        
      ]
    ```
    

【讨论】:

【参考方案2】:

看起来,AWS 服务在幕后保留了某种角色缓存。如果您尝试创建角色、附加策略并按顺序创建新的 CodeBuild 项目,CodeBuild 将给出未经授权的错误,因为它找不到角色。这类似于在不存在的存储桶上收到禁止访问错误(而不是 404)。如果您将堆栈分为两个其他堆栈:首先创建角色,然后创建 CodeBuild,它可以工作。我不明白为什么 CLI 命令会立即生效。

【讨论】:

同样对我有用。分阶段创建资源似乎可以解决问题。【参考方案3】:

尝试将sts:AssumeRole 添加到操作列表中。

https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_roles.html

干杯

【讨论】:

【参考方案4】:

由于某种原因代码构建角色无法承担角色,我遇到了与 EKS 类似的问题。我通过创建一个具有足够访问权限的用户并通过设置解决了这个问题:

AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY

环境变量作为云构建中环境部分的默认环境变量:

https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html

【讨论】:

【参考方案5】:

我敢打赌,您在 CodePipeline 的 Source 操作中指定了 RoleArn。尝试删除它。

   CodePipelinePipeline:
      Type: AWS::CodePipeline::Pipeline
      Properties:
      ...
      Stages: 
        - Name: "Source"
          Actions: 
          - Name: "Source"
            #RoleArn: !GetAtt CodePipelineRole.Arn

在我的案例中,最后一行是同样错误的原因。

【讨论】:

以上是关于AWS Cloudformation 角色无权对角色执行 AssumeRole的主要内容,如果未能解决你的问题,请参考以下文章

AWS - 如何使用 CDK/CloudFormation 将服务链接角色传递给自动缩放组?

有没有办法使用 cloudformation 创建 aws lambda 执行角色?

在 Cloudformation 模板中为 AWS API Gateway 使用 IAM 角色

AWS CodePipeline 角色无权在阶段的“操作”块中对角色执行 AssumeRole

(具体资源)AWS Lambda:提供的执行角色无权调用EC2上的DescribeNetworkInterfaces

服务角色 arn:aws:iam::20011470201:role/deploy 无权执行以下操作:autoscaling:DescribeLifecycleHooks