CloudFormationによる【VPC】の構築


この記事は公開されてから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構成図

file

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

Outputセクションの追加手順

6.感想

全ての工程作業が初めてでエラー続きですが、AWSリソースの特徴
操作方法等などをAWSドキュメントを参照しながら、根気強く一歩一歩成長していきたいと思います。

7.参照

CloudFormaton: VPC作成参照ドキュメント
CloudFormation: VPC作成テンプレート

以上で、CloudFormationによるVPC関連の構築は完了しました。

Last modified: 2022-06-17

Author