皆様こんにちは。
今回はCLIを利用して高可用性アーキテクトの構築をしていきます。
このブログはCLIによるVPCを構築する上での知識を記事としてまとめ再確認し、皆様と共有するため作成します。
この記事ではVPCの作成を行います。

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

目次はこちら

2.VPCとは

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

Amazon VPCを使用し、論理的に分離された仮想ネットワークでAWS リソースを起動できるようになります。
高可用性アーキテクトを構築する上で、可用性を高めるため仮想ネットワークを論理的に分離し、リソースをマルチAZ配置にするためにこのAmazon VPCを利用します。
類似サービスとしてGCPの「Virtual Private Cloud」、Azureの「Azure Virtual Network」等が挙げられます。
今回はマルチAZ環境を構築するため、一つのVPCの中に2つのAZを含めます。

サブネット

  • サブネットは、VPC の IP アドレスの範囲です。
  • 複数のサブネットを1つのVPCに配置できます。

インターネットゲートウェイ

  • インターネットゲートウェイはVPCとインターネットと接続するためのコンポーネントです。
  • インターネットゲートウェイを使用することで、インスタンスは Amazon EC2 ネットワークエッジを介してインターネットに接続できます。

ルートテーブル

  • サブネット内のEC2インスタンスに対する静的ルーティングを定義するものでサブネット単位で行います。

3.フロー図

file
パブリックサブネットとプライベートサブネット違いは、

  • パブリックサブネット インターネットゲートウェイへのルート先があるサブネット
  • プライベートサブネット インターネットゲートウェイへのルート先がないサブネット
    です。
  • ルート先の設定はルートテーブルで行うので、サブネットを作る段階ではこの二つに機能の違いはありません。

パブリックサブネットにはEC2インスタンスを設置します。
後にALBを追加しますが、ALBとEC2のセキュリティグループを設定してEC2はALBと私のMYIPの通信以外は受け付けないようにします。こちらで検証しています。

プライベートサブネットにはRDSを設置します。
RDSはVPC内のEC2インスタンスとのやり取りのみで外部向けて公開する必要がないのでプライベートサブネットに設置します。

CIDRブロックは十分な余裕を取るためVPC:/16,Subnet:/24に設定しています。
小さくしたい場合注意点があり、

ロードバランサーが正しくスケールできるように、ロードバランサーのアベイラビリティーゾーンサブネットごとに CIDR ブロックを最低でも /27 ビットマスク (例: 10.0.0.0/27) にし、少なくとも各サブネットにつき 8 個の空き IP アドレスを用意してください。ロードバランサーはこれらの IP アドレスを使用して、ターゲットとの接続を確立します。公式ドキュメント

とのことですので、ALBを利用する場合サブネットのCIDRは最低でも/27はとるようにしてください。

4.VPCなど基盤構築

4-1.VPC作成

では早速CLIを利用してVPCを作成していきます。
VPCを作成するには、[aws ec2 create-vpc]コマンドを使用します。

使用するオプション 設定値 説明
--cidr-block 10.0.0.0/16 設定したいCIDRを入力
--tag-specifications  "ResourceType=vpc,
Tags[{Key=Name,Value=umemoto_vpc}]"
VPCに対しネームタグを追加

入力

aws ec2 create-vpc `
    --cidr-block 10.0.0.0/16 `
    --tag-specifications "ResourceType=vpc, Tags=[{Key=Name,Value=umemoto_vpc}]"

出力

{
    "Vpc": {
        "CidrBlock": "10.0.0.0/16",
        "DhcpOptionsId": "dopt-xxxxxxx",
        "State": "pending",
        "VpcId": "vpc-xxxxxxxxxx",
        "OwnerId": "xxxxxxxxxx",
        "InstanceTenancy": "default",
        "Ipv6CidrBlockAssociationSet": [],
        "CidrBlockAssociationSet": [
            {
                "AssociationId": "vpc-cidr-assoc-xxxxxxxxxx",
                "CidrBlock": "10.0.0.0/16",
                "CidrBlockState": {
                    "State": "associated"
                }
            }
        ],
        "IsDefault": false,
        "Tags": [
            {
                "Key": "Name",
                "Value": "umemoto_vpc"
            }
        ]
    }
}

これでVPCを作成できました。

4-2.インターネットゲートウェイ作成

インターネットゲートウェイ(以下IGW)はVPCとインターネットと接続するためのコンポーネントです。
IGWを利用して行うことは以下になります、

  • 自分のPCのパブリックIPでインスタンスへのSSHでアクセス
  • ALBにインターネットからアクセスする

IGWの構築は、IGWの作成と、上記VPCにアタッチする設定が必要です。
まず、IGWを作成するために、[aws ec2 create-internet-gateway]コマンドを使用します。

