第2回 CloudFormationテンプレートの実行(Network)
さて第2回の今回は、本記事に記載の「CloudFormationテンプレートを用いて、自動デプロイで利用するVPCを構築していきます。
前回:[社内勉強会資料] CloudFormationで構築する自動デプロイ環境 ~ 1/6
CloudFormationで作成するリソース
- CloudFormationテンプレートを使って、以下のAWSリソースを作成します
- VPC × 1
- Public Subnet × 2
- InternetGateway × 1
- セキュリティグループ
- CommonSecurityGroup:SSH(port:22)アクセス用
- PublicSecurityGroup:HTTP(port:80)、HTTPS(port:443)アクセス用
CloudFormationテンプレート
network.yaml
AWSTemplateFormatVersion: 2010-09-09
Description: network configration template
Parameters:
ProjectEnvironment:
Type: String
Default: 'usecase-auto-deploy'
PrimaryAZ:
Type: AWS::EC2::AvailabilityZone::Name
MinLength: 1
Default: ap-northeast-1a
SecondaryAZ:
Type: AWS::EC2::AvailabilityZone::Name
MinLength: 1
Default: ap-northeast-1c
VPCCidr:
Type: String
MinLength: 9
MaxLength: 18
Default: 10.0.0.0/16
AllowedPattern: ^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/(?:3[0-2]|[12][0-9]|[0-9])$
App1Cidr:
Type: String
MinLength: 9
MaxLength: 18
Default: 10.0.100.0/24
AllowedPattern: ^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/(?:3[0-2]|[12][0-9]|[0-9])$
Description: on Primary AZ
App2Cidr:
Type: String
MinLength: 9
MaxLength: 18
Default: 10.0.101.0/24
AllowedPattern: ^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/(?:3[0-2]|[12][0-9]|[0-9])$
Description: on Secondary AZ
AllowSSH:
Type: String
MinLength: 9
MaxLength: 18
Default: 123.50.201.40/29
AllowedPattern: ^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)/(?:3[0-2]|[12][0-9]|[0-9])$
Resources:
VPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: !Ref VPCCidr
EnableDnsSupport: true
EnableDnsHostnames: true
InstanceTenancy: default
Tags:
- { Key: Name, Value: !Sub "${ProjectEnvironment}-vpc" }
App1Subnet:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: !Ref App1Cidr
AvailabilityZone: !Ref PrimaryAZ
Tags:
- { Key: Name, Value: !Sub "${ProjectEnvironment}-app-1" }
App2Subnet:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: !Ref App2Cidr
AvailabilityZone: !Ref SecondaryAZ
Tags:
- { Key: Name, Value: !Sub "${ProjectEnvironment}-app-2" }
InternetGateway:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
- { Key: Name, Value: !Sub "${ProjectEnvironment}-internet-gateway" }
AttachInternetGateway:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId: !Ref VPC
InternetGatewayId: !Ref InternetGateway
PublicRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref VPC
Tags:
- { Key: Name, Value: !Sub "${ProjectEnvironment}-public" }
PublicRoute:
Type: AWS::EC2::Route
Properties:
RouteTableId: !Ref PublicRouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref InternetGateway
AssociateApp1Subnet:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId: !Ref PublicRouteTable
SubnetId: !Ref App1Subnet
AssociateApp2Subnet:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
RouteTableId: !Ref PublicRouteTable
SubnetId: !Ref App2Subnet
CommonSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
VpcId: !Ref VPC
GroupName: !Sub "${ProjectEnvironment}-common-sg"
GroupDescription: Allow All in VPC
SecurityGroupIngress:
- { IpProtocol: -1, CidrIp: !Ref VPCCidr }
- { IpProtocol: tcp, FromPort: 22, ToPort: 22, CidrIp: !Ref AllowSSH }
Tags:
- { Key: Name, Value: !Sub "${ProjectEnvironment}-common" }
PublicSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
VpcId: !Ref VPC
GroupName: !Sub "${ProjectEnvironment}-public-sg"
GroupDescription: Allow http(s)
SecurityGroupIngress:
- { IpProtocol: tcp, FromPort: 443, ToPort: 443, CidrIp: 0.0.0.0/0 }
- { IpProtocol: tcp, FromPort: 80, ToPort: 80, CidrIp: 0.0.0.0/0 }
Tags:
- { Key: Name, Value: !Sub "${ProjectEnvironment}-public-sg" }
Outputs:
VPCARN:
Value: !Ref VPC
Export:
Name: !Sub "${ProjectEnvironment}-vpc"
VPCCIDR:
Value: !Ref VPCCidr
Export:
Name: !Sub "${ProjectEnvironment}-vpc-cidr"
ALBSubnetId1:
Value: !Ref App1Subnet
Export:
Name: !Sub "${ProjectEnvironment}-ALBSubnetId1"
ALBSubnetId2:
Value: !Ref App2Subnet
Export:
Name: !Sub "${ProjectEnvironment}-ALBSubnetId2"
ECSSubnetId1:
Value: !Ref App1Subnet
Export:
Name: !Sub "${ProjectEnvironment}-ECSSubnetId1"
ECSSubnetId2:
Value: !Ref App2Subnet
Export:
Name: !Sub "${ProjectEnvironment}-ECSSubnetId2"
ECSSecurityGroupId:
Value: !Ref CommonSecurityGroup
Export:
Name: !Sub "${ProjectEnvironment}-ECSSecurityGroupId"
ALBSecurityGroupId:
Value: !Ref PublicSecurityGroup
Export:
Name: !Sub "${ProjectEnvironment}-ALBSecurityGroupId"
CloudFormationの実行
- AWSコンソールにログインし、「CloudFormation」の画面に移動する
- 「CloudFormation」の画面で「スタックの作成」を実行する
- VPC構築用のCloudFormationテンプレートをアップロードする
3-1. テンプレートの準備:「テンプレートの準備完了」
3-2. テンプレートの指定:「テンプレートファイルのアップロード」
3-3. テンプレートファイルのアップロード:「ファイルの選択」でCloudFormationテンプレートファイルを選択する
3-4. 「次へ」を選択する - スタックの詳細を指定
4-1. 「スタックの名前」にはusecase-auto-deploy-network
を設定してください
4-2. 画面の一番下まで移動して「次へ」を選択する
- スタックのオプション
5-1. スタックのオプションは変更せず、そのまま「スタックの作成」を選択してください
- CloudFormationスタックの実行
6-1. 「スタックの作成」まで実行されると、スタックの一覧に作成したCloudFormationスタックの進捗状況が表示されます
6-2. スタックの作成が成功すると、「CREATE_COMPLETE」のステータスになります
6-3. スタックの「リソース」タブから作成されたリソースの内容を確認できます
連載の第2回となる今回はここまで。
次回第3回は、自動デプロイのデプロイ先となるECSとECRを構築していきます。