はじめに
AWSには各ネットワークを繋ぐためのサービスが色々とあります。
必要に応じて毎回調べながら導入するようなことをよくやっていますが、改めてきちんと整理してAWSのネットワーク間接続をまとめてみようと思い、今回から何回かに分けてAWSのネットワーク間接続を色々と試しつつ学んでいこうと思います。
また、仕事でTransit Gateway
を使うことも増えたことと、資格勉強も兼ねて特にTransit Gateway
に関しては深く調べてみたいと思います。
AWSのネットワーク間接続について
TCP/IPの世界において、端末間で通信を行うためには同一ネットワークである必要があり、同一ネットワーク以外の端末などと通信を行うためにはルータなどのゲートウェイ機器が必要となります。
AWSではVPC
内通信であれば、デフォルトで作られるルートテーブルに従って双方向に通信できますが、VPC
を超えた通信については、色々なゲートウェイサービスを利用する必要があります。
サービス | 説明 | 備考 |
---|---|---|
Internet Gateway | インターネットと双方向通信するために必要 | 外→内、内→外の通信 |
NAT Gateway | インターネットと片方向通信するために必要 | 内→外の通信のみ |
VPC Peering接続 | VPC間を接続するために必要 | VPC間の接続なので相手VPCもAWSである必要がある |
VPN接続 | 離れたネットワークと接続するために必要 | AWS以外のネットワークとも接続できる |
Direct Connect | 離れたネットワークと接続するために必要 | オンプレのネットワークと接続するために使用 |
Transit Gateway | VPC間を接続したりVPNなどと連携したりするために必要 | 大規模のネットワークを構築するのに適している |
Direct Connect
も勉強として試してみたいところですが、データセンターに機器を設置したりしないといけないことから、さすがに個人で試すことは厳しいので除外します。
また、今回はVPC
間や他の内部ネットワークとの接続を試すことを目的としているため、Internet Gateway
とNAT Gateway
の説明も除外します。
VPC Peeringとは
VPC Peering
とはVPC
間を直接接続するのに使うサービスとなります。
Transit Gateway
でも同じように接続することはできますが、自分も相手もAWS環境であれば一番手軽に接続できるサービスです。
費用も他のサービスと比べて安く、相手が別AWSアカウントのVPCとの接続だとしても、同一のアベイラビリティゾーン(AZ
)への通信であれば費用はかからず、別AZ
の場合は1GBあたり$0.01となります。
そのため、AWS同士のネットワークを接続する場合には、まず最初に検討すべき接続方法となります。
AZ通信 | 費用 |
---|---|
同一AZ内 | 無料 |
別AZ | $0.01/GB |
ちなみにap-northeast-1a
などのアベイラビリティゾーンの名前ですが、この名前はAWSアカウントごとに紐づいているゾーンは変わるそうなので、別のAWSアカウントのVPC
と接続する場合は以下のように「アベイラビリティゾーンID」で判断するようにしてください。
VPC Peeringの制限
通常のIPネットワークの場合、以下のように複数ネットワークを経由したネットワークであっても、適切にルーティングを設定すれば双方向に通信できますが、VPC Peering
ではVPC Peering
で繋いだVPC
としか通信できないようになっているので、VPC Peering
を経由して更に他のネットワークへ行くことはできません。
そのため、A、B、Cそれぞれ双方向で通信を行うようにするためにはA、B、CそれぞれフルメッシュでVPC Peering
を行う必要があります。
また、VPC Peering
はVPC
あたり最大でも125接続しか作成できないため、拠点数が多い場合は利用できません。
全拠点双方向で通信するためには、拠点が増えるごとに毎回ピアリングの設定を行う必要があることから設定の抜け漏れも起こる可能性が高くなるので、そのような場合はTransit Gateway
の使用を検討しましょう。
同一AWSアカウント内のVPC Peering
実際にVPC Peering
を試して見るため、AWSアカウントで適当なVPC
、サブネット、EC2を作成して疎通確認を試してみます。
VPC Peering確認用VPCの作成
VPC
の作成は「VPCダッシュボード」→「お使いのVPC」の「VPCを作成」から以下のような設定で行いました。
項目 | VPC-A設定 | VPC-B設定 | 備考 |
---|---|---|---|
作成するリソース | VPCなど | VPCなど | まとめてサブネットなど作成 |
名前タグの自動生成 | 自動生成 | 自動生成 | |
名前 | VPC-A | VPC-B | |
IPv4 CIDRブロック | 10.20.0.0/16 | 10.30.0.0/16 | 任意のブロックを指定 |
IPv6 CIDRブロック | IPv6 CIDRブロックなし | IPv6 CIDRブロックなし | 今回はIPv6は作成しない |
テナンシー | デフォルト | デフォルト | |
アベイラビリティゾーン(AZ)の数 | 1 | 1 | テストなので今回は1つだけ作成 |
パブリックサブネットの数 | 1 | 1 | |
プライベートサブネットの数 | 0 | 0 | 今回はプライベートサブネットは作成しない |
NATゲートウェイ | なし | なし | |
VPCエンドポイント | なし | なし | 目的とは異なるので今回は作成しない |
DNSホスト名を有効化 | 有効化 | 有効化 | デフォルトのまま |
DNS解決を有効化 | 有効化 | 有効化 | デフォルトのまま |
リソースマップ的にはこんな感じ。
疎通確認用EC2の作成
疎通確認用のEC2
もそれぞれのVPC
に作成しておきます。
基本的にはデフォルト設定ですが、疎通確認するためにEC2
にログインするため、セッションマネージャ接続用のロールを新規作成&アタッチします。
EC2
作成時の「高度な詳細」から「新しいIAMプロファイルの作成」でロールを作成できます。
項目 | 設定 | 備考 |
---|---|---|
信頼されたエンティティタイプ | AWSのサービス | |
サービスまたはユースケース | EC2 | |
ユースケース | EC2 Role for AWS Systems Manager | セッションマネージャ接続のため選択 |
ロール名 | SessionManager-Role | 任意の名前を指定 |
その他EC2
の設定は以下で設定しました。
項目 | VPC-A用EC2設定 | VPC-B用EC2設定 | 備考 |
---|---|---|---|
名前 | VPC-A-EC2 | VPC-B-EC2 | 任意の名前を指定 |
AMI | Amazon Linux 2023 AMI | Amazon Linux 2023 AMI | |
アーキテクチャ | 64ビット(x86) | 64ビット(x86) | |
インスタンスタイプ | t2.micro | t2.micro | |
キーペア名 | キーペアなしで続行 | キーペアなしで続行 | セッションマネージャで繋ぐため無しで作成 |
VPC | VPC-A-vpc | VPC-B-vpc | 先程作成したVPCを指定 |
サブネット | VPC-A-subnet-public1-ap-northeast-1a | VPC-B-subnet-public1-ap-northeast-1a | 先程作成したサブネットを指定 |
パブリックIPの自動割り当て | 有効化 | 有効化 | セッションマネージャを使用するため有効化 |
セキュリティグループ名 | VPC-A-sg | VPC-B-sg | 任意の名前を指定 |
説明 | デフォルトのまま | デフォルトのまま | |
タイプ | すべてのICMP - IPv4 | すべてのICMP - IPv4 | Ping疎通確認用 |
プロトコル | ICMP | ICMP | |
ポート範囲 | すべて | すべて | |
ソースタイプ | 任意の場所 | 任意の場所 | |
ソース | 0.0.0.0/0 | 0.0.0.0/0 | |
説明 | 空欄 | 空欄 | |
IAMインスタンスプロフィール | SessionManager-Role | SessionManager-Role | 先程作成したロールを指定 |
なお、「高度な詳細」の設定は「IAMインスタンスプロフィール」設定のみ行い、他の設定は全てデフォルトの値とします。
VPC Peeringの作成
準備ができたので、VPC Peering
でVPC
同士を接続します。
VPC Peering
は「VPCダッシュボード」の「仮想プライベートクラウド」→「ピアリング接続」から「ピアリング接続を作成」より作成します。
今回は同じアカウント内での接続となるため、以下のように設定します。
ピアリングを行う場合、接続のリクエストを行う側(リクエスタ)から接続のリクエストを受け付ける側(アクセプタ)に接続のリクエストを行い、相手側から承認されればVPC Peering
で繋がるようになります。
アクセプタ側で1週間承認されないとリクエスト自体がキャンセルされるため、注意してください。
今回はリクエスタ、アクセプタ共に自分のアカウントなので「アクション」→「リクエストを承認」を行うと承認できます。
承認後、以下のようなインフォメッセージが表示されるため、「ルートテーブルを今すぐ変更」を選択してルートテーブルの追加を行います。
ルートテーブルの追加
先程の設定でVPC Peering
でVPC-A
とVPC-B
が繋がったので、それぞれのサブネットに付与されているルートテーブルに相手側VPC
へ行くためのルーティングを設定します。
「VPCダッシュボード」の「仮想プライベートクラウド」→「ルートテーブル」からVPC-A
、VPC-C
のルートテーブルを選択して「ルート」タブ→「ルートを編集」でルーティングを追加します。
送信先を相手先ネットワーク、ターゲットで「ピアリング接続」を選び、先程作成したピアリングIDを指定すればOKです。
今回はそれぞれ以下のように設定しました。
- VPC-A用ルートテーブル設定
- VPC-B用ルートテーブル設定
今回は相手先VPC
のアドレスレンジ全てを対象とするため、「10.xx.0.0/16」と指定していますが、特定のセグメント宛の通信のみVPC Peering
で転送したい場合はセグメントに合わせて指定してください。
疎通確認
ネットワークの準備ができたので、先程作成したEC2
インスタンスを使い、VPC Peering
経由で疎通できるか確認してみます。
EC2
インスタンスにはセッションマネージャー経由で接続できるように設定しているので、「EC2ダッシュボード」から「インスタンス」で先程作成したEC2インスタンスを選択→「接続」から「セッションマネージャー」タブの「接続」で作成したインスタンスに接続します。
今回はVPC-A
側のEC2
インスタンスは「10.20.0.207」、VPC-B
側のEC2
インスタンスは「10.30.4.69」のアドレスが振られたため、VPC-A
側のEC2
インスタンスからVPC-B
側のEC2
インスタンスにping
を実行した結果、以下のように疎通できました。
別AWSアカウントとのVPC Peering
次は、別のAWSアカウントに存在するVPC
とVPC Peering
を行い、アカウント跨ぎのVPC
とも接続できるかを確認してみようと思います。
別AWSアカウント側VPC Peering確認用VPCの作成
別のAWSアカウントと接続確認を行うため、別のAWSアカウントで以下VPC
の作成を行いました。
項目 | VPC-C設定 | 備考 |
---|---|---|
作成するリソース | VPCなど | まとめてサブネットなど作成 |
名前タグの自動生成 | 自動生成 | |
名前 | VPC-C | |
IPv4 CIDRブロック | 10.120.0.0/16 | 任意のブロックを指定 |
IPv6 CIDRブロック | IPv6 CIDRブロックなし | 今回はIPv6は作成しない |
テナンシー | デフォルト | |
アベイラビリティゾーン(AZ)の数 | 1 | テストなので今回は1つだけ作成 |
パブリックサブネットの数 | 1 | |
プライベートサブネットの数 | 0 | 今回はプライベートサブネットは作成しない |
NATゲートウェイ | なし | |
VPCエンドポイント | なし | 目的とは異なるので今回は作成しない |
DNSホスト名を有効化 | 有効化 | デフォルトのまま |
DNS解決を有効化 | 有効化 | デフォルトのまま |
同様に疎通確認用のEC2
インスタンスも作成しておきます。
合わせてセッションマネージャ接続用IAMロールは先程と同様作成しておいてください。
項目 | VPC-C用EC2設定 | 備考 |
---|---|---|
名前 | VPC-C-EC2 | 任意の名前を指定 |
AMI | Amazon Linux 2023 AMI | |
アーキテクチャ | 64ビット(x86) | |
インスタンスタイプ | t2.micro | |
キーペア名 | キーペアなしで続行 | セッションマネージャで繋ぐため無しで作成 |
VPC | VPC-C-vpc | 先程作成したVPCを指定 |
サブネット | VPC-C-subnet-public1-ap-northeast-1a | 先程作成したサブネットを指定 |
パブリックIPの自動割り当て | 有効化 | セッションマネージャを使用するため有効化 |
セキュリティグループ名 | VPC-C-sg | 任意の名前を指定 |
説明 | デフォルトのまま | |
タイプ | すべてのICMP - IPv4 | Ping疎通確認用 |
プロトコル | ICMP | |
ポート範囲 | すべて | |
ソースタイプ | 任意の場所 | |
ソース | 0.0.0.0/0 | |
説明 | 空欄 | |
IAMインスタンスプロフィール | SessionManager-Role | 先程作成したロールを指定 |
AWSアカウントID、VPC IDの確認
別AWSアカウントのVPC
とVPC Peering
を行うためにはAWSアカウントIDと接続するVPC
のVPC ID
が必要となります。
今回は最初に操作したAWSアカウントで作成したVPC-A
と別アカウントで作成したVPC-C
をVPC Peering
で接続しようと思うので、VPC-C
側のAWSアカウントIDとVPC-C
のVPC ID
を確認します。
「VPCダッシュボード」より該当のVPC
の詳細からVPC ID
とAWSアカウント(所有者ID)を確認できるのでこちらを確認しておきます。
別AWSアカウントとのVPC Peeringの設定
同AWSアカウントで設定する場合と同様、VPC Peering
の設定を行います。
今回はVPC-A
と、別AWSアカウント上のVPC
となるVPC-C
をVPC Peering
で接続しようと思います。
VPC Peering
の作成はどちらのアカウントで作成しても良いですが、今回はVPC-A
側のアカウントで以下のように設定します。
アカウントIDとVPC ID
は先程確認したアカウントIDとVPC ID
を入力します。
VPC-A
側アカウントでピアリングを行うと、VPC-C
側アカウントに以下のようなリクエストが届くため、VPC-C
側アカウントで「リクエストを承諾」を行います。
ルートテーブルの追加
VPC Peering
でVPC-A
とVPC-C
を接続したので、ルートテーブルを追加していきます。
- VPC-A用ルートテーブル設定
- VPC-C用ルートテーブル設定
疎通確認
一通り設定できたので同一アカウント内のVPC Peering
を行ったときと同様、セッションマネージャでEC2
に接続してping
で確認を行います。
今回もVPC-A
側のEC2
インスタンスからVPC-C
側EC2
インスタンスにping
を行ったところ、以下のように無事疎通できました。
本当にVPC Peeringを経由した通信はできないのか?
VPC Peering
を経由した通信はできないと書きましたが、本当にできないのか確認してみたいと思います。
先程までの手順でVPC-A
からVPC-B
、VPC-C
ともにVPC Peering
で接続できています。
そのため、ネットワーク的にはルーティングさえ行ってしまえばVPC-B
からVPC-C
に通信ができそうなので、VPC-B
にはVPC-C
向けルートテーブル、VPC-C
にはVPC-B
向けルートテーブルをそれぞれ設定します。
- VPC-B用ルートテーブル設定
- VPC-C用ルートテーブル設定
ルーティング的にはVPC-B
、VPC-C
間でping
が届きそうですが、結果はドキュメントの通り、通信できませんでした。
おわりに
今回は色々あるAWSのネットワーク間通信サービスのうち、VPC Peering
の設定を行ってみました。
同一アカウント内であっても別アカウントであっても簡単な手順でVPC
同士を接続できるのでお手軽に接続できますが、同一AZ同士でなければ費用がかかってしまうため、その点は注意して設定する必要があると感じました。
次回はSite to Site VPN
についてまとめてみたいと思います。