当前位置: 首页 > 知识库问答 >
问题:

AWS CDK交叉帐户Lambda部署权限问题

李弘光
2023-03-14

我按照下面的教程使用CDK创建Lambda部署管道。当我试着把所有的东西都放在同一个账户里时,它会很好地运作。https://docs.aws.amazon.com/cdk/latest/guide/codePipeline_example.html

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

OPS帐户(12345678)-CodeCommit repo和CodePipeline UAT帐户(87654321)-Lambda应用程序

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

>

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

    导出类LambdaStack扩展了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配置文件的方式?

    谢谢,卡孙

  • 共有1个答案

    狄旻
    2023-03-14

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

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

     类似资料:
    • 我有一个lambda,它使用来自另一个AWS帐户的Athena的数据。因此,我有一个角色,我的lambda假定该角色具有跨帐户访问权限。我在lambda中使用了STS客户端。有时lambda运行得非常好,有时它会出现故障,给我这个错误。 “errorMessage”:“调用StartQueryExecution操作时发生错误(ExpiredTokenException):请求中包含的安全令牌已过期

    • 我已经使用Azure虚拟机好几个星期了:(Windows 10,Visual Studio Developer虚拟机),但几个小时都无法登录。 机器报告为正在运行,RDP找到机器并显示登录框,但登录失败:(您的凭据不起作用) 可以重新启动VM,但会发生相同的错误。启动诊断显示Windows 10“beach cave”映像 尝试重置密码会在事件日志中显示错误: 无法重置密码至少一个资源部署操作失败

    • 帐户A是我创建Kinesis流的应用程序帐户,我想在帐户B中创建Firehose来读取帐户A的Kinesis流。这可能吗?我尝试按照(https://medium.com/upday-devs/configure-kcl-to-read-from-a-dariffent-aws-account-16000b26e7ff)的步骤,在帐户A中创建了一个外部访问角色(例如'ARN:aws:iam::11

    • 我有两个AWS账户。帐户1有一个CloudSearch域,我需要从帐户2中的Lambda函数查询该域。我遵循了一个教程,在Account1中创建一个允许跨帐户访问的角色。 因此,在帐户1中,我有一个角色,如下所示: 此角色有一个受信任的实体,即帐户2,我可以在IAM控制台中该角色的受信任实体部分下看到正确的帐户ID。 在帐户2中,我创建了一个Lambda函数,其执行角色如下所示: 我的Lambda

    • 我正在尝试使用django-storages为带有服务帐户json文件的google云存储桶授予权限。但是,只有当我向所有具有对象视图权限的用户授予访问权限时,才能访问桶中的项目。我如何限制桶的公共访问。

    • 我有一个关于在Lambda函数中运行的跨帐户IAM问题。(我知道人们可能会使用STS,但这个软件包真的不值得保护,我不想通过链接帐户) 账户“一”。 账户“B” Lambda是只读的,但是我相信boto3不会将凭据写入~/. aws,如果我使用boto3.client(不是会话)。不过我也把AWS_CONFIG_FILE设为 /tmp以防万一。它仍然失败。我怀疑我的提议是不可能的,因为LAMBDA