この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
CloudFormationの基本
以前はプロジェクト毎に、(似たような構成であるにも関わらず)EC2インスタンス作ったりAutoScale設定したり
RDSのインスタンス作ったり等々の処理をAWSコンソールやコマンドラインから手動で実行していました。
しかし、このCloudFormationを使用すれば、そういった作業のかなりの部分を自動化できます。
今回はこのCloudFormationをJava APIから使用してみます。
なお、CloudFormationについてはここで基本から説明していますが、簡単におさらいを。
CloudFormationとは
CloudFormationとは、AWSのサービス(EC2とかSQS等)をテンプレートとして記述することにより、 いちいち各サービスを設定する手間を省略し、汎用化することが可能なサービスです。 いままで、「このAMIでEC2インスタンスつくって、RDSのつないで、セキュリティグループはこんな感じで・・・」とAWSコンソールで 毎回設定していましたが、テンプレートを用意して実行することにより、すぐに一連のシステム(スタック)として立ち上がるわけです。
CloudFormationテンプレート
CloudFormation用テンプレートは、JSON形式のテキストファイルです。 「リソース」という単位で各AWSサービスに対して処理を記述したり、任意の値を「パラメータ」として渡すことができます。 このへんも、このあたりで詳細に説明していますので、ご確認ください。
テンプレートを用意してAWSコンソールから実行することもできますが、 今回はAWS SDK for JavaのAPIを用いて、S3上に保存してあるテンプレートを実行してみましょう。
環境構築
今回使用した動作環境は以下のとおりです。
- OS : MacOS X 10.7.5
- AWS SDK for Java: v1.5.3
AWSアカウントは使える状態にしておいてください。
Java APIからCloudFormationテンプレートを実行
テンプレート作成
まずは、サンプルとなるテンプレートを作成しましょう。 下記のような、シンプルなテンプレートを用意します。
{
"AWSTemplateFormatVersion": "2010-09-09",
"Parameters" : {
"ParamMessage" : {
"Type" : "String",
"Description" : "input the message.",
"Default" : "defaultMessage"
}
},
"Resources": {
"createS3Bucket" : {
"Type" : "AWS::S3::Bucket",
"Properties" : {
}
}
},
"Outputs" : {
"StackRegion" : {
"Value" : { "Ref" : "AWS::Region" }
},
"S3BucketOutput" : {
"Value" : { "Ref" : "createS3Bucket" }
},
"Message" : {
"Value" : { "Ref" : "ParamMessage" }
}
}
}
Parameters要素は、AWSコンソールやAPIから受け取ることのできる動的なパラメータです。 ここでは、String型の「ParamMessage」という名前のパラメータを受け取ることが可能です。
Resourcesという要素が、CloudFormationで最低限必要な要素です。 ここのTypeプロパティで「EC2を起動する」とか「S3のバケットを作成する」という命令を記述します。 サンプルでは「AWS::S3::Bucket」というType要素を使用してS3のバケットを作成しています。
Outputs要素は、Cloudformationの実行結果を出力します。 AWSコンソールのCloudFormation画面のOutputsタブで確認することができます。
Javaから実行
次に、先ほど作成したテンプレートをS3にアップロードしておきましょう。 アップロード先は https://s3-ap-northeast-1.amazonaws.com/pathyourbucket/hello.template としておきます。
アップロードしたテンプレートを使用して、CloudFormationを実行するJavaクラスを下記のように作成します。 ※AWS SDK for Javaをクラスパスに通しておいてください
import java.util.List;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.handlers.AsyncHandler;
import com.amazonaws.services.cloudformation.AmazonCloudFormationAsyncClient;
import com.amazonaws.services.cloudformation.model.CreateStackRequest;
import com.amazonaws.services.cloudformation.model.CreateStackResult;
import com.amazonaws.services.cloudformation.model.Parameter;
public class Main {
public static void main(String[] args) {
AWSCredentials credentials = new BasicAWSCredentials("アクセスキー","シークレットキー");
AmazonCloudFormationAsyncClient cli =
new AmazonCloudFormationAsyncClient(credentials);
cli.setEndpoint("cloudformation.ap-northeast-1.amazonaws.com");
CreateStackRequest req = new CreateStackRequest();
req.setStackName("hello-stack");
req.setTemplateURL("S3に保存しているテンプレートのパス");
List<Parameter> params = new ArrayList<Parameter>();
Parameter param1 = new Parameter();
param1.setParameterKey("ParamMessage");
param1.setParameterValue("hello");
params.add(param1);
req.setParameters(params);
cli.createStackAsync(req,
new AsyncHandler<CreateStackRequest, CreateStackResult>() {
@Override
public void onError(Exception e) {
e.printStackTrace();
}
@Override
public void onSuccess(CreateStackRequest req, CreateStackResult res) {
System.out.println(req.toString());
}
});
}
}
上記Javaプログラムでは、createStackAsyncメソッドを実行したとき、 「hello-stack」という名前で、S3上にあるテンプレートを指定してCloudformationを実行します。 ※非同期で実行されます
また、Parameterクラスにkeyとvalueを指定して渡すことで、任意の値をCloudFormationテンプレートに渡すことができます。 hello.templateでは、渡されたParamMessageパラメータをOutputsで表示していますね。 ※Refを使用すると、他の要素の値を参照することができます
実際にプログラムを実行してみてください。CloudFormationの実行が完了すると、S3にバケットが作られています。 バケット名については、CloudFormationが指定した名前になるので、作成したバケット名に依存する場合、 Outputsでやっているように、「{ "Ref" : "createS3Bucket" }」として作成されたバケット名を取得してください。
まとめ
今回はシンプルなテンプレートを作成して、JavaからCloudFormationを実行してみました。 CloudFormationを利用することで、AWSの環境構築も、同じことを繰り返さなくてすみますね。 また、JavaプログラムやシェルからCloudFormationを実行すれば、もっと便利に使えるので、活用してみてください。