サイトアイコン 協栄情報ブログ

CloudFormationによる【VPC】の構築


この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので十分ご注意ください。

皆様こんにちは。
今回はCloudFormatonを利用して高可用性アーキテクトの構築をしていきます。
この記事ではVPCの作成を行います。

1.高可用性アーキテクト構築目次

目次はこちら

2.VPCについて

Amazon Virtual Private Cloud (Amazon VPC) を使用すると、定義した仮想ネットワーク内で AWS リソースを起動できます。仮想ネットワークは、お客様自身のデータセンターで運用されていた従来のネットワークによく似ていますが、 AWS のスケーラブルなインフラストラクチャを使用できるというメリットがあります。
参照:公式ドキュメント:VPC

今回はVPCの中に2つのAZの配置をし片方のAZに障害が起きた際に、もう1つのAZに通信することにより、高可用性のある設計を実現させます。

VPCができるまで

*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の作成

使用するオプション 設定値 説明
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.サブネット設定項目

5-3.パブリックサブネットの作成

使用するオプション 設定値 説明
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.プライベートサブネットの作成

使用するオプション 設定値 説明
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.インターネットゲートウェイの作成

使用するオプション 設定値 説明
Type AWS::EC2::InternetGateway InternetGatewayの設定
Tags hebiishi_IGW InternetGatewayNameのネームタグ
EC2InternetGateway:
        Type: "AWS::EC2::InternetGateway"
        Properties:
            Tags: 
              - 
                Key: "Name"
                Value: "hebiishi_IGW"

5-6.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.ルートテーブルの作成

使用するオプション 設定値 説明
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
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関連の構築は完了しました。

モバイルバージョンを終了