← ハンズオン一覧に戻る

AWS Hands-on / Networking

別々の VPC を、安全につなぐ

役割の異なる 2 つの VPC を用意し、「VPC ピアリング」でつなぎます。それぞれ独立したネットワークのまま、許可した範囲だけプライベート IP アドレスで直接通信できる状態を、自分の手で作って確かめます。

● Lv.3 複数のサービスを組み合わせられる人 ⏱ 所要 45〜60 分 コンソール操作に加えて SSH を使用します
01 — Prerequisites

はじめる前に

  • 必須AWS アカウントを持ち、マネジメントコンソールにサインインできること
  • 必須VPC・サブネット・ルートテーブル・インターネットゲートウェイの基本を、自分で組み立てられること
  • 必須EC2 を起動し、キーペアで SSH ログインした経験があること
  • 必須セキュリティグループで通信を許可した経験があること
  • あると良い「CIDR ブロック」が IP アドレスの範囲を表す、ということをなんとなく知っている

※ コンソール操作に加えて、お使いのパソコンのターミナルから 1 回 SSH を使用します。

02 — References

参照する公式ドキュメント

手順に迷ったときや、用語の意味を確かめたいときに開きましょう。

※ リンク切れの場合は、ページタイトルで検索してください。

03 — Background

背景・シナリオ

システムの規模が大きくなると、役割や環境ごとに VPC を分けて使う場面が増えます。たとえば「アプリ用の VPC」と「データ用の VPC」を別々に用意すると、IP アドレス範囲の衝突を避けやすく、片方の変更がもう片方に影響しにくくなります。一方で、VPC は何もしなければ互いに孤立したネットワークであり、アプリ側からデータ側のサーバーに直接アクセスする道がありません。

この 2 つを安全につなぐ仕組みが VPC ピアリングです。指定した CIDR の範囲だけ、2 つの VPC のプライベート IP アドレスが直接通信できるようになります。今回は別々の CIDR を持つ 2 つの VPC を作り、ピアリング接続を経由して片方から他方のサーバーへ到達できることを確かめます。

VPC を分けずに、最初から 1 つの VPC にまとめればいいのでは?

まとめてしまうと身軽な反面、誤った変更の影響範囲が全体に及びやすくなります。役割ごとに VPC を分けておくと影響範囲を切り離せますが、その代わり必要な通信だけを後から安全につなぐ手段が必要になります。VPC ピアリングはその代表的な手段の 1 つです。

ピアリングすると、2 つの VPC は 1 つになるの?

いいえ、VPC 自体はあくまで別々のままです。変わるのは「指定した CIDR 同士が、ルートテーブルとセキュリティグループで許可した範囲だけ、直接通信できる経路を持つ」という点だけです。許可していない通信は今までどおり通りません。

Goal

CIDR が重ならない 2 つの VPC を用意し、VPC ピアリング接続を作成・受諾する。両方のルートテーブルに相手 VPC 宛のルートを追加し、片方の VPC の EC2 から、もう片方の VPC の EC2 のプライベート IP アドレスへ HTTP で到達できることを確認する。

04 — Architecture

つくる構成

CIDR の異なる 2 つの VPC を、1 本の VPC ピアリング接続でつなぎます。それぞれにインターネットゲートウェイも付け、SSH 確認用にパブリック IP を使えるようにします。CIDR の数値は一例です。

aws AWS Cloud
Region : ap-northeast-1(東京)・同一アカウント
VPC : vpc-app
10.0.0.0/16(例)
public-subnet・10.0.1.0/24
EC2(接続元・SSH 用)
VPC : vpc-data
10.1.0.0/16(例)
public-subnet・10.1.1.0/24
EC2(接続先・HTTP 応答)
vpc-app の EC2 から、vpc-data の EC2 のプライベート IP アドレスへ HTTP で到達できることを確認します。インターネットを経由しません。
※ 数値は一例です。2 つの VPC の CIDR は重ならないように自由に決めます。
05 — Requirements

要件

以下の要件を満たす構成を作り、ピアリング経由でのプライベート通信を確認してください。

No要件
1リージョンは「東京(ap-northeast-1)」を使用する。
2CIDR が重ならない 2 つの VPC を作成する(例:vpc-app10.0.0.0/16vpc-data10.1.0.0/16)。それぞれにパブリックサブネットを 1 つ作る。
3両方の VPC にインターネットゲートウェイをアタッチし、各パブリックサブネットがインターネットへ出られるようにする(SSH 確認用)。
4VPC ピアリング接続を作成する(リクエスター:vpc-app、アクセプター:vpc-data、同一アカウント・同一リージョン)。作成したリクエストを受諾し、状態を「Active」にする。
5両方の VPC のルートテーブルに、相手 VPC の CIDR 宛のルートをピアリング接続に向けて追加する。
6セキュリティグループを設定する。vpc-data 側の EC2 は HTTP(80)を vpc-app の CIDR からのみ許可、vpc-app 側の EC2 は SSH(22)を「マイ IP」のみ許可する。各 VPC に EC2 を 1 台ずつ起動する(vpc-data 側はユーザーデータで Apache と目印ページを用意する)。
7vpc-app 側の EC2 に SSH 接続し、vpc-data 側の EC2 のプライベート IP アドレスに対する HTTP アクセスが成功することを確認する。
06 — Steps

