背景
我们的AWS ElasticBean秸秆环境运行了预配置的"Python 3.7 on 64位Amazon 2“平台分支的最新版本,具有许多自定义配置和环境属性。
现在,我们想将这个环境切换到“64位Amazon 2上的PythonAmazon3.8”平台分支。
基本上,目标是克隆环境,保持当前配置(平台分支和版本除外)和环境属性。
问题
不幸的是,当使用克隆时,不可能在不同的平台分支之间切换(我们只能在同一个平台分支内的平台版本之间切换)。
这里需要蓝色/绿色部署的文件显示。然而,蓝色/绿色部署涉及从头开始创建新环境,因此我们仍然需要一些其他方法来复制配置设置和环境属性。
问题
建议如何将配置设置和/或环境属性从原始环境复制到新创建的环境中?
我想我们可以使用eb配置下载原始配置,修改环境名称、平台分支和版本等,然后在新环境中使用eb config --update。然而,这感觉就像一次黑客攻击。
发布于 2021-09-30 11:30:36
摘要
eb config save <env name>eb create --cfg <config name> (添加--sample以使用示例应用程序)eb printenv和eb 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-env或eb config my-env --display,则不会显示环境属性。
但是,这是而不是为eb config save保存的:使用eb config save创建的YAML文件实际上是do包含*。
*注意,如果您的环境属性包含秘密(例如密码),这些信息也会在您保存的信任中结束,所以请确保不要将这些秘密提交到版本控制中。
此外,目前还可以使用设置环境属性。
这意味着我们应该能够一次“复制”配置设置和环境属性。
编辑:经过一些测试,eb config save并不总是得到完整的环境属性:有些属性可能被跳过。还不确定为什么..。在这些情况下,下面的步骤5可能会有所帮助。
穿行
不确定这是否是最好的方法,但以下是我认为可行的方法:
假设我们有一个名为py37-env的现有EB环境,具有大量的自定义配置和属性,运行Python3.7平台分支。
最简单的“克隆”方法如下:
步骤1:下载现有配置
下载现有环境的配置:
eb config save py37-env默认情况下,配置文件将以.elasticbeanstalk/saved_configs/py37-env-sc.cfg.yml的形式在我们的项目目录中结束。
保存的配置文件可以如下所示(仅举一个例子,也请参见环境显化):
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:基于修改后的配置文件创建新环境
eb create --cfg py37-env-sc这将部署最新的应用程序版本。使用--version <my version>部署特定版本,或使用--sample部署示例应用程序,如文档中所述。
这将自动查找默认保存的配置文件夹.elasticbeanstalk/saved_configs/中的文件。
如果此时得到一个ServiceError或InvalidParameterValueError,请确保只传递文件名,即没有文件扩展名.cfg.yml和文件夹。
步骤4:清理本地保存的配置文件
以防万一环境属性中存储了任何秘密。
步骤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[@]}"这样做的好处是不将任何秘密存储在本地文件中。
https://stackoverflow.com/questions/69347789
复制相似问题