Amazon web services 无法在代码管道操作AWS CDK上由代码管道承担角色

Amazon web services 无法在代码管道操作AWS CDK上由代码管道承担角色,amazon-web-services,amazon-iam,aws-codepipeline,aws-cdk,Amazon Web Services,Amazon Iam,Aws Codepipeline,Aws Cdk,我一直在玩AWS CDK,并正在我的AWS教育帐户上构建代码管道堆栈。我使用的用户有足够的权限访问和使用代码管道。我的问题是,AWS CDK为代码管道操作生成一个角色,该操作的原则是根帐户的ARN。因此,它没有在根帐户上执行该角色的权限 行动代码: { 舞台名称:“建造”, 行动:[ 新建codepipelineActions.CodeBuildAction( { actionName:“构建”, 输入:sourceOutput, 项目:建筑商 } ) ] } Cloudformation模板

我一直在玩AWS CDK,并正在我的
AWS教育帐户上构建代码管道堆栈
。我使用的用户有足够的权限访问和使用代码管道。我的问题是,AWS CDK为
代码管道操作生成一个角色,该操作的
原则是根帐户的
ARN
。因此,它没有在根帐户上执行该角色的权限

行动代码:

{
舞台名称:“建造”,
行动:[
新建codepipelineActions.CodeBuildAction(
{
actionName:“构建”,
输入:sourceOutput,
项目:建筑商
}
)
]
}
Cloudformation模板输出:

"devPipelineBuildCodePipelineActionRole8696D056": {
      "Type": "AWS::IAM::Role",
      "Properties": {
        "AssumeRolePolicyDocument": {
          "Statement": [
            {
              "Action": "sts:AssumeRole",
              "Effect": "Allow",
              "Principal": {
                "AWS": {
                  "Fn::Join": [
                    "",
                    [
                      "arn:",
                      {
                        "Ref": "AWS::Partition"
                      },
                      ":iam::",
                      {
                        "Ref": "AWS::AccountId"
                      },
                      ":root"
                    ]
                  ]
                }
              }
            }
          ],
          "Version": "2012-10-17"
        }
      },
      "Metadata": {
        "aws:cdk:path": "PipeLineStack/dev-Pipeline/Build/Build/CodePipelineActionRole/Resource"
      }
    }
...
{
  "Actions": [
    {
      "ActionTypeId": {
        "Category": "Build",
        "Owner": "AWS",
        "Provider": "CodeBuild",
        "Version": "1"
      },
      "Configuration": {
        "ProjectName": {
          "Ref": "BuildAndTestB9A2F419"
        }
      },
      "InputArtifacts": [
        {
          "Name": "SourceOutput"
        }
      ],
      "Name": "Build",
      "RoleArn": {
        "Fn::GetAtt": [
          "devPipelineBuildCodePipelineActionRole8696D056",
          "Arn"
        ]
      },
      "RunOrder": 1
    }
  ],
    "Name": "Build"
}

这将抛出错误:

arn:aws:iam::acount_id:role/PipeLineStack-devPipelineRole5B29FEBC-1JK24J0K5N1UG is not authorized to perform AssumeRole on role arn:aws:iam::acount_id:
role/PipeLineStack-devPipelineBuildCodePipelineActionRo-17ETJU1KZCCNQ (Service: AWSCodePipeline; Status Code: 400; Error Code: InvalidStructureException; Req
uest ID: c8c8af89-2409-4cc1-aad8-4de553a1764f; Proxy: null)
如果我从
操作
中删除
角色学习
,并执行该模板,它就会工作


我的问题是,如何防止CDK使用根帐户或解决方法添加默认角色,以防止添加原则性的默认角色?

管道配置中的以下代码:

"RoleArn": {
        "Fn::GetAtt": [
          "devPipelineBuildCodePipelineActionRole8696D056",
          "Arn"
        ]
      },
。。。表示当CodePipeline服务调用“Build”操作时,它将“承担”角色“devPipelineBuildCodePipelineActionRole8696D056”,但此角色没有与“CodePipeline.amazonaws.com”服务的信任策略,因此出现错误

当您有跨帐户操作(CodeBuild项目位于另一个帐户中)时,该操作下的“RoleArn”属性非常有用,因此除非是这种情况,否则最好删除此属性

我们需要查看cdk代码来回答您的问题:

如何防止CDK使用根帐户或解决方法添加默认角色


目前,似乎不允许操作在AWS中扮演任何角色。因此,要有一个变通方法并消除手动开销,请使用来修改生成的云形成

管道的创建方式如下:

//要传递到管道的自定义角色
const pipeLineRole=新的iam.Role(这是“CodePipeLineRole”{
假设人:new iam.ServicePrincipal(“codepippeline.amazonaws.com”),
});
pipeLineRole.addToPolicy(
//要运行的每个aciton所需的策略
)
const pipeline=new codepippeline.pipeline(这个“管道”{
角色:pipeLineRole,
阶段:[
//  ...
{
行动:[行动1,行动2],
},
//  ...
],
});
//更改云结构以从操作中删除角色arn
const pipelineCfn=pipeline.node.defaultChild作为cdk.CfnResource;
//addDeletionOverride从cloudformation本身移除属性
//删除创建的每个阶段和动作的动作arn
pipelineCfn.addDeletionOverride(“Properties.Stages.1.Actions.0.RoleArn”);
pipelineCfn.addDeletionOverride(“Properties.Stages.2.Actions.0.RoleArn”);
pipelineCfn.addDeletionOverride(“Properties.Stages.3.Actions.0.RoleArn”);

这是一个解决方法,它可以工作,但是仍然有一些不需要的、悬而未决的策略和角色未分配给为单个操作创建的任何服务。

感谢您的解释。我在寻找是否有办法阻止CDK添加该行谢谢!生成的云形成无需任何修改即可工作