【发布时间】:2021-02-06 03:06:49
【问题描述】:
我正在创建一个脚本来快速自动地在 AWS Elasticbeanstalk 应用程序中进行一些基本管理。您可以查看https://github.com/danilocgsilva/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中触发一个命令,然后等待它结束再触发下一个?
【问题讨论】:
标签: python amazon-web-services cloud amazon-elastic-beanstalk boto3