CDK Codepipeline CloudFormationCreateUpdateStackAction 仅在使用嵌套堆栈时出现“S3:访问被拒绝”

问题描述 投票:0回答:1

我正在尝试设置一个 CDK Codepipeline 来更新 cdk 项目本身,该项目位于一个堆栈下,并且在构造函数中具有多个嵌套堆栈。管道位于第二个堆栈中,并传入服务堆栈来访问名称。在运行 cdk Synth 并使用 codebuild 将输出放入工件中后,我使用 CloudFormationCreateUpdateStackAction 来更新堆栈。

    pipeline.addStage({
      stageName: 'ServiceUpdate',
      actions: [
        new CloudFormationCreateUpdateStackAction({
          actionName: 'Service_Update',
          stackName: props.serviceStack.stackName,
          templatePath: cdkPipelineBuildOutput.atPath(
            `${props.serviceStack.stackName}.template.json`
          ),
          adminPermissions: true,
        }),
      ],
    });

如果堆栈为空,或者其中直接有一些资源,则可以更新堆栈,但是如果服务堆栈内有嵌套堆栈,我会得到

S3:拒绝访问

对于堆栈内的每个嵌套堆栈。

如果我使用管理员凭据从终端运行“cdk部署ExampleServiceStackName”,则嵌套堆栈将正确创建/更新,使我相信此处的codebuild或codepipeline的IAM角色存在问题。但我不知道从哪里开始,因为我已在 CloudFormationCreateUpdateStackAction 中将 adminPermissions 设置为 true。

我还通过在 CloudFormationCreateUpdateStackAction 和 CodePipeline 上调用 addToDeploymentRolePolicy 来手动设置管理员权限,并传递

    const policy = new PolicyStatement({
      resources: ['*'],
      actions: ['*'],
      effect: Effect.ALLOW,
    });

访问被拒绝错误没有变化。

我还确保在我的 ci 脚本中指定“cdk Synth --all”,以确保合成嵌套堆栈模板。

我读过的其他堆栈溢出问题:

S3 错误:使用嵌套堆栈部署 CFN 模板时访问被拒绝

这个问题与手动编写的云形成模板中的拼写错误有关。我查看了生成的模板,嵌套堆栈名称已正确生成并由 cdk 引用。从本地终端部署 cdk 也可以工作,这进一步让我相信不存在拼写错误问题。我还将服务堆栈作为 prop 传递并调用 stackName 属性以避免访问模板时出现拼写错误。

如果您发现可能因拼写错误而出现访问问题,请告诉我,因为这仍然是最好的情况。

Codebuild 中 Codepipeline S3 存储桶访问被拒绝

此问题表示通过向 S3 存储桶上的 CMK 授予权限已解决此问题。我使用了代码管道Artifact作为“cdk Synth -> cloudformation templates”的源。我不知道此设置中使用了任何 KMS CMK。如果有一种方法可以指定工件的解密能力,也许会有帮助。

如果有一种方法可以获得有关 s3 的更详细错误消息:访问被拒绝状态,我们也将不胜感激。它甚至没有分享 s3 存储桶被拒绝的内容,我只是不得不假设。

感谢您的任何建议。

amazon-web-services aws-cloudformation aws-cdk aws-codepipeline aws-codebuild
1个回答
0
投票

这方面有什么更新吗?我也有同样的问题。

© www.soinside.com 2019 - 2024. All rights reserved.