总结
- 保存当前配置:
eb config save <env name>
- 使用文本编辑器修改保存的配置文件中的平台分支
- 根据修改后的配置文件创建新环境:
eb create --cfg <config name>(添加--sample以使用示例应用程序)
- 如有必要,删除本地配置文件
- 如有必要,使用
eb printenv 和eb setenv 复制环境属性
编辑:由于某种原因,保存的配置不包括所有安全组设置,因此可能需要使用 EB 控制台(配置->实例)手动检查这些设置。
背景
AWS 支持人员已确认使用eb config 是可行的方法,他们参考了在线文档了解详细信息。
不幸的是,eb cli 的 documentation 并未提供所有答案。
以下内容基于我自己使用最新版本的 eb cli (3.20.2) 和 botocore 1.21.50 以及撰写本文时(2021 年 9 月 30 日)的文档。请注意,有一个 documentation repo on github,但它最后一次更新是六个月前,与最新的在线文档不匹配...
eb 配置
这是eb config docs的截图:
确实,如果您调用eb config my-env 或eb 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/中查找文件。
如果此时您收到ServiceError 或InvalidParameterValueError,请确保只传入文件名,即不带文件扩展名.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[@]}"
这样做的好处是它不会在本地文件中存储任何秘密。