皆様、お世話になっております。鈴木と申します。
今回はAWS CloudFormationを使用してマルチAZ VPC作成していきたいと思います。
1.目次
2.要件
- ソウルリージョンにマルチAZなVPCの作成
- 3層アーキテクチャの構築
→それぞれのAZにパブリックサブネット,プライベートサブネット,プロテクトサブネットをそれぞれ1つずつ設置 - パブリックサブネットにNATゲートウェイを各1つ設置する
- AWS CloudFormationでの構築
3.構築サービスの説明
3-1.VPCについて
簡単にVPCについてご説明致します。
AWS Virtual Private Cloud (VPC) は、ユーザーが自分専用の仮想ネットワークをAWSクラウド内に構築できるサービスです。これにより、クラウド環境でもオンプレミスのデータセンターのようにネットワーク設定を自由にカスタマイズできます。
VPCの主な特徴としては5つ挙げられます。
①分離されたネットワーク環境
→各VPCは他のVPCやAWSのインフラから完全に分離されており、セキュリティが確保されています。
②カスタマイズ可能なネットワーク設定
→IPアドレス範囲の設定、サブネットの作成、ルートテーブルの設定、インターネットゲートウェイの追加など、ネットワーク設定を柔軟に行うことが出来ます。
③セキュリティ制御
→キュリティグループやネットワークACLを使用して、インスタンス間のトラフィックや外部からのアクセスを制御できます。
④サブネットの設計
→パブリックサブネット(インターネットアクセス可能なサブネット)とプライベートサブネット(内部ネットワーク専用サブネット)を作成し、用途に応じてインスタンスを配置できます。
⑤マルチAZ構成
→複数のアベイラビリティゾーン(AZ)にまたがるサブネットを作成することで、高可用性と耐障害性を実現できます。
3-2.NATゲートウェイについて
続いてNATゲートウェイについてご説明致します。
NATゲートウェイ(Network Address Translation Gateway) は、プライベートサブネット内のインスタンスがインターネットにアクセスできるようにするためのAWSサービスです。これにより、インスタンスはインターネットへのアウトバウンドトラフィックを実行できますが、外部からのインバウンドトラフィックは防がれます。
NATゲートウェイの主な特徴としては3つ挙げられます。
①アウトバウンドアクセスの提供
→プライベートサブネット内のインスタンスがソフトウェアアップデートやパッチをインターネットからダウンロードできます。
②インバウンドトラフィックの遮断
→外部からの未承認の接続は遮断されるため、セキュリティが強化されます。
③高可用性
→NATゲートウェイを複数のアベイラビリティゾーンに配置することで、高可用性と冗長性を確保できます。
4.構成図
※次回以降の構築でプライベートサブネットへはWEBサーバー用のEC2インスタンス、プロテクトサブネットにはRDSを配置予定です。
5.全体構築ソースコード
今回はYAMLで記述しております。
AWSTemplateFormatVersion: '2010-09-09'
Resources:
AWSTemplateFormatVersion: '2010-09-09'
Resources:
# VPCの作成
NaokiVpc:
Type: 'AWS::EC2::VPC'
Properties:
CidrBlock: '192.168.1.0/24'
EnableDnsSupport: true
EnableDnsHostnames: true
InstanceTenancy: default
Tags:
- Key: 'Name'
Value: 'naoki-vpc'
# サブネットの作成
NaokiSubnetPrivateWeb2a:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId:
Ref: 'NaokiVpc'
CidrBlock: '192.168.1.128/28'
AvailabilityZone: 'ap-northeast-2a'
Tags:
- Key: 'Name'
Value: 'naoki-subnet-private-web-2a'
NaokiSubnetProtectDb2a:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId:
Ref: 'NaokiVpc'
CidrBlock: '192.168.1.160/28'
AvailabilityZone: 'ap-northeast-2a'
Tags:
- Key: 'Name'
Value: 'naoki-subnet-protect-db-2a'
NaokiSubnetPrivateWeb2b:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId:
Ref: 'NaokiVpc'
CidrBlock: '192.168.1.144/28'
AvailabilityZone: 'ap-northeast-2b'
Tags:
- Key: 'Name'
Value: 'naoki-subnet-private-web-2b'
NaokiSubnetProtectDb2b:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId:
Ref: 'NaokiVpc'
CidrBlock: '192.168.1.176/28'
AvailabilityZone: 'ap-northeast-2b'
Tags:
- Key: 'Name'
Value: 'naoki-subnet-protect-db-2b'
NaokiSubnetPublic2a:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId:
Ref: 'NaokiVpc'
CidrBlock: '192.168.1.0/28'
AvailabilityZone: 'ap-northeast-2a'
Tags:
- Key: 'Name'
Value: 'naoki-subnet-public-2a'
NaokiSubnetPublic2b:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId:
Ref: 'NaokiVpc'
CidrBlock: '192.168.1.16/28'
AvailabilityZone: 'ap-northeast-2b'
Tags:
- Key: 'Name'
Value: 'naoki-subnet-public-2b'
# IGWの作成
NaokiIgw:
Type: 'AWS::EC2::InternetGateway'
Properties:
Tags:
- Key: 'Name'
Value: 'naoki-igw'
# IGWのアタッチ
NaokiVpcGatewayAttachment:
Type: 'AWS::EC2::VPCGatewayAttachment'
Properties:
VpcId:
Ref: 'NaokiVpc'
InternetGatewayId:
Ref: 'NaokiIgw'
# EIPの作成
NaokiNatEip2a:
Type: 'AWS::EC2::EIP'
Properties:
Domain: vpc
Tags:
- Key: 'Name'
Value: 'naoki-nat-eip-2a'
NaokiNatEip2b:
Type: 'AWS::EC2::EIP'
Properties:
Domain: vpc
Tags:
- Key: 'Name'
Value: 'naoki-nat-eip-2b'
# NATの作成
NaokiNatGateway2a:
Type: 'AWS::EC2::NatGateway'
Properties:
AllocationId:
Fn::GetAtt:
- 'NaokiNatEip2a'
- 'AllocationId'
SubnetId:
Ref: 'NaokiSubnetPublic2a'
Tags:
- Key: 'Name'
Value: 'naoki-nat-gateway-2a'
NaokiNatGateway2b:
Type: 'AWS::EC2::NatGateway'
Properties:
AllocationId:
Fn::GetAtt:
- 'NaokiNatEip2b'
- 'AllocationId'
SubnetId:
Ref: 'NaokiSubnetPublic2b'
Tags:
- Key: 'Name'
Value: 'naoki-nat-gateway-2b'
# NACLの作成
NaokiNacl:
Type: 'AWS::EC2::NetworkAcl'
Properties:
VpcId:
Ref: 'NaokiVpc'
Tags:
- Key: 'Name'
Value: 'naoki-nacl'
NaokiNaclEntryInbound:
Type: 'AWS::EC2::NetworkAclEntry'
Properties:
CidrBlock: '0.0.0.0/0'
Egress: false
NetworkAclId:
Ref: 'NaokiNacl'
PortRange:
From: 0
To: 65535
Protocol: '-1'
RuleAction: 'allow'
RuleNumber: 100
NaokiNaclEntryOutbound:
Type: 'AWS::EC2::NetworkAclEntry'
Properties:
CidrBlock: '0.0.0.0/0'
Egress: true
NetworkAclId:
Ref: 'NaokiNacl'
PortRange:
From: 0
To: 65535
Protocol: '-1'
RuleAction: 'allow'
RuleNumber: 100
# NACLのアタッチ
NaokiNaclAssocPublic2a:
Type: 'AWS::EC2::SubnetNetworkAclAssociation'
Properties:
SubnetId:
Ref: 'NaokiSubnetPublic2a'
NetworkAclId:
Ref: 'NaokiNacl'
NaokiNaclAssocPublic2b:
Type: 'AWS::EC2::SubnetNetworkAclAssociation'
Properties:
SubnetId:
Ref: 'NaokiSubnetPublic2b'
NetworkAclId:
Ref: 'NaokiNacl'
NaokiNaclAssocPrivateWeb2a:
Type: 'AWS::EC2::SubnetNetworkAclAssociation'
Properties:
SubnetId:
Ref: 'NaokiSubnetPrivateWeb2a'
NetworkAclId:
Ref: 'NaokiNacl'
NaokiNaclAssocPrivateWeb2b:
Type: 'AWS::EC2::SubnetNetworkAclAssociation'
Properties:
SubnetId:
Ref: 'NaokiSubnetPrivateWeb2b'
NetworkAclId:
Ref: 'NaokiNacl'
NaokiNaclAssocProtectDb2a:
Type: 'AWS::EC2::SubnetNetworkAclAssociation'
Properties:
SubnetId:
Ref: 'NaokiSubnetProtectDb2a'
NetworkAclId:
Ref: 'NaokiNacl'
NaokiNaclAssocProtectDb2b:
Type: 'AWS::EC2::SubnetNetworkAclAssociation'
Properties:
SubnetId:
Ref: 'NaokiSubnetProtectDb2b'
NetworkAclId:
Ref: 'NaokiNacl'
# ルートテーブルの作成
NaokiRtbPrivateWeb2a:
Type: 'AWS::EC2::RouteTable'
Properties:
VpcId:
Ref: 'NaokiVpc'
Tags:
- Key: 'Name'
Value: 'naoki-rtb-private-web-2a'
NaokiRtbPrivateWeb2b:
Type: 'AWS::EC2::RouteTable'
Properties:
VpcId:
Ref: 'NaokiVpc'
Tags:
- Key: 'Name'
Value: 'naoki-rtb-private-web-2b'
NaokiRtbPublic:
Type: 'AWS::EC2::RouteTable'
Properties:
VpcId:
Ref: 'NaokiVpc'
Tags:
- Key: 'Name'
Value: 'naoki-rtb-public'
NaokiRtbProtectDb:
Type: 'AWS::EC2::RouteTable'
Properties:
VpcId:
Ref: 'NaokiVpc'
Tags:
- Key: 'Name'
Value: 'naoki-rtb-protect-db'
# ルートの作成
NaokiRoutePublic:
Type: 'AWS::EC2::Route'
Properties:
RouteTableId:
Ref: 'NaokiRtbPublic'
DestinationCidrBlock: '0.0.0.0/0'
GatewayId:
Ref: 'NaokiIgw'
NaokiRoutePrivateWeb2a:
Type: 'AWS::EC2::Route'
Properties:
RouteTableId:
Ref: 'NaokiRtbPrivateWeb2a'
DestinationCidrBlock: '0.0.0.0/0'
NatGatewayId:
Ref: 'NaokiNatGateway2a'
NaokiRoutePrivateWeb2b:
Type: 'AWS::EC2::Route'
Properties:
RouteTableId:
Ref: 'NaokiRtbPrivateWeb2b'
DestinationCidrBlock: '0.0.0.0/0'
NatGatewayId:
Ref: 'NaokiNatGateway2b'
# ルートテーブルのアソシエーション
NaokiRtbAssocPrivateWeb2a:
Type: 'AWS::EC2::SubnetRouteTableAssociation'
Properties:
SubnetId:
Ref: 'NaokiSubnetPrivateWeb2a'
RouteTableId:
Ref: 'NaokiRtbPrivateWeb2a'
NaokiRtbAssocPrivateWeb2b:
Type: 'AWS::EC2::SubnetRouteTableAssociation'
Properties:
SubnetId:
Ref: 'NaokiSubnetPrivateWeb2b'
RouteTableId:
Ref: 'NaokiRtbPrivateWeb2b'
NaokiRtbAssocPublic2a:
Type: 'AWS::EC2::SubnetRouteTableAssociation'
Properties:
SubnetId:
Ref: 'NaokiSubnetPublic2a'
RouteTableId:
Ref: 'NaokiRtbPublic'
NaokiRtbAssocPublic2b:
Type: 'AWS::EC2::SubnetRouteTableAssociation'
Properties:
SubnetId:
Ref: 'NaokiSubnetPublic2b'
RouteTableId:
Ref: 'NaokiRtbPublic'
NaokiRtbAssocProtectDb2a:
Type: 'AWS::EC2::SubnetRouteTableAssociation'
Properties:
SubnetId:
Ref: 'NaokiSubnetProtectDb2a'
RouteTableId:
Ref: 'NaokiRtbProtectDb'
NaokiRtbAssocProtectDb2b:
Type: 'AWS::EC2::SubnetRouteTableAssociation'
Properties:
SubnetId:
Ref: 'NaokiSubnetProtectDb2b'
RouteTableId:
Ref: 'NaokiRtbProtectDb'
6.ソースコード詳細
6-1.VPC作成
- AWSTemplateFormatVersion: AWS CloudFormationテンプレートのバージョンを指定するためのフィールドです。
※通常、2010-09-09のバージョンが使用されます。 - 下記図が詳細内容です。
使用するオプション | 設定値 | 説明 |
---|---|---|
CidrBlock | 192.168.1.0/24 | VPCのCIDRの指定 |
EnableDnsHostnames | true | DNS解決がサポートされているかどうか |
EnableDnsSupport | true | パブリックIPアドレスを持つインスタンスが、対応するパブリックDNSホスト名を取得するかどうか |
InstanceTenancy | default | シングルテナントの専用ハードウェアを使用するかどうか |
Tags | Name :naoki-vpc |
タグのキーと値を設定 |
AWSTemplateFormatVersion: '2010-09-09'
Resources:
# VPCの作成
NaokiVpc:
Type: 'AWS::EC2::VPC'
Properties:
CidrBlock: '192.168.1.0/24'
EnableDnsSupport: true
EnableDnsHostnames: true
InstanceTenancy: default
Tags:
- Key: 'Name'
Value: 'naoki-vpc'
6-2.サブネットの作成
- 最初にVPCを作成する際にはパブリックやプライベートを設定する部分はないので(セキュリティグループやルートテーブルで設定します)それぞれのAZに各3つのサブネットを作成します。
使用するオプション | 設定値 | 説明 |
---|---|---|
Type | AWS::EC2::Subnet | サブネットを作成するためのデフォルトの記述 |
VpcId | Ref: ‘NaokiVpc’ | 参照元のVpc |
CidrBlock | 構成図を参照 | サブネットのCIDRを指定 |
AvailabilityZone | ap-northeast-2a ap-northeast-2b |
アベイラビリティゾーンの指定 |
Tags | Name: 下記ソースコード参照 |
タグのキーと値を設定 |
# サブネットの作成
NaokiSubnetPrivateWeb2a:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId:
Ref: 'NaokiVpc'
CidrBlock: '192.168.1.128/28'
AvailabilityZone: 'ap-northeast-2a'
Tags:
- Key: 'Name'
Value: 'naoki-subnet-private-web-2a'
NaokiSubnetProtectDb2a:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId:
Ref: 'NaokiVpc'
CidrBlock: '192.168.1.160/28'
AvailabilityZone: 'ap-northeast-2a'
Tags:
- Key: 'Name'
Value: 'naoki-subnet-protect-db-2a'
NaokiSubnetPrivateWeb2b:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId:
Ref: 'NaokiVpc'
CidrBlock: '192.168.1.144/28'
AvailabilityZone: 'ap-northeast-2b'
Tags:
- Key: 'Name'
Value: 'naoki-subnet-private-web-2b'
NaokiSubnetProtectDb2b:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId:
Ref: 'NaokiVpc'
CidrBlock: '192.168.1.176/28'
AvailabilityZone: 'ap-northeast-2b'
Tags:
- Key: 'Name'
Value: 'naoki-subnet-protect-db-2b'
NaokiSubnetPublic2a:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId:
Ref: 'NaokiVpc'
CidrBlock: '192.168.1.0/28'
AvailabilityZone: 'ap-northeast-2a'
Tags:
- Key: 'Name'
Value: 'naoki-subnet-public-2a'
NaokiSubnetPublic2b:
Type: 'AWS::EC2::Subnet'
Properties:
VpcId:
Ref: 'NaokiVpc'
CidrBlock: '192.168.1.16/28'
AvailabilityZone: 'ap-northeast-2b'
Tags:
- Key: 'Name'
Value: 'naoki-subnet-public-2b'
6-3.IGWの作成
- VPCを設置するにあたってはIGWも作成しなければなりません。通常NATゲートウェイを使用する場合はNATゲートウェイはIGWを使用して通信します。
使用するオプション | 設定値 | 説明 |
---|---|---|
Type | AWS::EC2::InternetGateway | IGWを作成するためのデフォルトの記述 |
Tags | Name : 下記ソースコード参照 | タグのキーと値を設定 |
# IGWの作成
NaokiIgw:
Type: 'AWS::EC2::InternetGateway'
Properties:
Tags:
- Key: 'Name'
Value: 'naoki-igw'
6-4.IGWのアタッチ
- IGWを作成したらVPCにアタッチするように指示をする必要があります。
使用するオプション | 設定値 | 説明 |
---|---|---|
Type | AWS::EC2::VPCGatewayAttachment | IGWをアタッチするためのデフォルトの記述 |
VpcId | Ref: ‘NaokiVpc’ | 参照先VPCを指定 |
InternetGatewayId | Ref: ‘NaokiIgw’ | 参照先IGWを指定 |
# IGWのアタッチ
NaokiVpcGatewayAttachment:
Type: 'AWS::EC2::VPCGatewayAttachment'
Properties:
VpcId:
Ref: 'NaokiVpc'
InternetGatewayId:
Ref: 'NaokiIgw'
6-5.EIPの作成
- パブリックサブネットに設置するNATゲートウェイ用にEIPを作成しなくてはなりません。
→今回は2つのNATゲートウェイを使用するので2つ作成します。
使用するオプション | 設定値 | 説明 |
---|---|---|
Type | AWS::EC2::EIP | EIPを作成するためのデフォルトの記述 |
Domain | vpc | EIPがVPCで使用されることを明記 |
Tags | Name : 下記ソースコード参照 | タグのキーと値を設定 |
# EIPの作成
NaokiNatEip2a:
Type: 'AWS::EC2::EIP'
Properties:
Domain: vpc
Tags:
- Key: 'Name'
Value: 'naoki-nat-eip-2a'
NaokiNatEip2b:
Type: 'AWS::EC2::EIP'
Properties:
Domain: vpc
Tags:
- Key: 'Name'
Value: 'naoki-nat-eip-2b'
6-6.NATゲートウェイの作成
- 先ほど作成したEIPを使用するようにNATゲートウェイを作成します。
使用するオプション | 設定値 | 説明 |
---|---|---|
Type | AWS::EC2::NatGateway | NATゲートウェイを作成するためのデフォルトの記述 |
Fn::GetAtt | NaokiNatEip2a NaokiNatEip2b |
参照先EIPを指定 |
Fn::GetAtt | AllocationId | 属性を指定。AllocationIdはElastic IPがAWSにおいて一意に識別されるID |
SubnetId | Ref: NaokiSubnetPublic2a NaokiSubnetPublic2b |
配置するサブネットを指定 |
Tags | Name : 下記ソースコード参照 |
タグのキーと値を設定 |
# NATの作成
NaokiNatGateway2a:
Type: 'AWS::EC2::NatGateway'
Properties:
AllocationId:
Fn::GetAtt:
- 'NaokiNatEip2a'
- 'AllocationId'
SubnetId:
Ref: 'NaokiSubnetPublic2a'
Tags:
- Key: 'Name'
Value: 'naoki-nat-gateway-2a'
NaokiNatGateway2b:
Type: 'AWS::EC2::NatGateway'
Properties:
AllocationId:
Fn::GetAtt:
- 'NaokiNatEip2b'
- 'AllocationId'
SubnetId:
Ref: 'NaokiSubnetPublic2b'
Tags:
- Key: 'Name'
Value: 'naoki-nat-gateway-2b'
6-7.ネットワークACLの作成
- VPC作成時には必ず作成する項目の一つです。
今回はセキュリティグループにて設定を強固にするためインバウンドアウトともに全トラフィックを許可します。
※NACL作成用
使用するオプション | 設定値 | 説明 |
---|---|---|
Type | AWS::EC2::NatGateway | NATゲートウェイを作成するためのデフォルトの記述 |
Fn::GetAtt | NaokiNatEip2a NaokiNatEip2b |
参照先EIPを指定 |
Tags | Name : 下記ソースコード参照 | タグのキーと値を設定 |
※NACL詳細用
使用するオプション | 設定値 | 説明 |
---|---|---|
Type | AWS::EC2::NetworkAclEntry | NACLを設定するためのデフォルトの記述 |
CidrBloc | 0.0.0.0/0 | 全トラフィックを許可 |
Egress | false | インバウンドトラフィックを意味する |
Egress | true | アウトバウンドトラフィックを意味する |
NetworkAclId | NaokiNacl | 参照先NACLを指定 |
PortRange | From: 0 To: 65535 |
プロトコル番号の指定(全ポート) |
Protocol | -1 | 全てのプロトコルを対象 |
RuleAction | allow | 許可か拒否(今回は許可) |
RuleNumber | 100 | ACL内でのルールの優先順位で番号が小さいほど優先度が高くなります |
NaokiNacl:
Type: 'AWS::EC2::NetworkAcl'
Properties:
VpcId:
Ref: 'NaokiVpc'
Tags:
- Key: 'Name'
Value: 'naoki-nacl'
NaokiNaclEntryInbound:
Type: 'AWS::EC2::NetworkAclEntry'
Properties:
CidrBlock: '0.0.0.0/0'
Egress: false
NetworkAclId:
Ref: 'NaokiNacl'
PortRange:
From: 0
To: 65535
Protocol: '-1'
RuleAction: 'allow'
RuleNumber: 100
NaokiNaclEntryOutbound:
Type: 'AWS::EC2::NetworkAclEntry'
Properties:
CidrBlock: '0.0.0.0/0'
Egress: true
NetworkAclId:
Ref: 'NaokiNacl'
PortRange:
From: 0
To: 65535
Protocol: '-1'
RuleAction: 'allow'
RuleNumber: 100
6-8.NACLのアタッチ
- 上記にて作成したNACLをそれぞれのサブネットへアタッチします。
使用するオプション | 設定値 | 説明 |
---|---|---|
Type | AWS::EC2::SubnetNetworkAclAssociation | NACLをアタッチするためのデフォルトの記述 |
SubnetId | 下記ソースコード参照 | NACLをアタッチするためのサブネットを指定 |
NetworkAclId | NaokiNacl | サブネットへアタッチするNACLを指定 |
# NACLのアタッチ
NaokiNaclAssocPublic2a:
Type: 'AWS::EC2::SubnetNetworkAclAssociation'
Properties:
SubnetId:
Ref: 'NaokiSubnetPublic2a'
NetworkAclId:
Ref: 'NaokiNacl'
NaokiNaclAssocPublic2b:
Type: 'AWS::EC2::SubnetNetworkAclAssociation'
Properties:
SubnetId:
Ref: 'NaokiSubnetPublic2b'
NetworkAclId:
Ref: 'NaokiNacl'
NaokiNaclAssocPrivateWeb2a:
Type: 'AWS::EC2::SubnetNetworkAclAssociation'
Properties:
SubnetId:
Ref: 'NaokiSubnetPrivateWeb2a'
NetworkAclId:
Ref: 'NaokiNacl'
NaokiNaclAssocPrivateWeb2b:
Type: 'AWS::EC2::SubnetNetworkAclAssociation'
Properties:
SubnetId:
Ref: 'NaokiSubnetPrivateWeb2b'
NetworkAclId:
Ref: 'NaokiNacl'
NaokiNaclAssocProtectDb2a:
Type: 'AWS::EC2::SubnetNetworkAclAssociation'
Properties:
SubnetId:
Ref: 'NaokiSubnetProtectDb2a'
NetworkAclId:
Ref: 'NaokiNacl'
NaokiNaclAssocProtectDb2b:
Type: 'AWS::EC2::SubnetNetworkAclAssociation'
Properties:
SubnetId:
Ref: 'NaokiSubnetProtectDb2b'
NetworkAclId:
Ref: 'NaokiNacl'
6-9ルートテーブルの作成
- 最後にサブネットが使用するルートテーブルを作成します。
上記構成図にてルートテーブルの詳細を記載しておりますので参照ください。
使用するオプション | 設定値 | 説明 |
---|---|---|
Type | AWS::EC2::RouteTable | ルートテーブルを作成するためのデフォルトの記述 |
VpcId | Ref: ‘NaokiVpc’ | 参照先VPCの指定 |
Tags | Name : 下記ソースコード参照 | タグのキーと値を設定 |
# ルートテーブルの作成
NaokiRtbPrivateWeb2a:
Type: 'AWS::EC2::RouteTable'
Properties:
VpcId:
Ref: 'NaokiVpc'
Tags:
- Key: 'Name'
Value: 'naoki-rtb-private-web-2a'
NaokiRtbPrivateWeb2b:
Type: 'AWS::EC2::RouteTable'
Properties:
VpcId:
Ref: 'NaokiVpc'
Tags:
- Key: 'Name'
Value: 'naoki-rtb-private-web-2b'
NaokiRtbPublic:
Type: 'AWS::EC2::RouteTable'
Properties:
VpcId:
Ref: 'NaokiVpc'
Tags:
- Key: 'Name'
Value: 'naoki-rtb-public'
NaokiRtbProtectDb:
Type: 'AWS::EC2::RouteTable'
Properties:
VpcId:
Ref: 'NaokiVpc'
Tags:
- Key: 'Name'
Value: 'naoki-rtb-protect-db'
6-10.ルートの作成
- 次に上記で作成したルートテーブルのルートを作成する必要があります。
上記構成図にてルートテーブルの詳細を記載しておりますので参照ください。
→今回はパブリックサブネット・プライベートサブネット・プロテクトサブネットに分ける必要があるため、パブリックサブネット(NAT)にはIGWへのルート、EC2インスタンス配置予定のプライベートサブネットへはNATへのルート、RDS配置予定のプロテクトサブネットにはプライベートサブネットのEC2のみとの通信のためlocalルートのみを指定します。
※なお、既存の設定ではルートテーブルはlocalのみの許可となるためRDS用のルートはここでは指定する必要はありません。
使用するオプション | 設定値 | 説明 |
---|---|---|
Type | AWS::EC2::Route | ルートテーブルを設定するためのデフォルトの記述 |
RouteTableId | Ref: ‘下記ソースコード参照‘ |
参照先ルートテーブルの指定 |
DestinationCidrBlock | 0.0.0.0/0 | トラフィックをルーティングする宛先ネットワークのCIDRブロック |
GatewayId | Ref: 下記ソースコード参照 |
宛先ゲートウェイの指定 |
NatGatewayId | Ref: 下記ソースコード参照 |
宛先NATゲートウェイの指定 |
NaokiRoutePublic:
Type: 'AWS::EC2::Route'
Properties:
RouteTableId:
Ref: 'NaokiRtbPublic'
DestinationCidrBlock: '0.0.0.0/0'
GatewayId:
Ref: 'NaokiIgw'
NaokiRoutePrivateWeb2a:
Type: 'AWS::EC2::Route'
Properties:
RouteTableId:
Ref: 'NaokiRtbPrivateWeb2a'
DestinationCidrBlock: '0.0.0.0/0'
NatGatewayId:
Ref: 'NaokiNatGateway2a'
NaokiRoutePrivateWeb2b:
Type: 'AWS::EC2::Route'
Properties:
RouteTableId:
Ref: 'NaokiRtbPrivateWeb2b'
DestinationCidrBlock: '0.0.0.0/0'
NatGatewayId:
Ref: 'NaokiNatGateway2b'
6-11.ルートテーブルのアタッチ
- 最後に作成したルートテーブルを各サブネットにアタッチします。
使用するオプション | 設定値 | 説明 |
---|---|---|
Type | ‘AWS::EC2::SubnetRouteTableAssociation | ルートテーブルをアタッチするためのデフォルトの記述 |
SubnetId | Ref: ‘下記ソースコード参照‘ | 参照先サブネットの指定 |
RouteTableId | Ref: ‘下記ソースコード参照‘ | 参照先ルートテーブルを指定 |
NaokiRtbAssocPrivateWeb2a:
Type: 'AWS::EC2::SubnetRouteTableAssociation'
Properties:
SubnetId:
Ref: 'NaokiSubnetPrivateWeb2a'
RouteTableId:
Ref: 'NaokiRtbPrivateWeb2a'
NaokiRtbAssocPrivateWeb2b:
Type: 'AWS::EC2::SubnetRouteTableAssociation'
Properties:
SubnetId:
Ref: 'NaokiSubnetPrivateWeb2b'
RouteTableId:
Ref: 'NaokiRtbPrivateWeb2b'
NaokiRtbAssocPublic2a:
Type: 'AWS::EC2::SubnetRouteTableAssociation'
Properties:
SubnetId:
Ref: 'NaokiSubnetPublic2a'
RouteTableId:
Ref: 'NaokiRtbPublic'
NaokiRtbAssocPublic2b:
Type: 'AWS::EC2::SubnetRouteTableAssociation'
Properties:
SubnetId:
Ref: 'NaokiSubnetPublic2b'
RouteTableId:
Ref: 'NaokiRtbPublic'
NaokiRtbAssocProtectDb2a:
Type: 'AWS::EC2::SubnetRouteTableAssociation'
Properties:
SubnetId:
Ref: 'NaokiSubnetProtectDb2a'
RouteTableId:
Ref: 'NaokiRtbProtectDb'
NaokiRtbAssocProtectDb2b:
Type: 'AWS::EC2::SubnetRouteTableAssociation'
Properties:
SubnetId:
Ref: 'NaokiSubnetProtectDb2b'
RouteTableId:
Ref: 'NaokiRtbProtectDb'
7.感想
Terraformでの作成経験があるため、特に時間をかけることなく作成しましたが、作成を通じて感じたことは、ソースコードがまさに設計書であるということです。何を作成し、どのような設定を行うべきかについては、コンソールとIaC(Infrastructure as Code)を併用することで、より深く理解できると感じました。今後も知識や技術の向上を目指して、これらの手法を積極的に活用していきたいと考えています。