AWS SDK for JavaでEC2インスタンスの起動を確認する

2015.10.08

渡辺です。

EC2インスタンスの状態を確認するには、describeInstanceStatusを利用します。 一方、EC2インスタンスは、StatusとStateという似た異なる状態を持ちます。 このため、APIが解りにくいものとなっています。

今日はEC2インスタンスが起動状態であることを確認するためのコードを紹介します。

チェックする状態

マネジメントコンソールを確認すると、Instance StateStatus Checksの2つの項目があります。

state

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();