【问题标题】:Using CodePipeline to Deploy ElasticBeanstalk application in another AWS account使用 CodePipeline 在另一个 AWS 账户中部署 ElasticBeanstalk 应用程序
【发布时间】:2020-09-15 15:30:26
【问题描述】:

我们为每个环境设置了不同的 AWS 账户(devtestprod),然后是一个共享构建账户,该账户有一个AWS CodePipeline,通过担任角色部署到这些环境中的每一个在devtestprod

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

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

【问题讨论】:

  • 我也在尝试做同样的事情,但使用 AWS CDK,我还提出了付费 AWS 技术支持的票,他们回应说,到目前为止没有部署到弹性 beanstalk 代码部署操作可用。虽然我通过实现 IAction 接口让它在同一个 aws 账户中工作 - github.com/dhirajkhodade/CDKDotNetWebAppEbPipeline/blob/… 这可能有助于某人为跨账户实现相同

标签: amazon-elastic-beanstalk aws-codepipeline


【解决方案1】:

我们通过使用在每个 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/

【讨论】:

    【解决方案2】:

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

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

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

    https://github.com/dhirajkhodade/CDKDotNetWebAppEbPipeline

    【讨论】:

      【解决方案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 工具

      【讨论】:

        猜你喜欢
        • 2020-03-21
        • 2019-04-16
        • 2016-09-05
        • 2020-10-07
        • 2019-08-20
        • 2021-10-11
        • 1970-01-01
        • 2018-10-22
        • 2020-08-25
        相关资源
        最近更新 更多