我们为每个环境(dev
,test
,prod
)设置了不同的AWS账户,然后有一个共享构建账户,其中有一个AWS CodePipeline
可以部署到通过在dev
,test
,prod
中扮演角色来实现每个环境。
这对于使用Codebuild
脚本的无服务器应用程序来说效果很好。
我们可以为使用部署操作提供程序的Elastic Beanstalk
应用程序做类似的事情吗?或Elastic Beanstalk
答案 0 :(得分:0)
我们通过使用每个 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/)
答案 1 :(得分:0)
我发现了使用aws cdk将应用程序跨帐户部署到另一个AWS帐户中的Elastic beantalk的解决方案。
由于aws cdk尚未部署到弹性beantalk动作功能,因此我们必须通过实现IAction接口手动实现它
您可以在我的git repo中找到完整的CDK应用程序
答案 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工具