ちょっと話題の記事

AWS CLIのWaitersによる待ち受け処理を実装する

2014.11.11

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

ども、大瀧です。
今朝かたAWS CLIがアップデートされ、WaitersというAWSのオペレーション完了を待ち合わせる機能が追加されました。簡単な使い方をレポートします。

要件

Waitersは、AWS CLIのバージョン1.6.0以降でサポートされます。AWS CLIのバージョンが古い場合は、以下のコマンドでアップデートしましょう。

$ pip install --upgrade awscli
  :
$ aws --version
aws-cli/1.6.0 Python/2.7.8 Darwin/14.0.0
$

使い方

AWS CLIは、aws <サービス名> <サブコマンド>という形式でサービスごとのサブコマンドに分かれており、サービスによってWaitersのサポート状況が異なります。手元で確認したところ、以下でWaitersを実行するwaitサブコマンドが確認できました。

  • aws cloudfront
  • aws dynamodb
  • aws ec2
  • aws emr
  • aws rds
  • aws redshift
  • aws s3api
  • aws ses

以下の形式でコマンドを実行すると、コマンドで指定した状態になるまでコマンドの実行が待ち状態になります。

$ aws <サービス名> wait <状態名> --<状態のオプション>

どんな状態が確認できるかは、aws <サービス名> wait helpで確認できます。

$ aws ec2 wait help
WAIT()                                                                  WAIT()



NAME
       wait -

DESCRIPTION
       Wait until a particular condition is satisfied.

AVAILABLE COMMANDS
       o bundle-task-complete

       o conversion-task-cancelled

       o conversion-task-completed

       o conversion-task-deleted

       o customer-gateway-available

       o export-task-cancelled

       o export-task-completed

       o instance-running

       o instance-stopped

       o instance-terminated

       o snapshot-completed
(以下略、[q]でヘルプを抜ける)
$

では、EC2インスタンスの実行状態(instance-running)の待ち受け処理を、すでに実行しているインスタンスで試してみます。

$ aws ec2 wait instance-running --instance-ids i-XXXXXXX
$

すぐにコマンドが終了し、プロンプトが表示されました。インスタンスが[Stopped]など[Running]以外の状態だと待ち状態になるわけです。

利用例

割とシンプルな挙動なので、様々な用途に応用できそうです。もっとも簡単な組み合わせとしては、Waitersのコマンドラインを;で区切り、その後ろに異なるコマンドを記述して順次実行させる方法があります。

今回は「インスタンスが起動してから、ELBに追加する」という処理を以下のコマンドでやってみます。

$ aws ec2 wait instance-running --instance-ids i-XXXXXXXX; aws elb register-instances-with-load-balancer --load-balancer-name testlb --instances i-XXXXXXXX
(インスタンスがRunningになってから、以下が表示される)
INSTANCES	i-XXXXXXXX
$

停止状態のインスタンスをELBに登録してしまうと無駄にFailのカウントを積んでしまうことになるので、起動してからELBの配下に登録する方がスマートですよね。

まとめ

Waitersを利用したAWS CLIの待ち受け処理をご紹介しました。シェルスクリプトはもとより、様々なプロビジョニングツールからAWS CLIを呼び出すケースでも便利に活用できると思います。
実装直後のためなのか本機能はまだほとんどのドキュメントに載っていないので、コマンドのヘルプやときにはGitHubのソースを読み込んで情報を集めてくださいね。