構築の進め方

「2 つの VPC を整える → ピアリング接続を作って受諾する → 両側のルートを書く → 通信を確認する」の順に進めます。

  1. マネジメントコンソールにサインインし、リージョンを合わせる

    ブラウザで AWS マネジメントコンソールにサインインし、画面右上のリージョンが「アジアパシフィック(東京)ap-northeast-1」になっていることを確認します。

  2. 2 つの VPC とパブリックサブネットを用意する

    VPC を 2 つ作成します。CIDR が重ならないようにします(例:vpc-app10.0.0.0/16vpc-data10.1.0.0/16)。それぞれの VPC の中にパブリックサブネットを 1 つ作ります(例:10.0.1.0/2410.1.1.0/24)。

    CIDR の重複は厳禁

    2 つの VPC の CIDR が重なっていると、ピアリングをしても一部のアドレスにしか正しく到達できなくなります。最初に範囲が重ならないことを確認しておきましょう。

  3. 両方の VPC をインターネットにつなげる

    各 VPC にインターネットゲートウェイを作成・アタッチし、それぞれのパブリックサブネット用ルートテーブルに 0.0.0.0/0 → インターネットゲートウェイのルートを追加・関連付けます。両方のサブネットで「パブリック IPv4 自動割り当て」も有効にします。

    これは確認用の準備

    この手順自体は VPC ピアリングと直接関係しませんが、あとで vpc-app 側の EC2 に SSH するために必要です。

  4. VPC ピアリング接続を作成する

    VPC コンソール左メニュー「ピアリング接続」→「ピアリング接続を作成」を開きます。名前(例:app-to-data)を付け、次のように指定します。

    VPC(リクエスター)vpc-app
    アカウント自分の AWS アカウント
    リージョンこのリージョン(東京)
    VPC(アクセプター)vpc-data
    ピアリング接続を作成 — アクセプター VPC の選択(イメージ)

    VPC(アクセプター)

    vpc-data(10.1.0.0/16)
    接続したい、もう一方の VPC
    vpc-app(10.0.0.0/16)
    リクエスター自身の VPC。自分自身とはピアリングできない

    つなぎたい相手は vpc-data なので、こちらを選びます

    作成直後は「pending-acceptance」

    作成しただけではまだ接続は使えません。同一アカウント内であっても、次のステップで受諾(Accept)する操作が必要です。

  5. ピアリング接続のリクエストを受諾する

    「ピアリング接続」一覧で、状態が pending-acceptance になっている app-to-data を選び、「アクション」→「リクエストを受諾」を実行します。状態が 「Active」に変われば接続そのものは完成です。

  6. 両方のルートテーブルに、相手 VPC 宛のルートを追加する

    ピアリング接続を作っただけでは、まだ通信は通りません。両方の VPC のルートテーブルに、相手の CIDR 宛のルートを追加します。

    vpc-app 側のルートテーブル送信先 10.1.0.0/16 → ターゲット「Peering Connection」の app-to-data
    vpc-data 側のルートテーブル送信先 10.0.0.0/16 → ターゲット「Peering Connection」の app-to-data
    片方だけでは不十分

    通信を行き来させるには、双方のルートテーブルにそれぞれ相手宛のルートが必要です。片方にしか追加しないと、行きか帰りの一方しか経路がない状態になり、思ったように通信できません。

  7. セキュリティグループを設定し、EC2 を 1 台ずつ起動する

    セキュリティグループを 2 つ用意します。

    vpc-app 側(例:app-sgインバウンドで SSH(22)を「マイ IP」から許可
    vpc-data 側(例:data-sgインバウンドで HTTP(80)を、ソース=vpc-app の CIDR(10.0.0.0/16から許可

    各 VPC のパブリックサブネットに EC2 を 1 台ずつ起動します。vpc-data 側のユーザーデータには、次を貼り付けます。

    ユーザーデータ(vpc-data 側の EC2)
    #!/bin/bash
    dnf install -y httpd
    systemctl enable --now httpd
    echo "<h1>vpc-data 側のサーバーです</h1>" > /var/www/html/index.html
    インターネット全体には開かない

    data-sg のソースは 0.0.0.0/0 ではなく vpc-app の CIDR だけにします。これにより「ピアリングでつながった相手からだけアクセスできる」状態を作れます。

  8. vpc-app 側の EC2 から、vpc-data 側の EC2 へ到達できることを確認する

    ローカルのターミナルから vpc-app 側 EC2 のパブリック IP へ SSH します。ログインしたら、vpc-data 側 EC2 のプライベート IP アドレスに対して HTTP アクセスします。

    vpc-app 側の EC2 の中で実行
    # vpc-data 側 EC2 のプライベート IP に置き換えて実行
    curl http://<vpc-data 側 EC2 のプライベート IP>

    vpc-data 側のサーバーです という応答が返れば、ピアリング経由のプライベート通信が成功しています。

    インターネットを経由していない

    この通信は、どちらの EC2 もパブリック IP を使わず、VPC ピアリング接続を通じてプライベート IP アドレスのまま行われています。

07 — Pitfalls

つまずきポイント

初学者がよく引っかかる箇所を先回りでまとめました。答えそのものは載せていませんが、「どこを見直せばよいか」の手がかりとして使ってください。

Pitfall 01 — curl がタイムアウトする、応答が返らない

「ピアリングは Active なのに、相手のサーバーに届かない」

確認したい点がいくつかあります。①両方の VPC のルートテーブルに、相手 CIDR 宛のルートを追加したか(片方だけでは不十分です)、data-sg のインバウンドが vpc-app の CIDR から HTTP(80)を許可しているかvpc-data 側 EC2 で Apache(httpd)が起動しているか——のいずれかが欠けていることが多いです。

Pitfall 02 — ピアリング接続が作成できない、または一部しか通信できない

「ピアリング接続を作ろうとするとエラーになる」

多くの場合、2 つの VPC の CIDR が重なっていることが原因です。CIDR が完全に同じでなくても、範囲の一部が重複しているだけでピアリングは正しく機能しません。2 つの VPC の CIDR ブロックを見比べて、重なりがないか確認してみてください。

08 — Checklist

完了チェック

要件の再確認ではなく、画面のどこを見れば達成を確認できるかをまとめました。VPC コンソールを開いて、次を順に確かめましょう。

  • 「ピアリング接続」一覧で、app-to-data の状態が「Active」になっている。
  • vpc-app 側のルートテーブルに、送信先 10.1.0.0/16 ・ターゲットがピアリング接続の行がある。
  • vpc-data 側のルートテーブルに、送信先 10.0.0.0/16 ・ターゲットがピアリング接続の行がある。
  • data-sg のインバウンドルールのソースが vpc-app の CIDR になっている(0.0.0.0/0 ではない)。
  • vpc-app 側 EC2 から vpc-data 側 EC2 のプライベート IP への curl が成功し、目印ページの内容が返る。
09 — Think

考えてみよう

手を動かすことに加えて、次の問いに自分の言葉で答えられるようにしておくと、理解がより深まります。

  1. ピアリング接続をした 2 つの VPC は、まるで 1 つの大きなネットワークになったように感じます。実際には何が変わって、何が変わっていないのでしょうか。
    ヒント
    変わったのは「ルートテーブルに相手 CIDR 宛の経路が増えたこと」と「セキュリティグループで許可した通信が通るようになったこと」だけです。VPC そのものが統合されたわけではない、という点から考えてみましょう。
  2. 今回 data-sg では「vpc-app の CIDR 全体」からの通信を許可しました。これをもっと絞り込む(例:特定のセキュリティグループだけを許可する)と、何が変わるでしょうか。
    ヒント
    CIDR 全体を許可すると、その VPC 内のどのリソースからでも通信できてしまいます。特定のセキュリティグループを指定できれば、そのセキュリティグループが付いたリソースだけに絞り込めます。「最小権限」という考え方から比べてみましょう。
  3. もし VPC が 3 つ、4 つと増えて、すべてを互いにつなぎたくなったら、VPC ピアリングだけで対応するとどうなるでしょうか。
    ヒント
    ピアリングは 1 対 1 の接続です。VPC の数が増えるほど、必要な接続の組み合わせの数も急に増えていきます。すべてを 1 対 1 でつなぐ以外に、中心となる「ハブ」を経由してまとめてつなぐ方式が AWS には別に用意されています。どんな名前のサービスか、調べてみましょう。
10 — Clean up

後片づけ

作ったものを片づけるところまでが一連の流れです。ルート → ピアリング接続 → サーバーの順に外していくと迷いにくいです。

  1. 両方のルートテーブルから、ピアリング宛のルートを削除する:vpc-app 側・vpc-data 側、それぞれの「ルート」タブから削除。
  2. ピアリング接続を削除する:app-to-data を選び「アクション」→「ピアリング接続の削除」。
  3. EC2 を終了する:2 台とも「インスタンスの状態」→「インスタンスを終了」。
  4. インターネットゲートウェイをデタッチして削除する:両方の VPC で同様に行う。
  5. サブネットと VPC を削除する:このハンズオン用に作った vpc-app / vpc-data をそれぞれ削除する。
Caution — デフォルトのリソースは消さない

削除するのは自分で作った 2 つの VPC だけ

一覧には、最初から用意されている「デフォルト VPC」も並んでいます。間違えて削除しないよう、このハンズオンで作った vpc-app / vpc-data という名前のものだけを選んで削除してください。

コストに関する注意: VPC ピアリング接続自体は、今回のように同一リージョン内であれば料金はかかりません(異なるリージョン同士をつなぐ場合はデータ転送料金が発生しますが、今回の範囲には含まれません)。EC2 インスタンスは 2 台分の料金がかかります(無料利用枠対象タイプを使えば最小限に抑えられます)。VPC・サブネット・ルートテーブル・インターネットゲートウェイ・セキュリティグループ自体には料金はかかりません。使い終えたら、上の「後片づけ」を参考に整理しておきましょう。