前回に引き続き、今回もVPC周り。
以下のVPCコンポーネントまとめて作って、VPCへアタッチしていく。
– InternetGateway
– NatGatway
– ルートテーブル(メイン/カスタム)
– NWACL
※長くなったので、ルートテーブル/ACLはひとまず空のままにする。。
Contents
VPCコンポーネント設計
InternetGateway
作ってVPCアタッチするだけだけど、一応Name付けて情報整理しとく。
Name(logical-id) | アタッチするVPC |
---|---|
igwmainVPC | mainVPC |
NatGateway
NatGatewayでは、配置するサブネット、EIPの設定も一緒に指定する。
今回EIPはAWSから払い出されるものを指定するだけなんだけれど、設定項目として整理しとく。
EIPは任意のものを取得し、それをNatGatewayに割り当てるように記述する。
Name(logical-id) | 配置サブネット | EIP |
---|---|---|
ngwmainVPC | pubWEB1 | AWSから払い出し |
ルートテーブル
デフォルトのルートテーブルはCloudFormationでは扱えないらしいので未使用にする。
プライベートサブネット用、パブリックサブネット用のルートテーブルをカスタムで新規作成して、 各サブネットに明示的にアタッチする。
プライベートサブネット用テーブルはNatGatewayをデフォルトの通信先。
パブリックサブネット用テーブルはInternetGateWayをデフォルトの通信先にする。
種別 | Name(logical-id) | 種別 | サブネットの関連付け | デフォルト通信先 |
---|---|---|---|---|
カスタム | rtprv | prv | prvAP1,prvAP2,prvDB1,prvDB2 | igwmainVPC |
カスタム | rtpub | pub | pubWEB1,pubWEB2 | ngwmainVPC |
NW ACL
ありがたーいことにAWS公式でNWACLのベストプラクティスがある。
基本的なところは参考にしつつ、今回の要件に沿うように設計する。
ルールの中身はVPC内に配置するリソースに応じて定義するとして、まずは各箇所で使うACLを定義。
デフォルトのNWACLはCloudFormationでの触り方が分からなかったので扱わないことにしておき、 カスタムのNWACLを各層ごとに定義しておく。
種別 | Name | アタッチ対象 | 制御 |
---|---|---|---|
default | vpcdefault | mainVPC | デフォルト(全通信許可) |
custom | naclpubWEB | pubWEB1/2 | ※次回検討 |
custom | naclprvAP | prvAP1/2 | ※次回検討 |
custom | aclprvDB | prvDB1/2 | ※次回検討 |
CloudFormationテンプレート
完成したテンプレートはこちら。
AWSTemplateFormatVersion: 2010-09-09
Description: "CloudFormation VPCtest"
Mappings:
TagsMap:
EnvName:
Name: "VPCtest"
VPCCiderMap:
mainVPC:
CidrBlock: "172.16.0.0/18"
SubnetMap:
pubWEB1:
CidrBlock: "172.16.10.0/24"
pubWEB2:
CidrBlock: "172.16.11.0/24"
prvAP1:
CidrBlock: "172.16.20.0/24"
prvAP2:
CidrBlock: "172.16.21.0/24"
prvDB1:
CidrBlock: "172.16.30.0/24"
prvDB2:
CidrBlock: "172.16.31.0/24"
Resources:
# VPC
mainVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: !FindInMap
- VPCCiderMap
- mainVPC
- CidrBlock
EnableDnsSupport: true
EnableDnsHostnames: true
InstanceTenancy: 'default'
Tags:
-
Key: Name
Value: !FindInMap
- TagsMap
- EnvName
- Name
# Subnet
pubWEB1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref "mainVPC"
CidrBlock: !FindInMap
- SubnetMap
- pubWEB1
- CidrBlock
AvailabilityZone: !Select
- 0
- !GetAZs
Tags:
-
Key: Name
Value: !FindInMap
- TagsMap
- EnvName
- Name
pubWEB2:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref "mainVPC"
CidrBlock: !FindInMap
- SubnetMap
- pubWEB2
- CidrBlock
AvailabilityZone: !Select
- 1
- !GetAZs
Tags:
-
Key: Name
Value: !FindInMap
- TagsMap
- EnvName
- Name
prvAP1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref "mainVPC"
CidrBlock: !FindInMap
- SubnetMap
- prvAP1
- CidrBlock
AvailabilityZone: !Select
- 0
- !GetAZs
Tags:
-
Key: Name
Value: !FindInMap
- TagsMap
- EnvName
- Name
prvAP2:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref "mainVPC"
CidrBlock: !FindInMap
- SubnetMap
- prvAP2
- CidrBlock
AvailabilityZone: !Select
- 1
- !GetAZs
Tags:
-
Key: Name
Value: !FindInMap
- TagsMap
- EnvName
- Name
prvDB1:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref "mainVPC"
CidrBlock: !FindInMap
- SubnetMap
- prvDB1
- CidrBlock
AvailabilityZone: !Select
- 0
- !GetAZs
Tags:
-
Key: Name
Value: !FindInMap
- TagsMap
- EnvName
- Name
prvDB2:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref "mainVPC"
CidrBlock: !FindInMap
- SubnetMap
- prvDB2
- CidrBlock
AvailabilityZone: !Select
- 1
- !GetAZs
Tags:
-
Key: Name
Value: !FindInMap
- TagsMap
- EnvName
- Name
# InternetGateway
igwmainVPC:
Type: AWS::EC2::InternetGateway
Properties:
Tags:
-
Key: Name
Value: !FindInMap
- TagsMap
- EnvName
- Name
AttachGateway:
Type: AWS::EC2::VPCGatewayAttachment
Properties:
VpcId:
Ref: mainVPC
InternetGatewayId:
Ref: igwmainVPC
# NatGateway
ngwpubWEB1:
Type: AWS::EC2::NatGateway
Properties:
AllocationId:
Fn::GetAtt:
- ngwpubWEB1EIP
- AllocationId
SubnetId:
Ref: pubWEB1
Tags:
-
Key: Name
Value: !FindInMap
- TagsMap
- EnvName
- Name
ngwpubWEB1EIP:
DependsOn: AttachGateway
Type: AWS::EC2::EIP
Properties:
Domain: vpc
Tags:
-
Key: Name
Value: !FindInMap
- TagsMap
- EnvName
- Name
ngwpubWEB2:
Type: AWS::EC2::NatGateway
Properties:
AllocationId:
Fn::GetAtt:
- ngwpubWEB2EIP
- AllocationId
SubnetId:
Ref: pubWEB2
Tags:
-
Key: Name
Value: !FindInMap
- TagsMap
- EnvName
- Name
ngwpubWEB2EIP:
DependsOn: AttachGateway
Type: AWS::EC2::EIP
Properties:
Domain: vpc
Tags:
-
Key: Name
Value: !FindInMap
- TagsMap
- EnvName
- Name
# Route Tables
rtprv1:
Type: AWS::EC2::RouteTable
Properties:
VpcId:
Ref: mainVPC
Tags:
-
Key: Name
Value: !FindInMap
- TagsMap
- EnvName
- Name
rtprv1route1:
Type: AWS::EC2::Route
Properties:
RouteTableId:
Ref: rtprv1
DestinationCidrBlock: 0.0.0.0/0
NatGatewayId:
Ref: ngwpubWEB1
rtprv2:
Type: AWS::EC2::RouteTable
Properties:
VpcId:
Ref: mainVPC
Tags:
-
Key: Name
Value: !FindInMap
- TagsMap
- EnvName
- Name
rtprv2route1:
Type: AWS::EC2::Route
Properties:
RouteTableId:
Ref: rtprv2
DestinationCidrBlock: 0.0.0.0/0
NatGatewayId:
Ref: ngwpubWEB2
rtpub:
Type: AWS::EC2::RouteTable
Properties:
VpcId:
Ref: mainVPC
Tags:
-
Key: Name
Value: !FindInMap
- TagsMap
- EnvName
- Name
rtpubroute1:
Type: AWS::EC2::Route
Properties:
RouteTableId:
Ref: rtpub
DestinationCidrBlock: 0.0.0.0/0
GatewayId:
Ref: igwmainVPC
# RouteTable Association
pubWEB1rtAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId:
Ref: pubWEB1
RouteTableId:
Ref: rtpub
pubWEB2rtAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId:
Ref: pubWEB2
RouteTableId:
Ref: rtpub
prbAP1rtAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId:
Ref: prvAP1
RouteTableId:
Ref: rtprv1
prbAP2rtAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId:
Ref: prvAP2
RouteTableId:
Ref: rtprv2
#NW ACL
naclpubWEB:
Type: AWS::EC2::NetworkAcl
Properties:
VpcId:
Ref: mainVPC
Tags:
-
Key: Name
Value: !FindInMap
- TagsMap
- EnvName
- Name
naclprvAP:
Type: AWS::EC2::NetworkAcl
Properties:
VpcId:
Ref: mainVPC
Tags:
-
Key: Name
Value: !FindInMap
- TagsMap
- EnvName
- Name
naclprvDB:
Type: AWS::EC2::NetworkAcl
Properties:
VpcId:
Ref: mainVPC
Tags:
-
Key: Name
Value: !FindInMap
- TagsMap
- EnvName
- Name
pubWEB1naclAssociatoin:
Type: AWS::EC2::SubnetNetworkAclAssociation
Properties:
SubnetId:
Ref: pubWEB1
NetworkAclId:
Ref: naclpubWEB
pubWEB2naclAssociatoin:
Type: AWS::EC2::SubnetNetworkAclAssociation
Properties:
SubnetId:
Ref: pubWEB2
NetworkAclId:
Ref: naclpubWEB
prvAP1naclAssociatoin:
Type: AWS::EC2::SubnetNetworkAclAssociation
Properties:
SubnetId:
Ref: prvAP1
NetworkAclId:
Ref: naclprvAP
prvAP2naclAssociatoin:
Type: AWS::EC2::SubnetNetworkAclAssociation
Properties:
SubnetId:
Ref: prvAP2
NetworkAclId:
Ref: naclprvAP
prvDB1naclAssociatoin:
Type: AWS::EC2::SubnetNetworkAclAssociation
Properties:
SubnetId:
Ref: prvDB1
NetworkAclId:
Ref: naclprvDB
prvDB2naclAssociatoin:
Type: AWS::EC2::SubnetNetworkAclAssociation
Properties:
SubnetId:
Ref: prvDB2
NetworkAclId:
Ref: naclprvDB
長くなってきたので一旦ここまで。。
気が向いたらスタック分割やってみる。