AWS SDK for JavaでEC2インスタンスの起動を確認する
渡辺です。
EC2インスタンスの状態を確認するには、describeInstanceStatusを利用します。 一方、EC2インスタンスは、StatusとStateという似た異なる状態を持ちます。 このため、APIが解りにくいものとなっています。
今日はEC2インスタンスが起動状態であることを確認するためのコードを紹介します。
チェックする状態
マネジメントコンソールを確認すると、Instance StateとStatus Checksの2つの項目があります。
Instance Stateはstoppedやrunningなど、EC2インスタンスの状態を表します。 しかし、Instance Stateがrunningになっても、OSが利用可能な状態まで起動しているとは限りません。
Status ChecksはSystem StatusとInstance Statusの2つのStatusを表します。 System StatusはAWSシステムの状態を、Instance Statusはインスタンスのソフトウェアやネットワークの状態をチェックしています。
Instance Stateがrunningとなり、System StatusとInstance Statusの両方がOKになった時(2/2 checked)、インスタンスが完全に利用可能な状態となります。
InstanceStatus
describeInstanceStatusメソッドの戻り値であるDescribeInstanceStatusResultからInstanceStatusオブジェクトを取得できますが、このオブジェクトからInstance State, System Status, Instance Statusを確認出来ます。
AmazonEC2Client client = Region.getRegion(Regions.AP_NORTHEAST_1) .createClient(AmazonEC2Client.class, null, null); DescribeInstanceStatusRequest req = new DescribeInstanceStatusRequest() .withInstanceIds("i-xxxxxxxx"); DescribeInstanceStatusResult res = client.describeInstanceStatus(req); for (InstanceStatus status : res.getInstanceStatuses()) { System.out.println(status.getInstanceState()); System.out.println(status.getInstanceStatus()); System.out.println(status.getSystemStatus()); }
インスタンスが完全に起動しているならば、実行結果はこのようになるでしょう。
{Code: 16,Name: running} {Status: ok,Details: [{Name: reachability,Status: passed,}]} {Status: ok,Details: [{Name: reachability,Status: passed,}]}
まとめ
AWS SDK JavaでEC2インスタンスの起動を確認するには次のようなコードが必要です。 Instance Stateのチェックだけでは不十分な場合がありますので注意しましょう。
AmazonEC2Client client = Region.getRegion(Regions.AP_NORTHEAST_1) .createClient(AmazonEC2Client.class, null, null); DescribeInstanceStatusRequest req = new DescribeInstanceStatusRequest() .withInstanceIds("i-xxxxxxxx"); DescribeInstanceStatusResult res = client.describeInstanceStatus(req); long started = res.getInstanceStatuses() .stream() .filter(st -> st.getInstanceState().getName().equals("running")) .filter(st -> st.getInstanceStatus().getStatus().equals("ok")) .filter(st -> st.getSystemStatus().getStatus().equals("ok")) .count();