この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
テンプレートファイルの分割
前回に引き続きCloudFormationのお話です。 AWS関連サービスをまるっと設定できるとても便利なサービスですが、システムが巨大になるにつれて、 テンプレートファイルは肥大しがちです。 また、システムまるごとを1つのスタックとして定義して、毎回作成/削除を繰り返していては、コストが大きいです。 そんなときは、今回紹介するように、CloudFormationテンプレートの分割を検討してみてください。
では、前回使用したテンプレートをベースにテンプレートの分割をためしてみましょう。
環境構築
今回使用した動作環境は以下のとおりです。
- OS : MacOS X 10.7.5
- AWS SDK for Java: v1.5.3
AWSアカウントは使える状態にしておいてください。
CloudFormationテンプレートを分割して実行してみる
今回はSQSを作成し、その結果をEC2のuserdataに対して渡してみます。 まずは、大元のテンプレートとなるparent.templateを作成しましょう。 このテンプレートでは、SQSを作成し、作成したキューの値を分割したテンプレートに渡します。
{
"AWSTemplateFormatVersion": "2010-09-09",
"Parameters" : {
},
"Resources": {
"MyQueue" : {
"Type" : "AWS::SQS::Queue"
},
"ChildStack" : {
"Type" : "AWS::CloudFormation::Stack",
"Properties" : {
"TemplateURL" : "your child template path",
"Parameters" : {
"MyQueue" : { "Ref" : "MyQueue" }
}
}
}
},
"Outputs" : {
"SQS" : {
"Value" : { "Ref" : "MyQueue" }
}
}
}
AWS::CloudFormation::Stackタイプのリソースが、別のスタックを作成するためのリソースです。 TemplateURLは、この後作成するchild.templateのS3パスを指定してください。 また、Parametersを使用すればChildStackへのパラメータを渡すことができます。
ChildStackリソースで呼び出されるchild.templateは下記の通りです。 渡されたパラメータをUserDataとして渡して、EC2インスタンスを作成します。
{
"AWSTemplateFormatVersion": "2010-09-09",
"Parameters" : {
"MyQueue" : {
"Type" : "String",
"Description" : "queue info.",
"Default" : ""
}
},
"Resources": {
"MyEC2": {
"Type": "AWS::EC2::Instance",
"Properties": {
"InstanceType": "m1.small",
"KeyName": "<キーファイル名>",
"ImageId": "<AMI ID>",
"UserData": {
"Fn::Base64" : {
"Fn::Join" : [ "", [
"sqs=", { "Ref" : "MyQueue" },"\n",
"" ]
]
}
}
}
}
},
"Outputs" : {
"MyEC2" : {
"Value" : { "Ref" : "MyEC2" }
}
}
}
child.templateをS3にアップし、そのパスをparent.templateのTemplateURLに指定します。 parent.templateもS3にアップし、前回と同じく下記のようなJavaプログラムを記述して実行してみましょう。
・
・
AWSCredentials credentials = new BasicAWSCredentials("アクセスキー","シークレットキー");
AmazonCloudFormationAsyncClient cli =
new AmazonCloudFormationAsyncClient(credentials);
cli.setEndpoint("cloudformation.<リージョン>.amazonaws.com");
CreateStackRequest req = new CreateStackRequest();
req.setStackName("split-stack");
req.setTemplateURL("S3に保存しているparent.templateのパス");
cli.createStackAsync・・・
・
・
AWSコンソールでCloudFormation画面を確認してみてください。スタックが2つ作成されているはずです。 元のスタックを削除すればchild.templateで作成されたスタックも削除されます。 child.templateで作成されたスタックを削除すると、元のスタックは残ります。