share facebook facebook2 twitter menu hatena pocket slack

2013.01.22 TUE

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

鈴木 宏康

WRITTEN BY鈴木 宏康

今回は、先日書籍(Amazon Web Servicesクラウドデザインパターン設計ガイド)が発売された
Cloud Design Pattern(CDP)の記事になります。

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

このCDPの「利点」に、下記のような記載があります。

スタックテンプレート(CloudFormationテンプレート)は重ねて利用することもできるので、
部品としてのテンプレートを幾つか用意し、それらのテンプレートを必要に応じて重ね合わせることで、
システムを柔軟に、そして素早く構築することができる。

これまで、CloudFormationでVPCの構築OnDemand NATパターンをCloudFormation化について
CloudFormationのテンプレートを作成してきました。

今回は、この2つを合わせて、NATインスタンスが配置済みのVPCを構築してみます。
SUZ-LAB Formation VPC Basic & OnDemand NAT 0.0.1に、上記2つのテンプレートを
重ねて利用するテンプレート用意しました。

それほど長くないので下記に記載します。

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つを選択できるようにする為です。

こちらの記事はなかの人(suz-lab)監修のもと掲載しています。
元記事は、こちら

鈴木 宏康

鈴木 宏康

愛知県生まれ。東京工業大学大学院修士課程修了。在学時より、ベンチャー企業でインターネットに関する業務に携わり、現在はクラウド(主にAmazon Web Services)上での開発・運用を軸とした事業の、業務の中心として活躍。