今回は、先日書籍(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)監修のもと掲載しています。
元記事は、こちら