dryRunを使って高額なEC2インスタンスを起動する気分を味わってみる

2013.10.18

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

EC2のdryRunとは

通常、EC2インスタンスをSDKやコマンドラインツールから起動すると、もちろんEC2インスタンスが起動してしまいます。

AWS SDK for JavaAmazonEC2Clientに用意されたdryRunメソッドを使うと、実行しようとしているEC2の操作が正しく実行可能なものかを検査する事が可能です。

検査をするだけなので、実際にはEC2インスタンスは起動しません。

まずは普通にEC2インスタンスを起動してみる

EclipseでAWS Java Projectを作成し、下記プログラムを実行し、まずは普通にt1.microのEC2インスタンスを起動してみます。

import java.util.ArrayList;
import java.util.Collection;

import com.amazonaws.AmazonServiceException;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.PropertiesCredentials;
import com.amazonaws.services.ec2.AmazonEC2Client;
import com.amazonaws.services.ec2.model.DryRunResult;
import com.amazonaws.services.ec2.model.InstanceType;
import com.amazonaws.services.ec2.model.RunInstancesRequest;

public class AwsConsoleApp {

    public static void main(String[] args) throws Exception {
        try {
            AWSCredentials credentials =
                new PropertiesCredentials(
                    AwsConsoleApp.class.getResourceAsStream("AwsCredentials.properties"));

            AmazonEC2Client ec2Client = new AmazonEC2Client(credentials);
            ec2Client.setEndpoint("ec2.ap-northeast-1.amazonaws.com");

            RunInstancesRequest request = new RunInstancesRequest();

            request.setImageId("ami-2f61fe2e"); // Amazon Linux AMI 2013.09 64bit
            
            // マイクロ $0.02/h
            request.setInstanceType(InstanceType.T1Micro); 

            Collection<String> securityGroups = new ArrayList<String>();
            securityGroups.add("web-sg");

            request.setSecurityGroups(securityGroups);
            request.setMaxCount(1);
            request.setMinCount(1);
            request.setKeyName("FukudaTomonariKey");

            // Normal Running
            RunInstancesResult result = ec2Client.runInstances(request);

            for (Instance instance : result.getReservation().getInstances()) {
                System.out.println("instanceId: " + instance.getInstanceId());
            }
        } catch (AmazonServiceException ase) {
                System.out.println("Caught Exception: " + ase.getMessage());
                System.out.println("Reponse Status Code: " + ase.getStatusCode());
                System.out.println("Error Code: " + ase.getErrorCode());
                System.out.println("Request ID: " + ase.getRequestId());
        }
    }
}

上記プログラムを実行するとEC2インスタンスが起動します。AWS Management Consoleで起動を確認しておきましょう。

dryRunでEC2インスタンスを起動した気分になってみる

次に、起動処理の部分を下記のように変更してみます。

            // Dry Running
            DryRunResult<RunInstancesRequest> dryRunResult = ec2Client.dryRun(request);

            System.out.println("Dryrun Message: " + dryRunResult.getMessage());

上記プログラムを実行すると、Eclipseのコンソールにメッセージが表示されます。メッセージは下記のようなものになります:

Dryrun Message: : Status Code: 412, AWS Service: AmazonEC2, AWS Request ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxx,
AWS Error Code: DryRunOperation, AWS Error Message: Request would have succeeded, but DryRun flag is set.

メッセージの最後の部分に「リクエストは成功してたやろな、せやけどDryRunフラグがセットされておったで」と記述されており、実際にはEC2インスタンスの起動処理が行われていなかったことがわかります。AWS Management Consoleで確認しても、EC2インスタンスは起動していません。

高額なEC2インスタンスを起動する気分を味わってみる

最後に高額なEC2インスタンスを起動してみますが、実際には起動せず、起動した気分を味わってみます。

まずは高額なEC2インスタンスが何者なのかをEC2の料金表で確認します。

EC2の料金表を確認すると時間単価が最も高額なのはハイストレージオンデマンドインスタンスエイトエクストララージであることがわかります。

プログラムのEC2のリクエストのインスタンスタイプを設定する部分を変更してみましょう。

// ハイストレージエイトエクストララージ $4.600/h
request.setInstanceType(InstanceType.Hs18xlarge);

 プログラムを実行すると、コンソールにメッセージが表示されます。実際にはEC2インスタンスは起動しません。

最後に

今回はEC2のdryRunに関して試してみました。EC2の起動設定が有効かどうかをテストする場合などにdryRunメソッドは活用できるのではないかと思いました。