boto3 waitersのポーリング条件を変更する

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

AWSのAWS CLI/golang/python/rubyなどのSDKにはWaitersという機能が存在し、APIを実行後、指定した状態になるためポーリングする機能があります。

今回はPython SDK boto3のポーリング条件を変更する方法を紹介します。

  • より短い間隔でポーリングしたい
  • 処理が重いため、ポーリング数/間隔を増やさないと、ポーリング上限を超えて WaiterError エラーが発生する

というようなケースで有用かと思います。

Waiters の基本的な使い方

たとえば、Kinesisストリームを作成後、ストリームが ACTIVE になるまでポーリングする場合、次のようにします。

import boto3
client = boto3.client('kinesis')
NAME='Foo'

# Create Kinesis Stream
client.create_stream(
    StreamName=NAME,
    ShardCount=1
)

# Poll with Waiters
waiter.wait(StreamName=NAME)

ストリームがACTIVEになるまで waiter.wait はブロッキング状態になります。

Waiters 条件のカスタマイズ

Waiters オブジェクトを覗いてみましょう

$ ipython
In [1]: import boto3

In [2]: client = boto3.client('kinesis')

In [3]: waiter = client.get_waiter('stream_exists')

In [4]: waiter.config.__dict__
Out[4]:
{'_config': OrderedDict([(u'delay', 10),
              (u'operation', u'DescribeStream'),
              (u'maxAttempts', 18),
              (u'acceptors',
               [OrderedDict([(u'expected', u'ACTIVE'),
                             (u'matcher', u'path'),
                             (u'state', u'success'),
                             (u'argument',
                              u'StreamDescription.StreamStatus')])])]),
 'delay': 10,
 'description': '',
 'max_attempts': 18,
 'operation': u'DescribeStream'}

出力結果からわかるように Waiters では

  • ポーリング間隔(delay)
  • ポーリング回数(max_attempts)
  • ステータスチェック条件(_config)

などが設定されています。これらの値は、botocore モジュールで定義されています。 Kinesis であれば、次のファイルになります。

https://github.com/boto/botocore/blob/develop/botocore/data/kinesis/2013-12-02/waiters-2.json

これらの値は動的に書き換えられるため、書き換え後に wait を実行すれば目的を達成できます。

試しに、ポーリング間隔を変更してみましょう

## ポーリング間隔の値を確認
In [7]: waiter.config.delay
Out[7]: 10

## 書き換える
In [8]: waiter.config.delay=5

## 書き換え後の値を確認
In [9]: waiter.config.delay
Out[9]: 5

## ストリームを作成
In [12]: client.create_stream(
…
In [13]: waiter.wait(StreamName=NAME)
… 書き換え後の条件を元に Waiter が実行される

delay x max_attempts の秒数以内に期待の状態に遷移しなければ、WaiterErrorエラーでポーリングを抜けます。 ポーリング間隔を変更した時は、ポーリング数も調整してください。

まとめ

今回はAWS Python SDK(boto3)でWaiter機能のポーリング間隔を変更する方法をお伝えしました。 boto3のWaiterでスクリプトを組んで WaiterErrorエラーが発生した場合は、今回紹介した方法を参考にして下さい。

boto3/aws cli ともに低レイヤーをbotocoreで共有しており、内部的には botocore レイヤーで wait 条件を管理しています。 外部から環境変数などで書き換える口が用意されていないため、aws cliでは、アドホックにポーリング条件を変更できません。

aws cli でもデフォルト条件を書き換える口(環境変数、コマンドライン)が提供されると、便利になるのではないかと思います。

参照