この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。
皆様こんにちは。
今回はCloudFormatonを利用して高可用性アーキテクトの構築をしていきます。
この記事ではVPCの作成を行います。
1.高可用性アーキテクト構築目次
2.VPCについて
Amazon Virtual Private Cloud (Amazon VPC) を使用すると、定義した仮想ネットワーク内で AWS リソースを起動できます。仮想ネットワークは、お客様自身のデータセンターで運用されていた従来のネットワークによく似ていますが、 AWS のスケーラブルなインフラストラクチャを使用できるというメリットがあります。
参照:公式ドキュメント:VPC
- AWS上のハードウェアやネットワークの基盤はユーザー全体に「共有」されているため、VPCを使うことにより論理的に分割された特定のユーザーだけのプライベートネットワーク空間を作成することにより独自のセキュアなネットワークを構築できます。
- リソースの配置、持続性、セキュリティなど、仮想ネットワーク環境をフル制御できます。
- 類似サービスとしてGCPの「Virtual Private Cloud」、Azureの「Azure Virtual Network」等が挙げられます。
今回はVPCの中に2つのAZの配置をし片方のAZに障害が起きた際に、もう1つのAZに通信することにより、高可用性のある設計を実現させます。
VPCができるまで
- ”EC2-Classic”はEC2のオリジナルリソースであり、インスタンスは単一のフラットネットワークで稼働してました。IPアドレスの指定や設定、VPCのように複数のIPアドレスをインスタンスに割り当てはできません。1つ1つ選択し設定する必要があります。
- また、ElasticIPアドレスを停止しますと、インスタンスの関連付けが解除されてしまいます。それに対し、VPCは停止しても関連付けはされず維持できます。
- EC2-Classicは、インスタンスはインターネットにアクセスできます。VPCの場合、パブリックIPアドレスを受け取り、インターネットゲートウェイはVPCにアタッチでき、サブネットにインターネットゲートウェイへのルートがあります。デフォルトでインスタンスもインターネットにもアクセスできます。
- VPCはEC2-Classicに比べ、各種設定項目が省けており、インターネットと接続する際にパブリックサブネット、プライベートサブネットに区別することによりセキュアにインターネット接続が容易になり汎用性が増しました。
*2022年8月15日にEC2-Classicの提供終了します。
3.構築したいVPC構成図
4.全体構築ソースコード
AWSTemplateFormatVersion: "2010-09-09"
Resources:
EC2VPC:
Type: "AWS::EC2::VPC"
Properties:
CidrBlock: "10.0.0.0/16"
EnableDnsSupport: true
EnableDnsHostnames: true
InstanceTenancy: "default"
Tags:
-
Key: "Name"
Value: "hebiishi_vpc"
EC2InternetGateway:
Type: "AWS::EC2::InternetGateway"
Properties:
Tags:
-
Key: "Name"
Value: "hebiishi_IGW"
AttachGateway:
Type: "AWS::EC2::VPCGatewayAttachment"
Properties:
InternetGatewayId: !Ref EC2InternetGateway
VpcId: !Ref EC2VPC
EC2Subnet:
Type: "AWS::EC2::Subnet"
Properties:
AvailabilityZone: !GetAtt EC2Subnet3.AvailabilityZone
CidrBlock: "10.0.1.0/24"
VpcId: !Ref EC2VPC
MapPublicIpOnLaunch: true
Tags:
-
Key: "Name"
Value: "hebiishi_pubsubnet_1"
EC2Subnet2:
Type: "AWS::EC2::Subnet"
Properties:
AvailabilityZone: !GetAtt EC2Subnet4.AvailabilityZone
CidrBlock: "10.0.2.0/24"
VpcId: !Ref EC2VPC
MapPublicIpOnLaunch: true
Tags:
-
Key: "Name"
Value: "hebiishi_pubsubnet_2"
EC2Subnet3:
Type: "AWS::EC2::Subnet"
Properties:
AvailabilityZone: !Sub "${AWS::Region}a"
CidrBlock: "10.0.3.0/24"
VpcId: !Ref EC2VPC
MapPublicIpOnLaunch: false
Tags:
-
Key: "Name"
Value: "hebiishi_prisubnet_1"
EC2Subnet4:
Type: "AWS::EC2::Subnet"
Properties:
AvailabilityZone: !Sub "${AWS::Region}c"
CidrBlock: "10.0.4.0/24"
VpcId: !Ref EC2VPC
MapPublicIpOnLaunch: false
Tags:
-
Key: "Name"
Value: "hebiishi_prisubnet_2"
EC2RouteTable:
Type: "AWS::EC2::RouteTable"
Properties:
VpcId: !Ref EC2VPC
Tags:
-
Key: "Name"
Value: "hebiishi_RT_pub"
EC2RoutePublic:
Type: AWS::EC2::Route
Properties:
RouteTableId: !Ref EC2RouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref EC2InternetGateway
EC2RouteTable2:
Type: "AWS::EC2::RouteTable"
Properties:
VpcId: !Ref EC2VPC
Tags:
-
Key: "Name"
Value: "hebiishi_RT_pri"
EC2SubnetRouteTableAssociation:
Type: "AWS::EC2::SubnetRouteTableAssociation"
Properties:
RouteTableId: !Ref EC2RouteTable
SubnetId: !Ref EC2Subnet
EC2SubnetRouteTableAssociation2:
Type: "AWS::EC2::SubnetRouteTableAssociation"
Properties:
RouteTableId: !Ref EC2RouteTable
SubnetId: !Ref EC2Subnet2
EC2SubnetRouteTableAssociation3:
Type: "AWS::EC2::SubnetRouteTableAssociation"
Properties:
RouteTableId: !Ref EC2RouteTable2
SubnetId: !Ref EC2Subnet3
EC2SubnetRouteTableAssociation4:
Type: "AWS::EC2::SubnetRouteTableAssociation"
Properties:
RouteTableId: !Ref EC2RouteTable2
SubnetId: !Ref EC2Subnet4
Outputs:
VpcOutput:
Value: !Ref EC2VPC
Export:
Name: hebiishi-vpc-id
SubnetOutput1:
Value: !Ref EC2Subnet
Export:
Name: hebiishi-pubsubnet-1-id
SubnetOutput2:
Value: !Ref EC2Subnet2
Export:
Name: hebiishi-pubsubnet-2-id
SubnetOutput3:
Value: !Ref EC2Subnet3
Export:
Name: hebiishi-prisubnet-1-id
SubnetOutput4:
Value: !Ref EC2Subnet4
Export:
Name: hebiishi-prisubnet-2-id
5.VPC構築手順
5-1.VPCの作成
- AWSTemplateFormatVersion: 上記の日付が最新のテンプレート形式のバージョンになります。*現在の唯一の有効な値になります。
- CloudFormationでスタックを作成するために、まずテンプレートを作成する必要があるため、構成図をもとにVPCを作成します。今回は、Yamlで記述していきます。
- 下記の図はVPCの記述内容になります
使用するオプション | 設定値 | 説明 |
---|---|---|
CidrBlock | 10.0.0.0/16 | 設定したいCIDRを入力 |
EnableDnsHostnames | true | DNS ホスト名を有効化 |
EnableDnsSupport | true | DNS 解決を有効化 |
InstanceTenancy | default | テナンシ―の設定 |
AWSTemplateFormatVersion: "2010-09-09"
Resources:
EC2VPC:
Type: "AWS::EC2::VPC"
Properties:
CidrBlock: "10.0.0.0/16"
EnableDnsSupport: true
EnableDnsHostnames: true
InstanceTenancy: "default"
Tags:
-
Key: "Name"
Value: "hebiishi_vpc"
5-2.サブネット設定項目
- VPC内に構成するIPアドレスで区分した範囲をセグメントと言います。
- 複数のサブネットを1つのVPCに配置できます。
- ユーザーは、サブネットを作成する際、どのAZに作成するか指定します。
5-3.パブリックサブネットの作成
- パブリックサブネットは、EC2インスタンスを設置してEC2とALBのセキュリティグループの設定をします。
- EC2は、指定IPアドレスからの通信と外部との通信を許可する設定をします。
- ソウルリージョンのAZ2aとAZ2cにそれぞれパブリックサブネットとプライベートサブネットを1つずつ作成していきます。
使用するオプション | 設定値 | 説明 |
---|---|---|
VpcId | !Ref EC2VPC | 参照元のVpc |
CidrBlock | 10.0.1.0/24 10.0.2.0/24 |
設定したいCIDRを入力 |
AvailabilityZone | !GetAtt EC2Subnet3.AvailabilityZone !GetAtt EC2Subnet4.AvailabilityZone |
アベイラビリティゾーンの指定 |
MapPublicIpOnLaunch | true | パブリック IPv4 アドレスの自動割り当ての設定 |
Tags | hebiishi_pubsubnet_1 hebiishi_pubsubnet_2 |
Nameの表記を設定 |
EC2Subnet:
Type: "AWS::EC2::Subnet"
Properties:
AvailabilityZone: !GetAtt EC2Subnet3.AvailabilityZone
CidrBlock: "10.0.1.0/24"
VpcId: !Ref EC2VPC
MapPublicIpOnLaunch: true
Tags:
-
Key: "Name"
Value: "hebiishi_pubsubnet_1"
EC2Subnet2:
Type: "AWS::EC2::Subnet"
Properties:
AvailabilityZone: !GetAtt EC2Subnet4.AvailabilityZone
CidrBlock: "10.0.2.0/24"
VpcId: !Ref EC2VPC
MapPublicIpOnLaunch: true
Tags:
-
Key: "Name"
Value: "hebiishi_pubsubnet_2"
5-4.プライベートサブネットの作成
- プライベートサブネットには、インターネットと接続する必要がないサーバーを配置します。
- また、RDSを設置予定でVPC内のEC2インスタンスとの通信のみで外部との通信をする必要がないためプライベートサブネットに配置します。
- インターネットと接続可/不可で分け、よりネットワークのセキュリティを向上させます。
使用するオプション | 設定値 | 説明 |
---|---|---|
VpcId | !Ref EC2VPC | 参照元のVpc |
CidrBlock | 10.0.3.0/24 10.0.4.0/24 |
設定したいCIDRを入力 |
AvailabilityZone | ap-southeast-2a ap-southeast-2c |
アベイラビリティゾーンの指定 |
Tags | hebiishi_prisubnet_1 hebiishi_prisubnet_2 |
Nameの表記を設定 |
EC2Subnet3:
Type: "AWS::EC2::Subnet"
Properties:
AvailabilityZone: !Sub "${AWS::Region}a"
CidrBlock: "10.0.3.0/24"
VpcId: !Ref EC2VPC
MapPublicIpOnLaunch: false
Tags:
-
Key: "Name"
Value: "hebiishi_prisubnet_1"
EC2Subnet4:
Type: "AWS::EC2::Subnet"
Properties:
AvailabilityZone: !Sub "${AWS::Region}c"
CidrBlock: "10.0.4.0/24"
VpcId: !Ref EC2VPC
MapPublicIpOnLaunch: false
Tags:
-
Key: "Name"
Value: "hebiishi_prisubnet_2"
5-5.インターネットゲートウェイの作成
- インターネットゲートウェイとは、インターネットゲートウェイとVPCとの間の通信を可能にするVPCの構成要素です。
- 外部から接続をする際に、インターネットゲートウェイを通ってVPC内のパブリックサブネットに接続をします。
使用するオプション | 設定値 | 説明 |
---|---|---|
Type | AWS::EC2::InternetGateway | InternetGatewayの設定 |
Tags | hebiishi_IGW | InternetGatewayNameのネームタグ |
EC2InternetGateway:
Type: "AWS::EC2::InternetGateway"
Properties:
Tags:
-
Key: "Name"
Value: "hebiishi_IGW"
5-6.VPCにアタッチ
- インターネットゲートウェイを作成して VPC にアタッチします。
- インターネットバウンドトラフィックをインターネットゲートウェイに転送するルートを、サブネットのルートテーブルに追加します。
使用するオプション | 設定値 | 説明 |
---|---|---|
Type | AWS::EC2::VPCGatewayAttachment | インターネットゲートウェイを VPCに接続する設定 |
Properties | !Ref hebiishiIGW !Ref hebiishiVPC |
参照元 InternetGateway VpcId |
AttachGateway:
Type: "AWS::EC2::VPCGatewayAttachment"
Properties:
InternetGatewayId: !Ref EC2InternetGateway
VpcId: !Ref EC2VPC
5-7.ルートテーブルの作成
- ルートテーブルは、パブリックサブネット、プライベートサブネットの2つのルートテーブルを作成し、作成したそれぞれのサブネットに関連付けをします。
- サブネット内のEC2インスタンスに対する静的ルーティングを定義するものでサブネット単位で行います。
- ルートテーブル内の(0.0.0.0/0)へのルーティングにインターネットゲートウェイを指定したサブネットがパブリックサブネット、インターネットゲートウェイを指定しないサブネットがプライベートサブネットと定義されます。
使用するオプション | 設定値 | 説明 |
---|---|---|
Type | AWS::EC2::Route | Routeの指定 |
Properties | RouteTableId | 参照するRouteTableIdの設定 |
DestinationCidrBlock | 0.0.0.0/0 | ルーティング先CIDERの指定 |
使用するオプション | 設定値 | 説明 |
---|---|---|
Type | AWS::EC2::RouteTable | RouteTableの指定 |
VpcId | !Ref EC2VPC | 参照するVPCIdの設定 |
Tags | hebiishi_RT_pub hebiishi_RT_pri |
ルートテーブルにネームタグを追加 |
EC2RouteTable:
Type: "AWS::EC2::RouteTable"
Properties:
VpcId: !Ref EC2VPC
Tags:
-
Key: "Name"
Value: "hebiishi_RT_pub"
EC2RoutePublic:
Type: AWS::EC2::Route
Properties:
RouteTableId: !Ref EC2RouteTable
DestinationCidrBlock: 0.0.0.0/0
GatewayId: !Ref EC2InternetGateway
EC2RouteTable2:
Type: "AWS::EC2::RouteTable"
Properties:
VpcId: !Ref EC2VPC
Tags:
-
Key: "Name"
Value: "hebiishi_RT_pri"
- パブリックサブネット、プライベートサブネットの関連付け作成
EC2SubnetRouteTableAssociation:
Type: "AWS::EC2::SubnetRouteTableAssociation"
Properties:
RouteTableId: !Ref EC2RouteTable
SubnetId: !Ref EC2Subnet
EC2SubnetRouteTableAssociation2:
Type: "AWS::EC2::SubnetRouteTableAssociation"
Properties:
RouteTableId: !Ref EC2RouteTable
SubnetId: !Ref EC2Subnet2
EC2SubnetRouteTableAssociation3:
Type: "AWS::EC2::SubnetRouteTableAssociation"
Properties:
RouteTableId: !Ref EC2RouteTable2
SubnetId: !Ref EC2Subnet3
EC2SubnetRouteTableAssociation4:
Type: "AWS::EC2::SubnetRouteTableAssociation"
Properties:
RouteTableId: !Ref EC2RouteTable2
SubnetId: !Ref EC2Subnet4
- Outputセクションで他のリソースへ参照します。
- スタックから別のスタックへリソースをエクスポートする際に、クロススタックを参照し作成する必要があります。この設定をしなければ他のスタックを参照できません。
Outputs:
VpcOutput:
Value: !Ref EC2VPC
Export:
Name: hebiishi-vpc-id
SubnetOutput1:
Value: !Ref EC2Subnet
Export:
Name: hebiishi-pubsubnet-1-id
SubnetOutput2:
Value: !Ref EC2Subnet2
Export:
Name: hebiishi-pubsubnet-2-id
SubnetOutput3:
Value: !Ref EC2Subnet3
Export:
Name: hebiishi-prisubnet-1-id
SubnetOutput4:
Value: !Ref EC2Subnet4
Export:
Name: hebiishi-prisubnet-2-id
6.感想
全ての工程作業が初めてでエラー続きですが、AWSリソースの特徴
操作方法等などをAWSドキュメントを参照しながら、根気強く一歩一歩成長していきたいと思います。
7.参照
CloudFormaton: VPC作成参照ドキュメント
CloudFormation: VPC作成テンプレート
以上で、CloudFormationによるVPC関連の構築は完了しました。