AWS EC2 waiterを使用してEC2起動まで待機する

今回はAWS EC2 waiterAPIを使用して、EC2起動まで待機する方法をご紹介します。

要望

AWS EC2の起動APIは非同期のため、コマンドを発行してもEC2の起動状況がわからないです。AWS EC2起動まで待機し、後続の処理を行う。

使い方

AWS CLIでもwaitのAPIがありますが、リクエストの発行間隔、回数など、コントロールできないので、今回boto3のwaiterの使い方をご紹介します。基本は同じです。AWS CLIに興味ある方はec2 wait apiをご参考ください。

boto3を利用する際に、まず以下のようにwaiterを取得する

waiter = client.get_waiter('instance_running')

今回利用するのは、起動までのwatierなので「instance_running」を利用します。

他にもいろんなステータスがあるので、以下のURLご参考いただければと思います。

Waiters

上記のページにもありますが、詳細の使い方は以下です。WaiterConfigを利用して、リクエスト間隔と最大試行回数も指定できます。

waiter.wait(
    Filters=[
        {
            'Name': 'string',
            'Values': [
                'string',
            ]
        },
    ],
    InstanceIds=[
        'string',
    ],
    DryRun=True|False,
    MaxResults=123,
    NextToken='string',
    WaiterConfig={
        'Delay': 123,
        'MaxAttempts': 123
    }
)

実際にコードを書いてみると、以下の感じとなります。

import boto3
import botocore

# get EC2 client
ec2_client = boto3.client("ec2")

# get EC2 waiter
ec2_waiter = ec2_client.get_waiter('instance_running')

# wait until EC2 running
try:
    ec2_waiter.wait(
        InstanceIds = ['i-xxxxxxxxxxxxxxxxxxxxxx'],
        WaiterConfig = {
            'Delay':5,
            'MaxAttempts':2
        }
)
except botocore.exceptions.WaiterError as error :
    print("Start EC2 Error", error)
else:
    print("Start EC2 END"

これで、EC2起動まで待機してくれます。

もし、EC2が起動されていない場合、異常が発生します。

もちろん、異常処理にEC2の再起動処理を行っても問題ないです。

筆者では、異常処理にEC2再起動処理とEC2待機まで処理を再実行する再帰関数を作って利用しています。

纏め

AWSのCLI、非同期の処理を多く、処理結果を確認するため、処理後にい結果確認の処理を入れたほうが良いと思います。

今回ではEC2起動処理を保証するため、waiter APIの利用方法をご紹介しました。皆さんもぜひ活用してください。

Last modified: 2021-04-11

Author