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

Aws lambda AWS CDK跨帐户Lambda部署权限问题,aws-lambda,aws-codepipeline,aws-cdk,Aws Lambda,Aws Codepipeline,Aws Cdk,我按照以下教程使用CDK创建了一个Lambda部署管道。当我试着把所有的东西都放在同一个账户上时,效果很好。 但我的场景与示例略有不同,因为它涉及两个AWS帐户,而不是一个。我维护应用程序源代码和管道 在OPS帐户中,此管道将Lambda应用程序部署到UAT帐户 运营账户(12345678)-代码通信回购和代码管道 UAT账户(87654321)-Lambda应用程序 根据aws以下aws文档(跨帐户操作部分),我对源代码进行了以下更改。 Lambda堆栈公开部署操作角色,如下所示 导出类

我按照以下教程使用CDK创建了一个Lambda部署管道。当我试着把所有的东西都放在同一个账户上时,效果很好。

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

运营账户(12345678)-代码通信回购和代码管道 UAT账户(87654321)-Lambda应用程序

根据aws以下aws文档(跨帐户操作部分),我对源代码进行了以下更改。

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

    导出类LambdaStack扩展了cdk.Stack{ 公共只读部署操作角色: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',
         });
    }
    
    }

  • 在管道堆栈中

  • 下面是我如何启动堆栈的
  • AWS凭据配置文件看起来像
当我运行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配置文件的方式

谢谢,
Kasun

请尝试使用环境变量:
AWS\u访问\u密钥\u ID
AWS\u密码\u访问\u密钥
AWS\u默认\u地区

~/.aws/凭证

[default]
aws_access_key_id=****
aws_secret_access_key=****
~/.aws/config

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

它对我有用


我正在使用cdk版本
1.57.0

请尝试使用环境变量:
AWS\u访问\u密钥\u ID
AWS\u密码\u访问\u密钥
AWS\u默认\u地区

~/.aws/凭证

[default]
aws_access_key_id=****
aws_secret_access_key=****
~/.aws/config

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

它对我有用


我正在使用cdk版本
1.57.0

问题在于您的AWS CLI配置。不能使用一个CLI命令以本机方式使用CDK CLI在两个单独的帐户中部署资源。最近有一篇博客文章介绍了如何根据堆栈环境参数告诉CDK要使用哪些凭据:


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

问题在于AWS CLI配置。不能使用一个CLI命令以本机方式使用CDK CLI在两个单独的帐户中部署资源。最近有一篇博客文章介绍了如何根据堆栈环境参数告诉CDK要使用哪些凭据:


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

问题在于,您有多个帐户中存在的资源,因此创建这些资源需要不同的凭据。但是,CDK不了解如何从本机获取这些不同帐户的凭据,也不知道何时在不同凭据之间进行交换。解决此问题的一种方法是使用,这将允许您使用单个CDK deploy命令部署到多个不同的帐户


我在这里写了一篇详细的教程:

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


我在这里写了一篇详细的教程:

看看我在这里的答案:谢谢@AmitBaranesAmit,是的,我可以使用codebuild实现它,我需要在每个阶段构建二进制文件。然而,我试图在这里使用CFN操作,以便使用在构建阶段生成的CFN脚本。正如AWS示例所述。这是DeoOps管道的最佳实践。这就是为什么我试图以这种方式实现目标。但是现在看来我不得不回到代码构建的方法。嗨@Dilunika,我正在尝试实现与您描述的相同的工作流程。您找到解决这个问题的机会了吗?您好@quartaela,上面的问题是使用交叉账户政策解决的。看这个要点。您必须确保在角色中为相关帐户根正确设置了每个受信任的实体。然而,由于lambda代码存在依赖关系,所以管道仍然不能按照我的需要工作。(您会注意到在AWS示例中)。因此,我还无法发布完整的工作解决方案。请看我的回答:谢谢@AmitBaranesAmit,是的,我可以使用codebuild实现它,我需要在每个阶段构建二进制文件。然而,我试图在这里使用CFN操作,以便使用在构建阶段生成的CFN脚本。正如AWS示例所述。这是DeoOps管道的最佳实践。这就是为什么我试图以这种方式实现目标。但是现在看来我不得不回到代码构建的方法。嗨@Dilunika,我正在尝试实现与您描述的相同的工作流程。您找到解决这个问题的机会了吗?您好@quartaela,上面的问题是使用交叉账户政策解决的。看这个要点。您必须确保在角色中为相关帐户根正确设置了每个受信任的实体。然而,由于lambda代码存在依赖关系,所以管道仍然不能按照我的需要工作。(您会注意到在AWS示例中)。因此,我还无法发布完整的工作解决方案。我在此处编写了一个详细教程,介绍如何使用一个CLI命令执行跨帐户部署:我在此处编写了一个详细教程,介绍如何使用一个CLI命令执行跨帐户部署:
[default]
region=us-west-2
output=json