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

时间:2020-05-28 10:35:34

标签: amazon-elastic-beanstalk aws-codepipeline

我们为每个环境(devtestprod)设置了不同的AWS账户,然后有一个共享构建账户,其中有一个AWS CodePipeline可以部署到通过在devtestprod中扮演角色来实现每个环境。

这对于使用Codebuild脚本的无服务器应用程序来说效果很好。

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

的最佳方法是什么

3 个答案:

答案 0 :(得分:0)

我们通过使用每个 stage 帐户(devtestprod)中指定的CodeBuild作业来完成此任务,该作业使用AWS CLI来将CodePipeline工件(在构建作业的环境变量中以CODEBUILD_SOURCE_VERSION形式)部署到Elastic Beanstalk。我们在共享构建帐户中将此工作作为CodePipeline的一部分运行。

以下是CodeBuild deploy 作业运行的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/

答案 1 :(得分:0)

我发现了使用aws cdk将应用程序跨帐户部署到另一个AWS帐户中的Elastic beantalk的解决方案。

由于aws cdk尚未部署到弹性beantalk动作功能,因此我们必须通过实现IAction接口手动实现它

您可以在我的git repo中找到完整的CDK应用程序

https://github.com/dhirajkhodade/CDKDotNetWebAppEbPipeline

答案 2 :(得分:0)

我们最终使用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工具