未经授权AWS Cloudformation Role对角色执行AssumeRole

时间:2018-11-22 18:00:18

标签: amazon-web-services amazon-cloudformation amazon-iam aws-codepipeline

我正在尝试执行一个包含以下资源的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试图将AssumeRole赋予自身。我不明白这里会发生什么。

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

谢谢

5 个答案:

答案 0 :(得分:1)

在后台,AWS服务似乎保留了某种角色缓存。如果您尝试扮演角色,附加策略并依次创建一个新的CodeBuild项目,则CodeBuild将出现未经授权的错误,因为它找不到该角色。这类似于在不存在的存储桶(而不是404)上获得禁止的访问错误。如果将堆栈分为两个其他堆栈:首先创建角色,然后创建CodeBuild,则它会起作用。我不明白为什么CLI命令会立即生效。

答案 1 :(得分:0)

尝试将sts:AssumeRole添加到“动作”列表中。

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

欢呼

答案 2 :(得分:0)

与您创建的角色(即CodePipelineRole)的信任关系有关

  1. 转到IAM中的角色
  2. 选择“信任关系”选项卡...
  3. 然后编辑信任关系以包含代码管道

    var requestContent = new PushStreamContent(async (outputStream, httpContext, transportContext) =>
    {
        await JsonSerializer.SerializeAsync(outputStream, item);
    });
    requestContent.Headers.ContentType = new MediaTypeHeaderValue("application/json");
    var response = await _client.PutAsync(path, requestContent);
    

答案 3 :(得分:0)

由于某些原因,代码构建角色无法担任角色,因此我对EKS也有类似的问题。我通过创建具有足够访问权限的用户并进行设置来解决了该问题:

AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY

env vars是云构建中环境部分中的默认env vars:

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

答案 4 :(得分:0)

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

document

最后一行是在我的例子中出现同样错误的原因。