python - 等待在 AWS Boto3 中为 Elasticbeanstalk 完成应用程序版本创建,然后再创建环境
问题描述
我正在创建一个脚本来快速自动地在 AWS Elasticbeanstalk 应用程序中进行一些基本管理。您可以在https://github.com/danilogsilva/smarteb上查看,标签为 1.0.2-dev2,这是我写这篇文章时的版本。
要部署一个全新的环境,首先需要创建一个应用程序版本,然后再创建环境。
执行此操作的脚本部分是:
boto3client = boto3.client('elasticbeanstalk')
boto3client.create_application_version(
ApplicationName=name,
VersionLabel=versionAppName,
SourceBundle={
'S3Bucket': 'elasticbeanstalk-us-east-1-' + userId,
'S3Key': name + '/' + versionAppName + '.zip'
},
Process=True,
)
boto3client.create_environment(
ApplicationName=name,
EnvironmentName=ebLocalConfigurator.getEnvironment(),
SolutionStackName="64bit Amazon Linux 2 v3.1.1 running PHP 7.4",
OptionSettings=[
{
'Namespace': 'aws:autoscaling:launchconfiguration',
'OptionName': 'IamInstanceProfile',
'Value': 'aws-elasticbeanstalk-ec2-role'
},
],
VersionLabel=versionAppName
)
如果我紧接着一个命令,我会收到一条异常消息:
botocore.exceptions.ClientError: An error occurred (InvalidParameterValue) when calling the CreateEnvironment operation: The application version version1 is processing. When the processing is complete, try launching the environment again.
然后我想知道等待处理结束是否需要时间。所以我在两个命令之间等待了 5 秒。一切都很完美!
但在我看来,这不是一个好的解决方案。可能需要 5 秒才能做好准备。或者更糟糕的是,可能某些 AWS 内部流程出现波动,有时应用程序版本创建可能需要 5 秒以上,导致脚本异常中断。
理想的解决方案是,如果 boto3 提供某种方式等待应用程序版本创建完成,然后触发环境创建。然后用户将在最佳时间等待:一旦前一个和相关进程完成,就会触发事情,并且还可以保护应用程序免受时间波动的影响。
有没有办法在 boto3 中触发一个命令,然后等待它结束,然后再触发下一个?
解决方案
遗憾的是,boto3 没有为这个特定的 API 调用提供服务员。唯一可用的服务员是:
- ElasticBeanstalk.Waiter.EnvironmentExists
- ElasticBeanstalk.Waiter.EnvironmentTerminated
- ElasticBeanstalk.Waiter.EnvironmentUpdated
因此,您必须为此设计自己的服务员。它可以是while
python 中的基本循环的形式,它每 5 秒检查一次应用程序版本的状态,直到它准备好。
推荐阅读
- ruby-on-rails - 通过 docker-compose run web rails g 生成的文件不会创建
- c - 你如何在make中链接两个文件,它们都包含不同的库?
- mongodb - 通过logstash将数据从mongodb同步到elasticsearch
- rpa - 使用机器人企业框架的 Framework/GetAppCredential.xaml 使用问题
- r - 如何使用 ggplot 在 GAM 中获得预测值
- python - 未保存事件中心检查点数据
- elasticsearch - 带有附加 preserveOriginal 参数的 lucene DictionaryCompoundWordTokenFilter
- geospatial - 地理空间查找返回错误结果
- python - 尝试中的Python while循环除了指令
- ruby - 根据传入的请求类型将请求路由到 Rails 关注点