メインコンテンツまでスキップ

サブネットの作成

image.png

サブネットの定義はこのようになります。

定義
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の構文は以下のとおりです。

構文
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
課題

東京リージョンとバージニアリージョンにデプロイし、ここまでの手順を確認してください。

テンプレートファイル