【问题标题】:How to clone an AWS EB environment across platform branches如何跨平台分支克隆 AWS EB 环境
【发布时间】:2021-10-26 23:53:01
【问题描述】:

背景

我们的 AWS Elastic Beanstalk 环境运行最新版本的预配置“Python 3.7 on 64-bit Amazon Linux 2”平台分支,有很多自定义配置和环境属性。

现在我们想将此环境切换到“Python 3.8 on 64-bit Amazon Linux 2”平台分支

基本上,目标是克隆环境,保留当前配置(平台分支和版本除外)和环境属性。

问题

很遗憾,当cloning时,无法在不同平台分支之间切换(我们只能在平台版本内切换同一平台分支)。

documentation suggests 此处需要蓝/绿部署。但是,蓝/绿部署涉及从头开始创建新环境,因此我们仍然需要其他方式来复制我们的配置设置和环境属性。

问题

将配置设置和/或环境属性从原始环境复制到新创建的环境中的推荐方法是什么?

我想我们可以使用eb config下载原始配置,修改环境名称、平台分支和版本等,然后在新环境上使用eb config --update。但是,这感觉就像是 hack。

【问题讨论】:

    标签: amazon-web-services amazon-elastic-beanstalk


    【解决方案1】:

    总结

    1. 保存当前配置:eb config save <env name>
    2. 使用文本编辑器修改保存的配置文件中的平台分支
    3. 根据修改后的配置文件创建新环境:eb create --cfg <config name>(添加--sample以使用示例应用程序)
    4. 如有必要,删除本地配置文件
    5. 如有必要,使用eb printenveb setenv 复制环境属性

    编辑:由于某种原因,保存的配置不包括所有安全组设置,因此可能需要使用 EB 控制台(配置->实例)手动检查这些设置。

    背景

    AWS 支持人员已确认使用eb config 是可行的方法,他们参考了在线文档了解详细信息。 不幸的是,eb clidocumentation 并未提供所有答案。

    以下内容基于我自己使用最新版本的 eb cli (3.20.2) 和 botocore 1.21.50 以及撰写本文时(2021 年 9 月 30 日)的文档。请注意,有一个 documentation repo on github,但它最后一次更新是六个月前,与最新的在线文档不匹配...

    eb 配置

    这是eb config docs的截图:

    确实,如果您调用eb config my-enveb config my-env --display,则不会显示环境属性。

    但是,这适用于eb config save:使用eb config save 创建的YAML 文件实际上确实包含environment properties*

    *请注意,如果您的环境属性包含机密(例如密码),这些最终也会出现在您保存的配置中,因此请确保您不要将它们提交给版本控制。

    此外,目前还可以使用eb config --update设置环境属性。

    这意味着我们应该能够一次性“复制”两个配置设置环境属性。

    编辑:经过一些测试,事实证明eb config save 并不总是获得完整的环境属性集:某些属性可能会被跳过。还不知道为什么……下面的第 5 步可能会在这些情况下有所帮助。

    演练

    不确定这是否是最好的方法,但这似乎对我有用:

    假设我们有一个名为 py37-env 的现有 EB 环境,其中包含许多自定义配置和属性,运行 Python 3.7 平台分支。

    “克隆”它的最简单方法如下:

    第一步:下载现有配置

    下载现有环境的配置:

    eb config save py37-env
    

    默认情况下,配置文件将在我们的项目目录中以.elasticbeanstalk/saved_configs/py37-env-sc.cfg.yml结尾。

    保存的配置文件可能如下所示(只是一个示例,另见environment manifest):

    EnvironmentConfigurationMetadata:
      Description: Configuration created from the EB CLI using "eb config save".
      DateCreated: '1632989892000'
      DateModified: '1632989892000'
    Platform:
      PlatformArn: arn:aws:elasticbeanstalk:eu-west-1::platform/Python 3.7 running on 64bit Amazon Linux 2/3.3.5
    OptionSettings:
      aws:elasticbeanstalk:application:environment:
        MY_ENVIRONMENT_PROPERTY: myvalue
      aws:elasticbeanstalk:command:
        BatchSize: '30'
        BatchSizeType: Percentage
      aws:elb:policies:
        ConnectionDrainingEnabled: true
      aws:elb:loadbalancer:
        CrossZone: true
      aws:elasticbeanstalk:environment:
        ServiceRole: aws-elasticbeanstalk-service-role
      aws:elasticbeanstalk:healthreporting:system:
        SystemType: enhanced
      aws:autoscaling:launchconfiguration:
        IamInstanceProfile: aws-elasticbeanstalk-ec2-role
        EC2KeyName: my-key
      aws:autoscaling:updatepolicy:rollingupdate:
        RollingUpdateType: Health
        RollingUpdateEnabled: true
    EnvironmentTier:
      Type: Standard
      Name: WebServer
    AWSConfigurationTemplateVersion: 1.1.0.0
    

    另请参阅文档中的list of available configuration options

    第二步:修改保存的配置

    我们只对Platform 感兴趣,因此在这里将3.8 替换为PlatformArn 值中的3.7 就足够了。

    如有必要,您可以使用例如eb platform list 获取有效平台名称的概览。

    第三步:根据修改后的配置文件新建环境

    eb create --cfg py37-env-sc
    

    这将部署最新的应用程序版本。使用--version <my version> 部署特定版本,或使用--sample 部署示例应用程序,如docs 中所述。

    这将自动在默认保存的配置文件夹.elasticbeanstalk/saved_configs/中查找文件。

    如果此时您收到ServiceErrorInvalidParameterValueError,请确保只传入文件名,即不带文件扩展名.cfg.yml 且不带文件夹。

    第四步:清理本地保存的配置文件

    以防万一您有任何秘密存储在环境属性中。

    第 5 步:复制环境属性的替代方法

    如果保存的配置文件中不包含环境属性,或者其中一些缺失,这里有另一种复制它们的方法(使用 bash)。 这可能不是最有效的实现,但我认为它有助于说明这种方法。为清楚起见,省略了错误处理。

    source_env="py37-env"  # or "$1"
    target_env="py38-env"  # or "$2"
    # get the properties from the source environment
    source_env_properties="$(eb printenv "$source_env")"
    # format the output so it can be used with `eb setenv`
    mapfile -t arg_array < <(echo "$source_env_properties" | grep "=" | sed -e 's/ =/=/g' -e 's/= /=/g' -e 's/^ *//g')
    # copy the properties to the target environment
    eb setenv -e "$target_env" "${arg_array[@]}"
    

    这样做的好处是它不会在本地文件中存储任何秘密。

    【讨论】:

      猜你喜欢
      • 2021-11-30
      • 2017-07-27
      • 2019-04-27
      • 1970-01-01
      • 2018-09-22
      • 2021-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多