【问题标题】:Using CodePipeline to Deploy ElasticBeanstalk application in another AWS account使用 CodePipeline 在另一个 AWS 账户中部署 ElasticBeanstalk 应用程序
【发布时间】:2020-09-15 15:30:26
【问题描述】:
我们为每个环境设置了不同的 AWS 账户(dev、test、prod),然后是一个共享构建账户,该账户有一个AWS CodePipeline,通过担任角色部署到这些环境中的每一个在dev、test、prod。
这适用于我们使用 Codebuild 脚本的无服务器应用程序。
我们可以为使用部署操作提供程序的Elastic Beanstalk 应用程序做类似的事情吗?或者Elastic Beanstalk的最佳方法是什么
【问题讨论】:
标签:
amazon-elastic-beanstalk
aws-codepipeline
【解决方案1】:
我们通过使用在每个 stage 帐户(dev、test、prod)中指定的 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/)
【解决方案3】:
我们最终使用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 工具