2012年12月3日月曜日

複数のCloudFormationのテンプレートを連動させる

スズキです。

CDPネタです。今回の対象は「Stack Deploymentパターン」です。


その「利点」に、下記のような記載があります。
スタックテンプレート(CloudFormationテンプレート)は重ねて利用することも
できるので、部品としてのテンプレートを幾つか用意し、それらのテンプレートを
必要に応じて重ね合わせることで、システムを柔軟に、そして素早く構築することが
できる。
今まで、下記のように「VPCの作成」と「NATインスタンスの作成」を行う
CloudFormationのテンプレートを作成してきました。
今回は、この2つを重ねあわせて、NATインスタンスが配置済みのVPCを構築してみます。

ということで、上記2つのテンプレートを重ねて利用するテンプレート用意しました。
SUZ-LAB Formation VPC Basic & OnDemand NAT 0.0.1
そんなに長くないので下記に記載します。

suz-lab_vpc-basic_ondemand-nat-0.0.1.json
{
    "AWSTemplateFormatVersion": "2010-09-09", 
    "Description": "SUZ-LAB Formation VPC Basic & OnDemand NAT 0.0.1", 
    "Mappings": {
        "AvailabilityZoneMap": {
            "ap-northeast-1": {
                "AZA": "ap-northeast-1a", 
                "AZB": "ap-northeast-1b", 
                "AZC": "ap-northeast-1c"
            }
        }
    }, 
    "Parameters": {
        "VPCCIDR": {
            "AllowedPattern": "^(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])\\.(\\d|[01]?\\d\\d|2[0-4]\\d|25[0-5])", 
            "Default": "10.0", 
            "Description": "VPC CIDR (X.X.0.0/16)", 
            "Type": "String"
        },
        "KeyName": {
            "Default": "", 
            "Description": "Key Name", 
            "Type": "String"
        }, 
        "OnDemandNATImageId": {
            "AllowedPattern": "^ami-[0-9a-z]{8}",
            "Default": "ami-14d86d15",
            "Description": "OnDemand NAT Image ID", 
            "Type": "String"
        }, 
        "OnDemandNATInstanceType": {
            "Default": "t1.micro", 
            "Description": "OnDemand NAT Instance Type", 
            "Type": "String"
        }, 
        "OnDemandNATName": {
            "Default": "ondemand-nat", 
            "Description": "OnDemand NAT Name", 
            "Type": "String"
        }
    }, 
    "Resources": {
        "CloudFormationStackVPCBasic" : {
            "Type": "AWS::CloudFormation::Stack",
            "Properties": {
                "TemplateURL": "https://s3-ap-northeast-1.amazonaws.com/template.suz-lab.com/template/suz-lab_vpc-basic-0.0.1.json",
                "TimeoutInMinutes": "60"
            } 
        },
        "CloudFormationStackOnDemandNAT" : {
            "Type": "AWS::CloudFormation::Stack",
            "Properties": {
                "TemplateURL" : "https://s3-ap-northeast-1.amazonaws.com/template.suz-lab.com/template/suz-lab_ondemand-nat-0.0.1.json",
                "Parameters" : {
                    "KeyName": { "Ref": "KeyName" },
                    "ImageId": { "Ref": "OnDemandNATImageId" }, 
                    "InstanceType": { "Ref": "OnDemandNATInstanceType" },
                    "Name": { "Ref": "OnDemandNATName" },
                    "RouteTableId": { "Fn::GetAtt" : [ "CloudFormationStackVPCBasic", "Outputs.RouteTableIdProtected" ] },
                    "SecurityGroupId": { "Fn::GetAtt" : [ "CloudFormationStackVPCBasic", "Outputs.SecurityGroupIdCommon" ] },
                    "SubnetId": { "Fn::GetAtt" : [ "CloudFormationStackVPCBasic", "Outputs.SubnetIdPublicVarA00" ] },
                    "VpcId": { "Fn::GetAtt" : [ "CloudFormationStackVPCBasic", "Outputs.VpcIdBasic" ] }
                }
            }
        }
    },
    "Outputs": {
        "GuidelineVPCBasic": {
            "Value": { "Fn::GetAtt" : [ "CloudFormationStackVPCBasic", "Outputs.Guideline" ] }
        },
        "GuidelineOnDemandNAT": {
            "Value": { "Fn::GetAtt" : [ "CloudFormationStackOnDemandNAT", "Outputs.Guideline" ] }
        }
    } 
}
(このテンプレートに合わせて上述した2つのテンプレートも多少修正しています)

それでは実際に上記のテンプレートを利用してみます。

はじめに、適当な"Stack Name"をつけて"Provide a Template URL"を選択して、
上記のテンプレート(JSON)のURLを入力します。


そして、パラメータを入力して、CloudFormationを実行します。


パラメータは次の通りです。(当然「VPC作成」と「NATインスタンス作成」のミックスです)
  • VPCCIDR
    • VPCに設定するCIDRの最初の2オクテット
  • OnDemandNATImageId
    • NATインスタンスの"AMI ID"
  • OnDemandNATInstanceType
    • NATインスタンスのタイプ
  • OnDemandNATName
    • NATインスタンスの名前(Nameタグの値)
  • KeyName
    • NATインスタンスが利用するキー名
実行が終了すると、次のように3つのスタックが作成されていることがわかります。

1つ目は、テンプレートの内容を記載した大本のテンプレート(実行したもの)です。


2つ目は、1つ目のテンプレートで呼ばれている「VPC作成」のテンプレートです。


Outputsに3つ目のテンプレート(NATインスタンス作成)に渡すパラメータが
出力されるようになって(変更して)います。

3つ目も、1つ目のテンプレートで呼ばれている「NATインスタンス作成」の
テンプレートです。


ちなみにテンプレートを「VPCの作成」と「NATインスタンスの作成」に分けたのは、
現状のCDPでは「NATインスタンス」について、次の2つのパターンが用意されており、
VPC作成後、この2つを選択できるようにするためです。

ということで、次は"High Availability NATパターン"のテンプレートです...
--------
http://www.suz-lab.com

0 コメント: