首页 > 解决方案 > 等待在 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 中触发一个命令,然后等待它结束,然后再触发下一个?

标签: pythonamazon-web-servicescloudamazon-elastic-beanstalkboto3

解决方案


遗憾的是,boto3 没有为这个特定的 API 调用提供服务员。唯一可用的服务员是:

  • ElasticBeanstalk.Waiter.EnvironmentExists
  • ElasticBeanstalk.Waiter.EnvironmentTerminated
  • ElasticBeanstalk.Waiter.EnvironmentUpdated

因此,您必须为此设计自己的服务员。它可以是whilepython 中的基本循环的形式,它每 5 秒检查一次应用程序版本的状态,直到它准备好。


推荐阅读