使用するオプション 設定値 説明
--tag-specifications "ResourceType=vpc,
Tags[{Key=Name,Value=umemoto_IGW}]"
IGWに対しネームタグを追加

入力

aws ec2 create-internet-gateway `
    --tag-specifications "ResourceType=internet-gateway, Tags=[{Key=Name,Value=umemoto_IGW}]"

出力

{
    "InternetGateway": {
        "Attachments": [],
        "InternetGatewayId": "igw-xxxxxxxxx",
        "OwnerId": "xxxxxxxxx",
        "Tags": [
            {
                "Key": "Name",
                "Value": "umemoto_IGW"
            }
        ]
    }
}

このIGWを、先ほど作成したVPCにアタッチします。
アタッチするために、[aws ec2 attach-internet-gateway]コマンドを使用します。

使用するオプション 設定値 説明
--internet-gateway-id igw-xxxxx IGWのIDを入力
--vpc-id  vpc-xxxxx VPCのIDを入力

入力

aws ec2 attach-internet-gateway `
    --internet-gateway-id igw-xxxxxxx `
    --vpc-id vpc-xxxxxxx

アタッチできたかは出力されないので、[aws ec2 describe-internet-gateways]コマンドを使用して詳細を確認します。

使用するオプション 設定値 説明
--internet-gateway-id igw-xxxxx IGWのIDを入力

入力

aws ec2 describe-internet-gateways --internet-gateway-id igw-xxxxxxxx

出力

{
    "InternetGateways": [
        {
            "Attachments": [
                {
                    "State": "available",
                    "VpcId": "vpc-xxxxxxx"
                }
            ],
            "InternetGatewayId": "igw-xxxxxxxx",
            "OwnerId": "xxxxxxxxxx",
            "Tags": [
                {
                    "Key": "Name",
                    "Value": "umemoto_IGW"
                }
            ]
        }
    ]
}

"Attachments"からVPCにアタッチできていることを確認できました。

4-3.サブネット作成

次にサブネットを作成します。
ソウルリージョンのap-northeast-2aとap-northeast-2cにそれぞれプライベートサブネットとパブリックサブネットを一つずつ、計四つのサブネットを作成していきます。
またパブリックサブネットには、パブリックIPv4の自動取得を有効にする設定をします。

サブネットを作成するには、[aws ec2 create-subnet]コマンドを使用します。(四つ分まとめて記載しています)

使用するオプション 設定値 説明
--vpc-id vpc-xxxxxxx VPCのIDを入力
--cidr-block 10.0.1.0/24
10.0.2.0/24
10.0.3.0/24
10.0.4.0/24
設定したいCIDRを入力
--availability-zone ap-northeast-2a
ap-northeast-2c
アベイラビリティゾーンの指定
--tag-specifications  "ResourceType=vpc,
Tags[{Key=Name,Value=umemoto_pubsubnet_1}]"
"ResourceType=vpc,
Tags[{Key=Name,Value=umemoto_pubsubnet_1}]"
"ResourceType=vpc,
Tags[{Key=Name,Value=umemoto_pubsubnet_1}]"
"ResourceType=vpc,
Tags[{Key=Name,Value=umemoto_pubsubnet_1}]"
サブネットに対しネームタグを追加

ページ上部の構成図を参考にしながら構築します。
例として10.0.1.0/24のCIDRを持つサブネットを作成します。

入力

aws ec2 create-subnet `
    --vpc-id vpc-xxxxx `
    --cidr-block 10.0.1.0/24 `
    --availability-zone ap-northeast-2a `
    --tag-specifications "ResourceType=subnet, Tags=[{Key=Name,Value=umemoto_pubsubnet_1}]"

出力

{
    "Subnet": {
        "AvailabilityZone": "ap-northeast-2a",
        "AvailabilityZoneId": "apne2-az1",
        "AvailableIpAddressCount": 251,
        "CidrBlock": "10.0.1.0/24",
        "DefaultForAz": false,
        "MapPublicIpOnLaunch": false,
        "State": "available",
        "SubnetId": "subnet-xxxxxxxx",
        "VpcId": "vpc-xxxxxxxx",
        "OwnerId": "xxxxxxxxxx",
        "AssignIpv6AddressOnCreation": false,
        "Ipv6CidrBlockAssociationSet": [],
        "Tags": [
            {
                "Key": "Name",
                "Value": "umemoto_pubsubnet_1"
            }
        ],
        "SubnetArn": "arn:aws:ec2:ap-northeast-2:xxxxxxxxxx:subnet/subnet-xxxxx",
        "EnableDns64": false,
        "Ipv6Native": false,
        "PrivateDnsNameOptionsOnLaunch": {
            "HostnameType": "ip-name",
            "EnableResourceNameDnsARecord": false,
            "EnableResourceNameDnsAAAARecord": false
        }
    }
}

上記を参考に残りのサブネットも作成します。(出力は省略します)
入力

aws ec2 create-subnet `
    --vpc-id vpc-xxxxx `
    --cidr-block 10.0.2.0/24 `
    --availability-zone ap-northeast-2c `
    --tag-specifications "ResourceType=subnet, Tags=[{Key=Name,Value=umemoto_pubsubnet_2}]"
aws ec2 create-subnet `
    --vpc-id vpc-xxxxx `
    --cidr-block 10.0.3.0/24 `
    --availability-zone ap-northeast-2a `
    --tag-specifications "ResourceType=subnet, Tags=[{Key=Name,Value=umemoto_prisubnet_1}]"
aws ec2 create-subnet `
    --vpc-id vpc-xxxxx `
    --cidr-block 10.0.4.0/24 `
    --availability-zone ap-northeast-2c `
    --tag-specifications "ResourceType=subnet, Tags=[{Key=Name,Value=umemoto_prisubnet_2}]"

次は、パブリックサブネットのIPv4の自動割り当てを有効化するため、[aws ec2 modify-subnet-attribute]コマンドを使用します。

使用するオプション 設定値 説明
--subnet-id subnet-xxxxx subnetのIDを入力
--map-public-ip-on-launch  オプションの入力だけで有効化されます 無効化するには
–no-map-public-ip-on-launchを入力

構成図から、CIDRが10.0.1.0/24,10.0.2.0/24の数値であるものがパブリックサブネットであるため、二つに有効化のコマンドを使用します。

入力

aws ec2 modify-subnet-attribute `
    --subnet-id subnet-xxxxxx `
    --map-public-ip-on-launch

出力はなし

ここで計四つのサブネットが構築できたかをまとめて確認するため、[aws ec2 describe-subnets]コマンドを使用します。

使用するオプション 設定値 説明
--filters "Name=vpc-id,Values=vpc-xxxxxx" 今回構築したVPC内のサブネットのみ表示に指定
--query  "Subnets[].[{AvailabilityZone:AvailabilityZone},{CidrBlock:CidrBlock},{MapPublicIpOnLaunch:MapPublicIpOnLaunch},Tags]" 全ての項目を表示させると行数が多くなりすぎるので重要な箇所のみ抽出

入力

aws ec2 describe-subnets `
    --filters "Name=vpc-id,Values=vpc-xxxxxx" `
    --query "Subnets[].[{AvailabilityZone:AvailabilityZone},{CidrBlock:CidrBlock},{MapPublicIpOnLaunch:MapPublicIpOnLaunch},Tags]"

出力

[
    [
        {
            "AvailabilityZone": "ap-northeast-2a"
        },
        {
            "CidrBlock": "10.0.3.0/24"
        },
        {
            "MapPublicIpOnLaunch": false
        },
        [
            {
                "Key": "Name",
                "Value": "umemoto_prisubnet_1"
            }
        ]
    ],
    [
        {
            "AvailabilityZone": "ap-northeast-2c"
        },
        {
            "CidrBlock": "10.0.2.0/24"
        },
        {
            "MapPublicIpOnLaunch": true
        },
        [
            {
                "Key": "Name",
                "Value": "umemoto_pubsubnet_2"
            }
        ]
    ],
    [
        {
            "AvailabilityZone": "ap-northeast-2c"
        },
        {
            "CidrBlock": "10.0.4.0/24"
        },
        {
            "MapPublicIpOnLaunch": false
        },
        [
            {
                "Key": "Name",
                "Value": "umemoto_prisubnet_2"
            }
        ]
    ],
    [
        {
            "AvailabilityZone": "ap-northeast-2a"
        },
        {
            "CidrBlock": "10.0.1.0/24"
        },
        {
            "MapPublicIpOnLaunch": true
        },
        [
            {
                "Key": "Name",
                "Value": "umemoto_pubsubnet_1"
            }
        ]
    ]
]

上記出力から、構成図と同じ設定のサブネットを作成できており、パブリックサブネットのみパブリックIPv4の自動割り当てを有効化できていることも確認できました。

4-4.ルートテーブルの作成

ルートテーブル(以下RT)の構築は、パブリック用とプライベート用の二つのRTの作成し、それぞれ作成したサブネットの関連付けの設定をしていきます。

まずパブリックのRTを作成するために、[aws ec2 create-route-table]コマンドを使用します。

使用するオプション 設定値 説明
--vpc-id vpc-xxxxx VPCのIDを入力
--tag-specifications "ResourceType=route-table,
Tags=[{Key=Name,Value=umemoto_RT_pub}]"
pub用RTにネームタグを追加

入力

aws ec2 create-route-table `
    --vpc-id vpc-xxxxxx `
    --tag-specifications "ResourceType=route-table, Tags=[{Key=Name,Value=umemoto_RT_pub}]"

出力

{
    "RouteTable": {
        "Associations": [],
        "PropagatingVgws": [],
        "RouteTableId": "rtb-xxxxxxxxxx",
        "Routes": [
            {
                "DestinationCidrBlock": "10.0.0.0/16",
                "GatewayId": "local",
                "Origin": "CreateRouteTable",
                "State": "active"
            }
        ],
        "Tags": [
            {
                "Key": "Name",
                "Value": "umemoto_RT_pub"
            }
        ],
        "VpcId": "vpc-xxxxxxxxxx",
        "OwnerId": "xxxxxxxxx"
    }
}

次に作成したパブリック用のRTにはIGWをルーティング先として指定する必要があります。
そのために、[aws ec2 create-route]コマンドを使用します。

使用するオプション 設定値 説明
--route-table-id rtb-xxxxx RTのIDを入力
--destination-cidr-block 0.0.0.0/0 CIDRを入力
--gateway-id igw-xxxxx IGWのIDを入力

入力

aws ec2 create-route `
    --route-table-id rtb-xxxxxxxx `
    --destination-cidr-block 0.0.0.0/0 --gateway-id igw-xxxxxxxxxxxx

出力

{
    "Return": true
}

ルーティング先として指定することができました。

また、パブリック用のRTに先ほど作成した二つのパブリックサブネットを関連付けます。
関連付けのため、[aws ec2 associate-route-table]コマンドを使用します。

使用するオプション 設定値 説明
--subnet-id subnet-xxxxx パブリックsubnetのIDを入力
--route-table-id rtb-xxxxx パブリック用のRTのIDを入力

二つのパブリックサブネットを関連付けるため、下記コマンドを入力します。
入力

aws ec2 associate-route-table  `
    --subnet-id subnet-xxxxxx `
    --route-table-id rtb-xxxxxxxxxx

出力

{
    "AssociationId": "rtbassoc-xxxxxxxx",
    "AssociationState": {
        "State": "associated"
    }
}

これでパブリック用のRTにパブリックサブネットを関連付けることができました。

今度はプライベート用のRTを作成します。
パブリック用RT同様、作成には[aws ec2 create-route-table]コマンドを使用します。

使用するオプション 設定値 説明
--vpc-id vpc-xxxxx VPCのIDを入力
--tag-specifications "ResourceType=route-table,
Tags=[{Key=Name,Value=umemoto_RT_pri}]"
pri用RTにネームタグを追加

入力

aws ec2 create-route-table `
    --vpc-id vpc-xxxxxx `
    --tag-specifications "ResourceType=route-table, Tags=[{Key=Name,Value=umemoto_RT_pri}]"

出力

{
    "RouteTable": {
        "Associations": [],
        "PropagatingVgws": [],
        "RouteTableId": "rtb-xxxxxxxxxx",
        "Routes": [
            {
                "DestinationCidrBlock": "10.0.0.0/16",
                "GatewayId": "local",
                "Origin": "CreateRouteTable",
                "State": "active"
            }
        ],
        "Tags": [
            {
                "Key": "Name",
                "Value": "umemoto_RT_pri"
            }
        ],
        "VpcId": "vpc-xxxxxxxxxx",
        "OwnerId": "xxxxxxxxx"
    }
}

最後に、作成したプライベート用のRTに二つのプライベートサブネットを関連付けます。
パブリック用RT同様、関連付けには、[aws ec2 associate-route-table]コマンドを使用します。

使用するオプション 設定値 説明
--subnet-id subnet-xxxxx プライベートsubnetのIDを入力
--route-table-id rtb-xxxxx プライベート用のRTのIDを入力

二つのプライベートサブネットを関連付けるため、下記コマンドを入力します。
入力

aws ec2 associate-route-table  `
    --subnet-id subnet-xxxxxx `
    --route-table-id rtb-xxxxxxxxxx

出力

{
    "AssociationId": "rtbassoc-xxxxxxxx",
    "AssociationState": {
        "State": "associated"
    }
}

プライベート用のRTにプライベートサブネットを関連付けることができました。

これでVPC周りの構築は完了しました。

5.感想

特に構築で躓く箇所もなく問題なく作成することができました。
CLIを利用して構築するのは初めてなので公式ドキュメントをしっかり読み込んで進めて行きたい思います。

6.参照

AWS CLI Command Reference
https://docs.aws.amazon.com/cli/latest/reference/ec2/index.html#cli-aws-ec2

Last modified: 2022-05-25

Author