使用 CodePipeline 在另一个 AWS 账户中部署 ElasticBeanstalk 应用程序

Using CodePipeline to Deploy ElasticBeanstalk application in another AWS account

我们为每个环境设置了不同的 AWS 账户(devtestprod),然后是一个共享构建账户,其中有一个 AWS CodePipeline通过在 devtestprod.

中担任角色来部署到每个环境中

这适用于我们使用 Codebuild 脚本的无服务器应用程序。

我们可以为使用部署操作提供程序的 Elastic Beanstalk 应用程序做类似的事情吗?或者 Elastic Beanstalk

的最佳方法是什么

我们通过使用在每个 stage 帐户(devtestprod)中指定的 CodeBuild 作业来执行此操作使用 AWS CLI 将 CodePipeline 工件(在构建作业的环境变量中作为 CODEBUILD_SOURCE_VERSION 提供)部署到 Elastic Beanstalk。我们 运行 此作业是我们共享构建帐户中 CodePipeline 的一部分。

这些是 CodeBuild deploy 作业 运行s:

的 AWS CLI 命令
aws elasticbeanstalk create-application-version --application-name ... --version-label ... --source-bundle S3Bucket="codepipeline-artifacts-us-east-1-123456789012",S3Key="application/deployable/XXXXXXX"
aws elasticbeanstalk update-environment --environment-name ... --version-label ...

您可以使用此处概述的策略从 CodePipeline 中的另一个帐户指定 CodeBuild 作业:https://docs.aws.amazon.com/codepipeline/latest/userguide/pipelines-create-cross-account.html。它涉及设置对用于 CodeBuild deploy 作业的 role_arn 的跨账户访问和管道的客户管理 KMS 密钥(具有跨账户访问策略)。

此方法的一个缺陷是,CodeBuild 部署作业将在部署开始后立即完成,而不像本机 CodePipeline EB 部署操作那样等到 ElasticBeanstalk 部署成功或失败。您应该能够在作业的循环中调用 aws elasticbeanstalk describe-environments 来复制此行为,但我还没有尝试过。 (这里的示例脚本:https://blog.cyplo.net/posts/2018/04/wait-for-beanstalk/

我找到了使用 aws cdk 将应用程序跨账户部署到另一个 aws 账户中的弹性 beanstalk 的解决方案。

由于 aws cdk 还没有部署到 elastic beanstalk 操作功能,所以我们必须通过实现 IAction 接口手动实现它

您可以在我的 git 存储库中找到完整的工作 CDK 应用程序

https://github.com/dhirajkhodade/CDKDotNetWebAppEbPipeline

我们最终使用 CodeBuild:

以这种方式解决了它
version: 0.2

phases:
  install:
    runtime-versions:
      python: 3.8
    commands:
      - pip install awsebcli --upgrade
  pre_build:
    commands:
      - CRED=`aws sts assume-role --role-arn $assume_role --role-session-name codebuild-deployment-$environment`
      - export AWS_ACCESS_KEY_ID=`node -pe 'JSON.parse(process.argv[1]).Credentials.AccessKeyId' "$CRED"`
      - export AWS_SECRET_ACCESS_KEY=`node -pe 'JSON.parse(process.argv[1]).Credentials.SecretAccessKey' "$CRED"`
      - export AWS_SESSION_TOKEN=`node -pe 'JSON.parse(process.argv[1]).Credentials.SessionToken' "$CRED"`
      - export AWS_EXPIRATION=`node -pe 'JSON.parse(process.argv[1]).Credentials.Expiration' "$CRED"`
      - echo $(aws sts get-caller-identity)
  build:
    commands:
      - eb --version
      - eb init <project-name> --platform "Node.js running on 64bit Amazon Linux" --region $AWS_DEFAULT_REGION
      - eb deploy

使用 aws-cli 承担我们需要的角色,然后使用 eb-cli 进行实际部署。不确定这是否是最好的方法,但它确实有效。我们正在考虑转向另一个更灵活的 CI/CD 工具