サブネットの作成
サブネットの定義はこのようになります。
定義
Type: AWS::EC2::Subnet
Properties:
AssignIpv6AddressOnCreation: Boolean
AvailabilityZone: String
AvailabilityZoneId: String
CidrBlock: String
EnableDns64: Boolean
Ipv6CidrBlock: String
Ipv6Native: Boolean
MapPublicIpOnLaunch: Boolean
OutpostArn: String
PrivateDnsNameOptionsOnLaunch:
PrivateDnsNameOptionsOnLaunch
Tags:
- Tag
VpcId: String
パブリックサブネット-1a
を作成する例はこちらです。
PublicSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: 10.0.0.0/24
AvailabilityZone: ap-northeast-1a
Tags:
- Key: Name
Value: パブリックサブネット-1a
VpcId
は、VPCのIDを指定するのですが、同じテンプレート内で作成したVPCのVPC IDを参照させるため、!Ref VPC
という記述を行います。
注記
このRef
は組み込み関数というものです。
課題
サブネットを4つ定義してください。
回答
template.yaml
AWSTemplateFormatVersion: "2010-09-09"
Description: Scalable website
Resources:
###############
# VPC #
###############
VPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: handson-user1
PublicSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: 10.0.0.0/24
AvailabilityZone: ap-northeast-1a
Tags:
- Key: Name
Value: パブリックサブネット-1a
PublicSubnet2:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: 10.0.1.0/24
AvailabilityZone: ap-northeast-1c
Tags:
- Key: Name
Value: パブリックサブネット-1c
PrivateSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: 10.0.2.0/24
AvailabilityZone: ap-northeast-1a
Tags:
- Key: Name
Value: プライベートサブネット-1a
PrivateSubnet2:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: 10.0.3.0/24
AvailabilityZone: ap-northeast-1c
Tags:
- Key: Name
Value: プライベートサブネット-1c
Mappingsセクション
もうひと工夫してみましょう。
AvailabilityZone
の指定が東京リージョンのAZを指定しているため、このままでは他のリージョンで使用できません。こういった際に使用できるのがCloudFormationのMappings
セクションです。
Mappingsの構文は以下のとおりです。
構文
Mappings:
Mapping01:
Key01:
Name: Value01
Key02:
Name: Value02
Key03:
Name: Value03
具体的にはこのような記述となります。
Mappings:
RegionMap:
us-east-1:
zone1: us-east-1a
zone2: us-east-1b
ap-northeast-1:
zone1: ap-northeast-1a
zone2: ap-northeast-1c
RegionMap
というマップを定義し、キーがus-east-1
の場合のzone1
の値がus-east-1a
、キーがap-northeast-1
の場合のzone1
の値がap-northeast-1a
になります。
この定義をした状態で組み込み関数のFindInMap
を使用して値を取得します。
構文
!FindInMap [ MapName, TopLevelKey, SecondLevelKey ]
使用例
!FindInMap [RegionMap, !Ref "AWS::Region", zone1]
注記
リージョンを取得する"AWS::Region"
は事前に定義された疑似パラメーターという値です。他にはAWSのアカウントIDを取得するAWS::AccountId
などがあります。
AZをマップから取得する形式に変更したテンプレートはこのようになります。
template.yaml
AWSTemplateFormatVersion: "2010-09-09"
Description: Scalable website
Mappings:
RegionMap:
us-east-1:
zone1: us-east-1a
zone2: us-east-1b
ap-northeast-1:
zone1: ap-northeast-1a
zone2: ap-northeast-1c
Resources:
###############
# VPC #
###############
VPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 10.0.0.0/16
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: handson-user1
PublicSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: 10.0.0.0/24
AvailabilityZone: !FindInMap [RegionMap, !Ref "AWS::Region", zone1]
Tags:
- Key: Name
Value: パブリックサブネット-1a
PublicSubnet2:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: 10.0.1.0/24
AvailabilityZone: !FindInMap [RegionMap, !Ref "AWS::Region", zone2]
Tags:
- Key: Name
Value: パブリックサブネット-1c
PrivateSubnet1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: 10.0.2.0/24
AvailabilityZone: !FindInMap [RegionMap, !Ref "AWS::Region", zone1]
Tags:
- Key: Name
Value: プライベートサブネット-1a
PrivateSubnet2:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref VPC
CidrBlock: 10.0.3.0/24
AvailabilityZone: !FindInMap [RegionMap, !Ref "AWS::Region", zone2]
Tags:
- Key: Name
Value: プライベートサブネット-1c
課題
東京リージョンとバージニアリージョンにデプロイし、ここまでの手順を確認してください。
テンプレートファイル