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

2015.10.08

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

渡辺です。

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