【发布时间】: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