【问题标题】:AWS CDK Cross Account Lambda Deployment Permission IssueAWS CDK 跨账户 Lambda 部署权限问题
【发布时间】:2020-07-17 16:02:21
【问题描述】:

我按照以下教程使用 CDK 创建了 Lambda 部署管道。当我尝试将所有内容保存在同一个帐户中时,它运行良好。 https://docs.aws.amazon.com/cdk/latest/guide/codepipeline_example.html

但我的场景与示例略有不同,因为它涉及两个 AWS 账户,而不是一个。我维护应用程序源代码和管道 在 OPS 账户中,此管道会将 Lambda 应用程序部署到 UAT 账户。

OPS 帐户 (12345678) - CodeCommit 存储库和 CodePipeline UAT 账户 (87654321) - Lambda 应用程序

根据 aws 以下 aws 文档(跨账户操作部分),我对源代码进行了以下更改。 https://docs.aws.amazon.com/cdk/api/latest/docs/aws-codepipeline-actions-readme.html

  • Lambda 堆栈公开部署操作角色如下

    export class LambdaStack extends cdk.Stack {
        public readonly deployActionRole: iam.Role;
    
        constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) {
            ...
    
            this.deployActionRole = new iam.Role(this, 'ActionRole', {
                assumedBy: new iam.AccountPrincipal('12345678'), //pipeline account
                // the role has to have a physical name set
                roleName: 'DeployActionRole',
            });
        }
    }
    
  • 在管道堆栈中,

    new codePipeline.Pipeline(this, 'MicroServicePipeline', {
        pipelineName: 'MicroServicePipeline',
        stages: [
          {
            stageName: 'Deploy',
            actions: [
                new codePipelineAction.CloudFormationCreateUpdateStackAction({
                  role: props.deployActionRole,
                  ....
                })
            ]
          }
        ]
    });
    
  • 以下是我启动堆栈的方式

    const app = new cdk.App();
    
    const opsEnv: cdk.Environment = {account: '12345678', region: 'ap-southeast-2'};
    const uatEnv: cdk.Environment = {account: '87654321', region: 'ap-southeast-2'};
    
    const lambdaStack = new LambdaStack(app, 'LambdaStack', {env: uatEnv});
    
    const lambdaCode = lambdaStack.lambdaCode;
    const deployActionRole = lambdaStack.deployActionRole;
    new MicroServicePipelineStack(app, 'MicroServicePipelineStack', {
        env: opsEnv,
        stackName: 'MicroServicePipelineStack',
        lambdaCode,
        deployActionRole
    });
    
    app.synth();
    
  • AWS 凭证配置文件看起来很喜欢

    [profile uatadmin]
    role_arn=arn:aws:iam::87654321:role/PigletUatAdminRole
    source_profile=opsadmin
    region=ap-southeast-2
    

当我运行 cdk diff 或 deploy 时,我收到一条错误消息,

➜  infra git:(master) ✗ cdk diff MicroServicePipelineStack --profile uatadmin
Including dependency stacks: LambdaStack
Stack LambdaStack
Need to perform AWS calls for account 87654321, but no credentials have been configured.

我在这里做错了什么?是我的 CDK 代码还是我配置 AWS 配置文件的方式?

谢谢, 卡松

【问题讨论】:

  • 在这里看看我的回答:stackoverflow.com/a/60064619/9931092
  • 谢谢@AmitBaranes
  • 阿米特,是的,我可以使用 codebuild 来实现它,我需要在每个阶段构建二进制文件。但是,我在这里尝试使用 CFN 操作,以便使用在 Build 阶段生成的 CFN 脚本。正如 AWS 示例所述。这是 DeoOps 管道的最佳实践。这就是为什么我试图以这种方式实现。但似乎我现在不得不退回到代码构建方法。
  • 嗨@Dilunika 我正在尝试实现与您描述的相同的工作流程。你找到解决这个问题的机会了吗?
  • 嗨@quartaela,上述问题已通过跨账户策略解决。请参阅此要点gist.github.com/dilunika/f1f095af7d30d5582ef0fe1bdbc63832。您必须确保每个受信任实体都正确设置在相关帐户根的角色中。但是,由于 lambda 代码存在依赖关系,因此管道仍然无法按我的需要工作。 (您会在 AWS 示例中注意到这一点)。所以,我还不能发布完整的工作解决方案。

标签: aws-lambda aws-codepipeline aws-cdk


【解决方案1】:

问题在于您的 AWS CLI 配置。您不能使用本机 CDK CLI 通过一个 CLI 命令在两个单独的帐户中部署资源。最近有一篇关于如何根据堆栈环境参数告诉 CDK 使用哪些凭据的博客文章: https://aws.amazon.com/blogs/devops/cdk-credential-plugin/

我们使用它的方式是将堆栈部署到单独的帐户中,并使用多个 CLI 命令指定所需的配置文件。所有需要交换的参数(例如 lambdaCode 的位置)都通过例如环境变量。

【讨论】:

【解决方案2】:

只需尝试使用环境变量: AWS_ACCESS_KEY_ID AWS_SECRET_ACCESS_KEY AWS_DEFAULT_REGION

https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-envvars.html

或者

~/.aws/credentials

[default]
aws_access_key_id=****
aws_secret_access_key=****

~/.aws/config

[default]
region=us-west-2
output=json

https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html

它对我有用。

我使用的是cdk版本1.57.0

【讨论】:

    【解决方案3】:

    问题在于您的资源存在于多个帐户中,因此创建这些资源需要不同的凭据。但是,CDK 本身并不了解如何获取这些不同帐户的凭据或何时在不同凭据之间进行交换。解决此问题的一种方法是使用 cdk-assume-role-credential-plugin,这将允许您使用单个 CDK 部署命令部署到许多不同的帐户。

    我这里写了详细教程:https://johntipper.org/aws-cdk-cross-account-deployments-with-cdk-pipelines-and-cdk-assume-role-credential-plugin/

    【讨论】:

      猜你喜欢
      • 2023-02-02
      • 2020-10-07
      • 2020-06-18
      • 1970-01-01
      • 1970-01-01
      • 2020-11-08
      • 1970-01-01
      • 2021-12-16
      • 2017-07-23
      相关资源
      最近更新 更多