amazon-web-services - CDK Codepipeline CloudFormationCreateUpdateStackAction 仅在使用嵌套堆栈时获取 "S3: Access Denied"

标签 amazon-web-services aws-cloudformation aws-cdk aws-codepipeline aws-codebuild

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

    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: AccessDenied

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

如果我使用管理员凭据从终端运行“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 error: Access Denied when deploying CFN template with Nested Stacks

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

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

Codepipeline S3 Bucket access denied in Codebuild

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

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

感谢您的任何建议。

最佳答案

嘿,我遇到了同样的问题,并解决了这个问题(如果您或任何人仍然遇到这个问题)。

基本上,当您使用嵌套堆栈执行 cdk 合成时,父堆栈一旦合成,将引用包含子堆栈的 S3 对象(通常在 cdk-assets 存储桶中) 。然而,至少对于管道来说,问题是这些 Assets 永远不会上传到 S3。

这意味着当管道运行时,它会收到 s3:AccessDenied 错误,因为子堆栈父堆栈引用在该 cdk-assets 存储桶中不存在。

解决这个问题的方法是改变我的方法,我不使用 CloudFormationCreateUpdateStackAction,而是使用执行 CLI 命令来部署 cdk 的 CodeBuild 步骤。

关于amazon-web-services - CDK Codepipeline CloudFormationCreateUpdateStackAction 仅在使用嵌套堆栈时获取 "S3: Access Denied",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/72078267/

相关文章:

amazon-web-services - Terraform:将 CloudFormation 模板写入磁盘

python - 如何在Python AWS CDK中使用内部函数?

javascript - 在 AWS CDK 中使用 AWS 开发工具包的正确方法

python - 使用AWS CDK将入口规则添加到安全组

amazon-web-services - 在 AWS CodePipeline 中配置提交消息过滤器

amazon-web-services - 限制到 IP CIDR 范围的 S3 存储桶策略

aws-lambda - 间歇性 DynamoDB DAX 错误 : NoRouteException during cluster refresh

java - AWS 上的 Docker JVM CPU 限制

amazon-web-services - 如何在CloudFormation模板中同时使用Sub和GetAtt函数?

amazon-s3 - 带 Cloudformation 的非 jar 装 ACL S3 存储桶