AWS CDK跨帐户Lambda部署权限问题

时间:2020-04-05 17:22:09

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

我按照以下教程使用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堆栈公开了部署操作角色,如下所示:

    导出类LambdaStack扩展了cdk.Stack { 公共只读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或进行部署时,出现错误消息,

➜  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配置文件的方式?

谢谢, 嘉盛

3 个答案:

答案 0 :(得分:0)

只需尝试使用环境变量来使用: 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

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

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

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