AWS SDK for Javaを使う#EC2

2012.02.09

はじめに

いまやクラウドサービスの代表格とも言えるAmazonですが、EC2やS3をはじめとして、さまざまなサービスを提供しています。数年前に私も少しだけEC2やS3を使用したことがあるのですが、最近はあまりさわっていませんでした。 しかし今回AWSについての調査をきっかけに、各種AWSサービスについて復習&AWS SDKでの動作確認をしていきたいと思います。

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.7.2
  • Java : 1.6.0_26
  • Scala : 2.9.1 final
  • SBT : 0.11.2

なお、AWSへの登録は終わっているものとします。

Amazon EC2

AWSの中でもっとも使用頻度の高いサービスの1つがAmazon EC2だと思います。 ご存知かとは思いますが、EC2は仮想サーバをサービスとして提供するものです。 基本的なことはそこら中に記事があるので端折ります。 まずはAWS Management Consoleをみてみましょう。

昔はこんな綺麗なHOME画面はなかったような気が。ここから各種サービスへいけるみたいです。

実行環境のセットアップ

今回はプログラムからAPIを使用してEC2インスタンスを作成してみます。 まずはここからAWS SDK for Javaをダウンロードしましょう。 適当なところに解凍しておいてください。

そのままサンプルをJavaで動かしてもあれなんで、Scalaで書いてみましょう。 今回はプロジェクトの作成や実行を、ScalaのビルドツールであるSimple Build Tool(以下sbt)を使用して行います。 MacであればHomebrewで簡単にインストールできるので、インストールしましょう。 それ以外の方法でインストールするのであればこのへんをみたりすればできると思います。

% brew install sbt

サンプル用プロジェクトの作成

プロジェクト内にソースやライブラリを置くディレクトリを作成します。

% mkdir aws
% cd aws
% mkdir -p src/main/scala
% mkdir -p src/test/scala
% mkdir -p lib

libディレクトリの中にaws-java-sdk-1.3.1/libの中のjarとthird-partyディレクトリ内のjarをコピーします。 このあと作成するファイルはsrc/main/scalaディレクトリの中に作成しましょう。

src/main/scalaにAws.scalaファイルを作成し、EC2に接続してスポットインスタンスを起動する処理を書いてみます。 aws-java-sdk-1.3.1の中のsamplesディレクトリがあり、InlineGettingStartedCodeSampleApp.java でmain関数内でEC2インスタンスの作成からキャンセルまでひととおりやっているので、それを参考にプログラムを作成します。 アクセスキーとシークレットキーは事前に確認しておきましょう。

import com.amazonaws._
import com.amazonaws.auth._
import com.amazonaws.services.ec2._
import com.amazonaws.services.ec2.model._
import scala.collection.JavaConversions._

object EC2Main extends App {

  val accessKey = "アクセスキー"
  val secretKey = "シークレットキー"
  //キーを渡して認証
  val credentials = new BasicAWSCredentials(accessKey,secretKey)

  //EC2クライアント作成
  val ec2 = new AmazonEC2Client(credentials)
  //スポットインスタンスオブジェクトを初期化
  val requestRequest = new RequestSpotInstancesRequest()
  //インスタンスのパラメータ設定
  requestRequest.setSpotPrice("0.03")
  requestRequest.setInstanceCount(1)
  //requestRequest.setAvailabilityZoneGroup
  
  //イメージの種類とタイプを設定
  val launchSpecification = new LaunchSpecification();
  launchSpecification.setImageId("ami-8c1fece5")
  launchSpecification.setInstanceType("t1.micro")
  //セキュリティグループを指定
  val securityGroups = List("default")
  launchSpecification.setSecurityGroups(securityGroups)
  //リクエストにセット
  requestRequest.setLaunchSpecification(launchSpecification)
  //スポットインスタンス作成のリクエスト
  val requestResult = ec2.requestSpotInstances(requestRequest)        	
  val requestResponses = requestResult.getSpotInstanceRequests()

  //レスポンス情報取得  
  for (requestResponse <- requestResponses) {
    println("Created Spot Request: "+requestResponse.getSpotInstanceRequestId())
  }
}

認証情報を作成し、AmazonEC2Clientオブジェクトを作成後、スポットインスタンス情報を作成して起動しています。 プログラムを記述したら、sbtを起動して実行してみましょう。

$ sbt
>run

プログラム終了後、AWS Management Consoleで確認してみると、US Eastにスポットインスタンスが作成されています。 ※作成したスポットインスタンスはすぐにキャンセルしておきましょう

まとめ

今回はスポットインスタンスを作成するだけでしたが、ここにあるように、AWS Management Consoleにあるような操作がいろいろとできます。通常のアプリケーションで動的にEC2インスタンスを作成することはあまりないかと思いますが、インスタンス操作のツールとして使用するなどの用途がありそうです。

参考サイトなど