AWS SDK for JavaからCloudFormationを使ってみる#2 テンプレートの分割

2013.08.21

テンプレートファイルの分割

前回に引き続き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で作成されたスタックを削除すると、元のスタックは残ります。

参考サイトなど