我正在尝试设置一个 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”,以确保合成嵌套堆栈模板。
我读过的其他堆栈溢出问题:
这个问题与手动编写的云形成模板中的拼写错误有关。我查看了生成的模板,嵌套堆栈名称已正确生成并由 cdk 引用。从本地终端部署 cdk 也可以工作,这进一步让我相信不存在拼写错误问题。我还将服务堆栈作为 prop 传递并调用 stackName 属性以避免访问模板时出现拼写错误。
如果您发现可能因拼写错误而出现访问问题,请告诉我,因为这仍然是最好的情况。
Codebuild 中 Codepipeline S3 存储桶访问被拒绝
此问题表示通过向 S3 存储桶上的 CMK 授予权限已解决此问题。我使用了代码管道Artifact作为“cdk Synth -> cloudformation templates”的源。我不知道此设置中使用了任何 KMS CMK。如果有一种方法可以指定工件的解密能力,也许会有帮助。
如果有一种方法可以获得有关 s3 的更详细错误消息:访问被拒绝状态,我们也将不胜感激。它甚至没有分享 s3 存储桶被拒绝的内容,我只是不得不假设。
感谢您的任何建议。
这方面有什么更新吗?我也有同样的问题。