CDK 中 Code Pipeline 的跨账户访问

Cross Account access for Code Pipeline in CDK

我正在尝试使用 CDK 和 CodePipeline 设置跨帐户部署管道。

我从 AWS 文档构建了示例 CodePipeline 示例,并且能够使用 cdk 成功部署到单个帐户中。 (https://docs.aws.amazon.com/cdk/latest/guide/codepipeline_example.html)

$ cdk deploy PipelineDeployingLambdaStack --profile=111111111111

这returns成功了。

然后使用 cdk-codepipeline-actions 文档中的跨账户说明,我将 account 属性添加到我的部署操作中。 (https://docs.aws.amazon.com/cdk/api/latest/docs/aws-codepipeline-actions-readme.html#cross-account-actions)

        {
          stageName: 'Deploy',
          actions: [
            new codepipeline_actions.CloudFormationCreateUpdateStackAction({
              account: '222222222222',   // introduce cross-account deployment
              ......
            }),
          ],
        },

经过此更改并再次 运行ning cdk synth 后,它会按预期生成一个名为 cross-account-support-stack-222222222222.template.json 的新堆栈。

到目前为止一切顺利。

当我尝试 运行 cdk deploy 虽然它立即抛出跨帐户引用错误:

$ cdk deploy PipelineDeployingLambdaStack --profile=111111111111
Including dependency stacks: cross-account-support-stack-222222222222
cross-account-support-stack-222222222222 (PipelineDeployingLambdaStack-support-222222222222)
cross-account-support-stack-222222222222 (PipelineDeployingLambdaStack-support-222222222222): deploying...

 ❌  cross-account-support-stack-222222222222 (PipelineDeployingLambdaStack-support-222222222222) failed: Error: Need to perform AWS calls for account 222222222222, but the current credentials are for 111111111111.

我不明白这是怎么回事,因为我一次只能提供一组凭据。我找不到任何关于它的文档,这让我认为它应该是显而易见的。

我错过了什么?

关键在输出的那一行:

Including dependency stacks: cross-account-support-stack-222222222222

您可以在部署支持堆栈时使用-e / --exclusively命令行开关,然后是主CodePipeline堆栈,您可以使用--profile选项进行切换这些不同 cdk deploy 调用的凭据。

只是添加到@adam-ruka 的回答(因为解决方案最初对我来说并不清楚),这就是你如何从主堆栈中分离支持堆栈的部署:

# deploy cross-account support stack
cdk deploy cross-account-support-stack-222222222222 --profile=222222222222 -e

# deploy main stack
cdk deploy PipelineDeployingLambdaStack --profile=111111111111 -e

需要注意的重要事项(这让我感到困惑并增加了我的困惑)是您的堆栈环境是否正在使用 CDK CLI 环境变量隐式配置,例如

new PipelineDeployingLambdaStack (app, 'pipeline', { 
  env: { 
    account: process.env.CDK_DEFAULT_ACCOUNT, 
    region: process.env.CDK_DEFAULT_REGION 
}});

然后设置支持堆栈的命令将无法找到错误的堆栈:

No stacks match the name(s) cross-account-support-stack-222222222222

这是因为 CDK_DEFAULT_ACCOUNT 变成了 222222222222 而不是 111111111111。这里的解决方案是设置堆栈 the environment can be explicitly defined:

new PipelineDeployingLambdaStack (app, 'pipeline', { 
  env: { 
    account: process.env.CDK_DEPLOY_ACCOUNT || process.env.CDK_DEFAULT_ACCOUNT, 
    region: process.env.CDK_DEPLOY_REGION || process.env.CDK_DEFAULT_REGION 
}});

然后在CLI上传入账号:

CDK_DEPLOY_ACCOUNT=111111111111 cdk deploy cross-account-support-stack-222222222222 --profile=222222222222 -e