使用 CodePipeline 在另一个 AWS 账户中部署 ElasticBeanstalk 应用程序
Using CodePipeline to Deploy ElasticBeanstalk application in another AWS account
我们为每个环境设置了不同的 AWS 账户(dev
、test
、prod
),然后是一个共享构建账户,其中有一个 AWS CodePipeline
通过在 dev
、test
、prod
.
中担任角色来部署到每个环境中
这适用于我们使用 Codebuild
脚本的无服务器应用程序。
我们可以为使用部署操作提供程序的 Elastic Beanstalk
应用程序做类似的事情吗?或者 Elastic Beanstalk
的最佳方法是什么
我们通过使用在每个 stage 帐户(dev
、test
、prod
)中指定的 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 应用程序
我们最终使用 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 工具
我们为每个环境设置了不同的 AWS 账户(dev
、test
、prod
),然后是一个共享构建账户,其中有一个 AWS CodePipeline
通过在 dev
、test
、prod
.
这适用于我们使用 Codebuild
脚本的无服务器应用程序。
我们可以为使用部署操作提供程序的 Elastic Beanstalk
应用程序做类似的事情吗?或者 Elastic Beanstalk
我们通过使用在每个 stage 帐户(dev
、test
、prod
)中指定的 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 应用程序
我们最终使用 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 工具