AWS CloudFormation角色未被授权在角色上执行AssumeRole操作。

18
我正在尝试执行包含以下资源的CloudFormation堆栈:
  • CodeBuild项目
  • CodePipeline管道
  • 所需角色
在尝试执行堆栈时,它失败并显示以下错误:

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试图对自己进行AssumeRole。我不明白这里可能发生了什么。

当我将策略的操作设置为*时,它可以正常工作!我不知道缺少哪些权限。

谢谢


你是否尝试将CodePipeline角色和CloudFormation或Action角色使用相同的角色?尝试使用不同的角色,看看错误是否仍然存在。 - TimB
你解决了这个问题吗?我也遇到了同样的问题。 - user4601931
这里也有同样的问题,已经有答案了吗? - David J Eddy
1
刚刚我在使用 CodePipeline 时也遇到了这个问题。我等了几分钟后再次点击“创建”,然后它就奇迹般地解决了。 - Frank
2
也许你需要在 Trust Relationships 标签页上进行编辑,不确定。 - Jordan
5个回答

10
这与您创建的角色即CodePipelineRole的信任关系有关。
  1. Go to the Role in IAM

  2. Select the Trust Relationships tab ...

  3. Then Edit Trust Relationship to include codepipeline

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

3

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


对我来说也是一样的。分阶段创建资源似乎起了作用。 - aydow

1

0

我打赌你在CodePipeline的源操作中指定了RoleArn。尝试将其删除。

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

在我的情况下,最后一行是导致同样错误的原因。


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接