サブネットの作成

サブネットの定義はこのようになります。
定義
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
課題
東京リージョンとバージニアリージョンにデプロイし、ここまでの手順を確認してください。
テンプレートファイル