首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何跨平台分支克隆AWS EB环境

如何跨平台分支克隆AWS EB环境
EN

Stack Overflow用户
提问于 2021-09-27 13:46:05
回答 1查看 866关注 0票数 2

背景

我们的AWS ElasticBean秸秆环境运行了预配置的"Python 3.7 on 64位Amazon 2“平台分支的最新版本,具有许多自定义配置和环境属性。

现在,我们想将这个环境切换到“64位Amazon 2上的PythonAmazon3.8”平台分支。

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

问题

不幸的是,当使用克隆时,不可能在不同的平台分支之间切换(我们只能在同一个平台分支内的平台版本之间切换)。

这里需要蓝色/绿色部署的文件显示。然而,蓝色/绿色部署涉及从头开始创建新环境,因此我们仍然需要一些其他方法来复制配置设置和环境属性。

问题

建议如何将配置设置和/或环境属性从原始环境复制到新创建的环境中?

我想我们可以使用eb配置下载原始配置,修改环境名称、平台分支和版本等,然后在新环境中使用eb config --update。然而,这感觉就像一次黑客攻击。

EN

回答 1

Stack Overflow用户

发布于 2021-09-30 11:30:36

摘要

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

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

背景

AWS支持已经证实使用eb config是可行的方法,他们查阅了在线文档以获得详细信息。不幸的是,文档eb cli并没有提供所有的答案。

以下是我自己的冒险经历,使用最新版本的eb cli (3.20.2)和botocore 1.21.50,以及编写本报告时的文档(2021年9月30日)。注意:有一个github上的文档回购,但它是六个月前更新的,与最新的在线文档不匹配.

eb配置

这是eb配置文档的截图

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

但是,这是而不是eb config save保存的:使用eb config save创建的YAML文件实际上是do包含*

*注意,如果您的环境属性包含秘密(例如密码),这些信息也会在您保存的信任中结束,所以请确保不要将这些秘密提交到版本控制中。

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

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

编辑:经过一些测试,eb config save并不总是得到完整的环境属性:有些属性可能被跳过。还不确定为什么..。在这些情况下,下面的步骤5可能会有所帮助。

穿行

不确定这是否是最好的方法,但以下是我认为可行的方法:

假设我们有一个名为py37-env的现有EB环境,具有大量的自定义配置和属性,运行Python3.7平台分支。

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

步骤1:下载现有配置

下载现有环境的配置:

代码语言:javascript
复制
eb config save py37-env

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

保存的配置文件可以如下所示(仅举一个例子,也请参见环境显化):

代码语言:javascript
复制
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

还请参阅文档中的可用配置选项列表

步骤2:修改保存的配置

我们只对Platform感兴趣,因此在这里用3.8代替PlatformArn值就足够了。

如果有必要,您可以使用例如eb platform list来获得有效平台名称的概述。

步骤3:基于修改后的配置文件创建新环境

代码语言:javascript
复制
eb create --cfg py37-env-sc

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

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

如果此时得到一个ServiceErrorInvalidParameterValueError,请确保只传递文件名,即没有文件扩展名.cfg.yml和文件夹。

步骤4:清理本地保存的配置文件

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

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

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

代码语言:javascript
复制
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[@]}"

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69347789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档