最新 追記

雑記帳


2014-11-11 (Tue) [長年日記]

[AWS] AWS CLI 1.6.0にWaitersが追加された

re:Invent 2014に合わせてなのかどうかは分かりませんが、AWS CLI 1.6.0がリリースされた。リリースノートによると、Waitersが追加されたようだ。

AWSのAPIのうちの幾つかは、APIのリクエストをした作業が非同期になっており、処理が完了しなくてもAPIが完了するものがある。EC2の起動や停止などがそれで、StartInstances APIの実行が完了しても、EC2自体の起動は完了していない状態になる。EC2の起動が完了したかどうかは、DescribeInstences APIを呼んで、EC2のStateを確認しなければならない。

Waitersは、その状態チェックを自動的に行なって、処理が完了するまで待つというものだ。

では、早速試してみよう。まずは、EC2の状態を確認する。

% aws --profile iret ec2 describe-instances --instance-ids i-a9db8db0 --query 'Reservations[].Instances[].State'
[
    {
        "Code": 80,
        "Name": "stopped"
    }
]

今は停止していることが分かる。では、インスタンスを起動しつつ、waiterで待ってみよう。

% {aws ec2 start-instaneces --instance-ids i-a9db8db0; aws ec2 wait instance-running --instance-ids i-a9db8db0;}
{
    "StartingInstances": [
        {
            "InstanceId": "i-a9db8db0",
            "CurrentState": {
                "Code": 0,
                "Name": "pending"
            },
            "PreviousState": {
                "Code": 80,
                "Name": "stopped"
            }
        }
    ]
}

ここでは、コマンドを続けて実行している。まず最初に、start-instancesを実行して、その結果がすぐに返ってきている。その後のwaitコマンドが完了していないので、プロンプトは返ってきていない。

表現しづらいのだが、"aws ec2 wait instance-running"は、対象となるインスタンスのStateを確認して、Runningになるのを待っている。状態の変化が確認できたら、コマンドの実行が完了し、プロンプトが復帰する。

その直後に、instanceの状態を確認すると、runningになっていることが分かる。

% aws ec2 describe-instances --instance-ids i-a9db8db0 --query 'Reservations[].Instances[].State'
[
    {
        "Code": 16,
        "Name": "running"
    }
]

シェルスクリプトなどで、EC2を起動した後に、そのEC2に対して処理を継続する、という処理をする場合に、これまでは自分でループを作ってDescribeInstancesを実行するという処理を書いていたが、Waitersを使うことで、同じ処理を容易に実装することができるようになった。

ところで、waiterの実行が完了した後、標準出力には特になにも出力されないのだが、OSXの場合は、AppleScriptを使って、通知を出すことができる。下記のように、waitコマンドに続けて、osascriptを実行すればよい。

% {aws ec2 start-instances --instance-ids i-a9db8db0; \
aws ec2 wait instance-running --instance-ids i-a9db8db0; \
echo 'display notification "instance i-a9db8db0 running now" with title "EC2 Notification"' | osascript}

これを実行すると、waitが完了した後に、下記のように通知が表示される。

ec2の場合、instance-runningの他にも、下記のものが利用できる。

  • bundle-task-complete
  • conversion-task-cancelled
  • conversion-task-completed
  • conversion-task-deleted
  • customer-gateway-available
  • export-task-cancelled
  • export-task-completed
  • instance-running
  • instance-stopped
  • instance-terminated
  • snapshot-completed
  • subnet-available
  • volume-available
  • volume-deleted
  • volume-in-use
  • vpc-available
  • vpn-connection-available
  • vpn-connection-deleted

snapshot-completedは、かなり使い勝手が良いのではないだろうか。他にも、サービスごとに用意されている。aws <service> wait helpで確認できる。