aws-lambda - AWS CDK 跨账户 Lambda 部署权限问题
问题描述
我按照以下教程使用 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 配置文件的方式?
谢谢, 卡松
解决方案
问题在于您的 AWS CLI 配置。您不能使用本机 CDK CLI 通过一个 CLI 命令在两个单独的帐户中部署资源。最近有一篇关于如何告诉 CDK 使用哪些凭据的博客文章,具体取决于堆栈环境参数: https ://aws.amazon.com/blogs/devops/cdk-credential-plugin/
我们使用它的方式是将堆栈部署到单独的帐户中,并使用多个 CLI 命令指定所需的配置文件。所有需要交换的参数(例如lambdaCode的位置)都通过环境变量传递。
推荐阅读
- swift - UINavigationController 在推送视图的左侧添加自动填充
- python-2.7 - Pass objects as arguments in keywords in robot framework
- sql - Checking existence of row with specific attributes in another table
- angular - Angular Libraries Monorepo:是否可以为每个库使用不同的版本?
- c# - 将非DLL文件复制到其他项目的所有输出目录
- ruby-on-rails - 在 Rails 应用程序中创建 html 标签包装器
- selenium - 流利的等待不忽略异常
- solr - Solr, cast an array of strings to an array of payloads
- python - 如何从 numpy 的数组中选择特定列的值最大的行?
- c++ - 为什么在这种情况下括号不能改变 C++ 运算符的优先级?