雑記帳
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で確認できる。