この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
CloudFormationテンプレートに興味を持ち、最近構築したものをテンプレートを使って再現できるか試してみました。
CloudFormationテンプレートはスタック結果が同じでも、テンプレート作成者によってパラメータや出力が違いますよね。
第2回は、オーソドックスなVPC・サブネットのテンプレートを紹介します。
CloudFormationテンプレートでVPCを構築
■前提
CloudFormationのスタックを作成する前に、以下が前提条件ですのでご確認ください。
- 特にありません
■構築図
今回の構築図は上の画像です。
■CloudFormationテンプレート
今回のテンプレートを使用すると、VPC、パブリックサブネット2つ、プライベートサブネット2つ、インターネットゲートウェイ、ルートテーブル3つができるテンプレートです。
AWSTemplateFormatVersion: "2010-09-09"
Description:
Create VPC,Subnet,IGW,and RouteTable
Parameters:
myVPCCIDR:
Type: String
Default: 10.0.0.0/16
myPublicSubnet1CIDR:
Type: String
Default: 10.0.1.0/24
myPublicSubnet2CIDR:
Type: String
Default: 10.0.3.0/24
myPrivateSubnet1CIDR:
Type: String
Default: 10.0.2.0/24
myPrivateSubnet2CIDR:
Type: String
Default: 10.0.4.0/24
Resources:
myVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: !Ref myVPCCIDR
EnableDnsHostnames: 'true'
EnableDnsSupport: 'true'
InstanceTenancy: default
Tags:
- Key: Name
Value: !Sub ${AWS::StackName}-vpc
myInternetGateway:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- Key: Name
Value: !Sub ${AWS::StackName}-IGW
AttachGateway:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId:
Ref: myVPC
InternetGatewayId:
Ref: myInternetGateway
myPublicSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId:
Ref: myVPC
CidrBlock: !Ref myPublicSubnet1CIDR
AvailabilityZone: !Select
- 0
- Fn::GetAZs: !Ref 'AWS::Region'
Tags:
- Key: Name
Value: !Sub ${AWS::StackName}-subnet-public1
myPublicSubnet2:
Type: AWS::EC2::Subnet
Properties:
VpcId:
Ref: myVPC
CidrBlock: !Ref myPublicSubnet2CIDR
AvailabilityZone: !Select
- 1
- Fn::GetAZs: !Ref 'AWS::Region'
Tags:
- Key: Name
Value: !Sub ${AWS::StackName}-subnet-public2
myPrivateSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId:
Ref: myVPC
CidrBlock: !Ref myPrivateSubnet1CIDR
AvailabilityZone: !Select
- 0
- Fn::GetAZs: !Ref 'AWS::Region'
Tags:
- Key: Name
Value: !Sub ${AWS::StackName}-subnet-private1
myPrivateSubnet2:
Type: AWS::EC2::Subnet
Properties:
VpcId:
Ref: myVPC
CidrBlock: !Ref myPrivateSubnet2CIDR
AvailabilityZone: !Select
- 1
- Fn::GetAZs: !Ref 'AWS::Region'
Tags:
- Key: Name
Value: !Sub ${AWS::StackName}-subnet-private2
myPublicRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId:
Ref: myVPC
Tags:
- Key: Name
Value: !Sub ${AWS::StackName}-rtb-public
myPrivateRouteTable1:
Type: AWS::EC2::RouteTable
Properties:
VpcId:
Ref: myVPC
Tags:
- Key: Name
Value: !Sub ${AWS::StackName}-rtb-private1
myPrivateRouteTable2:
Type: AWS::EC2::RouteTable
Properties:
VpcId:
Ref: myVPC
Tags:
- Key: Name
Value: !Sub ${AWS::StackName}-rtb-private2
myPublicRoute:
Type: AWS::EC2::Route
Properties:
RouteTableId:
Ref: myPublicRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId:
Ref: myInternetGateway
myPublicSubnet1RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId:
Ref: myPublicSubnet1
RouteTableId:
Ref: myPublicRouteTable
myPublicSubnet2RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId:
Ref: myPublicSubnet2
RouteTableId:
Ref: myPublicRouteTable
myPrivateSubnet1RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId:
Ref: myPrivateSubnet1
RouteTableId:
Ref: myPrivateRouteTable1
myPrivateSubnet2RouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId:
Ref: myPrivateSubnet2
RouteTableId:
Ref: myPrivateRouteTable2
Outputs:
myVPC:
Value: !Ref myVPC
Export:
Name: !Sub ${AWS::StackName}-vpc
myVPCCIDR:
Value: !Ref myVPCCIDR
Export:
Name: !Sub ${AWS::StackName}-vpc-cidr
myPublicSubnet1:
Value: !Ref myPublicSubnet1
Export:
Name: !Sub ${AWS::StackName}-subnet-public1
myPublicSubnet1CIDR:
Value: !Ref myPublicSubnet1CIDR
Export:
Name: !Sub ${AWS::StackName}-subnet-public1-cidr
myPublicSubnet2:
Value: !Ref myPublicSubnet2
Export:
Name: !Sub ${AWS::StackName}-subnet-public2
myPublicSubnet2CIDR:
Value: !Ref myPublicSubnet2CIDR
Export:
Name: !Sub ${AWS::StackName}-subnet-public2-cidr
myPrivateSubnet1:
Value: !Ref myPrivateSubnet1
Export:
Name: !Sub ${AWS::StackName}-subnet-private1
myPrivateSubnet1CIDR:
Value: !Ref myPrivateSubnet1CIDR
Export:
Name: !Sub ${AWS::StackName}-subnet-private1-cidr
myPrivateSubnet2:
Value: !Ref myPrivateSubnet2
Export:
Name: !Sub ${AWS::StackName}-subnet-private2
myPrivateSubnet2CIDR:
Value: !Ref myPrivateSubnet2CIDR
Export:
Name: !Sub ${AWS::StackName}-subnet-private2-cidr
myPublicRouteTable:
Value: !Ref myPublicRouteTable
Export:
Name: !Sub ${AWS::StackName}-rtb-public
myPrivateRouteTable1:
Value: !Ref myPrivateRouteTable1
Export:
Name: !Sub ${AWS::StackName}-rtb-private1
myPrivateRouteTable2:
Value: !Ref myPrivateRouteTable2
Export:
Name: !Sub ${AWS::StackName}-rtb-private2
■結果
今回のテンプレートを利用してスタックを作成してみます。
テンプレートの汎用性を高めるため、CIDRをパラメータとして入力できるようにしてあります。
また、マネージメントコンソールでVPCを作った時の結果に近くなるように、ルートテーブルの作成数やサブネットの関連付けにこだわりました。
スタック作成画面でCIDRが入力できます。デフォルトでは、VPCCIDR: 10.0.0.0/16、各サブネット: 10.0.1.0/24、10.0.2.0/24、10.0.3.0/24、10.0.4.0/24を割り当てています。
↓他の設定は特にないので、「スタック作成」をクリックしてください。数分で作成が完了するはずです。
↓出力は各サービスのIDと、入力したCIDRです。
今回は以上です。
まとめ:AWS CloudFormationテンプレートのススメ#2 VPC編
CloudFormationのテンプレートを自在に作れるようになりたいと思い、現在関わっているプロジェクトの構築をテンプレート化してみました。
VPCとサブネットはマネージメントコンソールで簡単に作れますよね。しかし、テンプレートを書くことで、各リソースの細かいプロパティやリソース同士の関連性を確認することができました。
作成したテンプレートは公式ドキュメントを見ながら独自に書いたものです。こんな風にしたほうがいいよ、というのがありましたらどんどんご連絡ください!
参考リンク:AWS公式ドキュメント
↓ほかの協栄情報メンバーもAWS CloudFormationに関する記事を公開しています。ぜひ参考にしてみてください。
■CloudFormation作成を効率化するValidate Template機能について(INAMURA)
https://cloud5.jp/cfn-validatetemplate-function/
■CloudFormationでRDS(Aurora PostgreSQL リージョン別クラスター)を構築する(小林 剛)
https://cloud5.jp/create-rds-aurora-postgresql-region-by-cfn/
■CloudFormationによる【S3】の構築(umemoto)
https://cloud5.jp/cf-s3/