目次Category
はじめに
今回は、AWSのVPCピアリングを利用して、異なるVPC同士を接続します。
VPCピアリングは、2つのVPCを接続する機能です。
接続したVPC間では、異なるVPCに配置されたAWSリソース同士を
プライベートIPアドレスで通信させることができます。
このハンズオンでは、すでに作成されているVPCをVPC-A、
新しく作成するVPCをVPC-Bとします。
そして、VPC-A内のEC2-AからVPC-B内のEC2-BへPingを実行します。
まず、VPC-B側のVPC、サブネット、ルートテーブル、Security Group、EC2を
CloudFormationで作成します。
その後、VPCピアリング接続を作成し、双方のルートテーブルを設定します。
最後にPingを実行して、VPC間で通信できることを確認します。
今回のハンズオンでは、VPC-AとEC2-Aがすでに作成されていることを前提としています。
VPCやEC2の構築については、
【EC2でWebサーバ構築、ALBで負荷分散、オートスケーリングを行う】
を参考にしてください。
今回構築する全体像

| 項目 | VPC-A | VPC-B |
|---|---|---|
| 用途 | 既存環境 | 新規作成する環境 |
| CIDR | 10.0.0.0/24 | 192.168.0.0/24 |
| EC2 | EC2-A | EC2-B |
| 作成方法 | 既存リソースを利用 | CloudFormation |
VPC-AとVPC-BをVPCピアリングで接続します。
さらに、それぞれのルートテーブルへ相手VPC宛てのルートを追加します。
設定が完了したら、EC2-AからEC2-BのプライベートIPアドレスへPingを実行します。
これにより、VPCピアリング経由で通信できることを確認します。
ポイント
VPCピアリングで接続するVPC同士は、CIDRを重複させることができません。
今回はVPC-Aが10.0.0.0/24のため、
VPC-Bには重複しない192.168.0.0/24を使用します。
各サービスの役割
構築を始める前に、今回利用するAWSサービスの役割を整理します。
| サービス | 役割 | 例えると |
|---|---|---|
| VPC | AWS上に独立したネットワークを作成する | 建物 |
| Subnet | VPC内のネットワークを分割する | 建物の部屋 |
| VPC Peering | 2つのVPCを接続する | 建物同士を結ぶ専用通路 |
| Route Table | 通信をどこへ送るか決める | 道案内 |
| Security Group | EC2への通信を制御する | 部屋のドア・鍵 |
| EC2 | VPC内で動作する仮想サーバ | 部屋の中にいる人 |
| CloudFormation | AWSリソースをテンプレートから作成・管理する | 設計図 |
今回の構成を建物に例えて考えてみます。
VPC-AとVPC-Bという別々の建物があり、それぞれの建物の中にEC2があります。
VPCピアリングは、この2つの建物を直接つなぐ専用通路のような役割です。
ただし、通路を作っただけでは通信できません。
そこで、それぞれのルートテーブルへ
「相手の建物へ行く場合は、この通路を使う」という道案内を設定します。
さらに、Security Groupでも必要な通信を許可します。
VPCピアリングを利用するメリット
- ・異なるVPCのリソース同士を接続できる
- ・プライベートIPアドレスで通信できる
- ・インターネットを経由せずにVPC間通信ができる
- ・VPCを分けた状態のまま、必要な環境同士を通信させられる
例えば、Webサーバー用VPCとデータベース用VPCを分けて管理する場合に利用できます。
また、開発環境と本番環境を別々のVPCに分け、必要な通信だけをVPC間で行う構成にも利用できます。
VPCピアリングの主な使用用途
VPCピアリングは、異なるVPCに分けて管理しているシステムや環境同士を、 プライベートIPアドレスで通信させたい場合に利用されます。
例えば、以下のような用途があります。
| 使用用途 | 利用イメージ |
|---|---|
| システムごとに分けたVPCの接続 | Webシステムや社内システムなど、別々のVPCで管理しているシステム間で必要な通信を行う |
| 開発環境と本番環境などの接続 | 環境ごとにVPCを分離したまま、管理やデータ連携などに必要な通信経路を確保する |
| 共有サービスへの接続 | 複数の環境から、共通で利用する管理サーバーや社内サービスなどへアクセスする |
| 別VPCにあるデータベースへの接続 | アプリケーション用VPCから、別のVPCに配置したデータベースへプライベートIPアドレスで接続する |
ポイント
VPCを1つにまとめるのではなく、システムや環境ごとにVPCを分離することで、 それぞれを独立して管理できます。 VPCピアリングを利用すると、VPCを分けた状態を維持しながら、 必要なVPC同士だけを接続できます。
構築手順
ここからは、実際にVPCピアリング環境を構築していきます。
まず既存環境を確認し、その後VPC-BをCloudFormationで作成します。
Step1 既存のVPC-A・EC2-Aを確認する
はじめに、VPCピアリングの接続元となる既存のVPC-Aを確認します。
あわせて、疎通確認に使用するEC2-Aの情報も確認します。
① VPC-Aを確認する
確認手順
- AWSマネジメントコンソールを開きます。
- 画面上部の検索欄へ「VPC」と入力します。
- 検索結果から[VPC]をクリックします。
- 左メニューの[お使いのVPC]をクリックします。
- 今回使用する既存のVPC-Aを選択します。
- [詳細]からVPC IDとIPv4 CIDRを確認します。
確認する値
| 項目 | 値 |
|---|---|
| IPv4 CIDR | 10.0.0.0/24 |
| VPC ID | 実際のVPC IDを確認 |
ポイント
VPCピアリングでは、接続するVPC同士のCIDRが重複していると接続できません。
今回はVPC-Aが10.0.0.0/24のため、
VPC-Bには192.168.0.0/24を使用します。
② EC2-Aを確認する
確認手順
- 画面上部の検索欄へ「EC2」と入力します。
- 検索結果から[EC2]をクリックします。
- 左メニューの[インスタンス]をクリックします。
- 今回使用するEC2-Aを選択します。
- [詳細]タブからインスタンスの状態を確認します。
- [ネットワーキング]タブからプライベートIPv4アドレスとサブネットIDを確認します。
確認する値
- インスタンスの状態:[実行中]
- VPC ID:Step1で確認したVPC-A
- プライベートIPv4アドレス
- サブネットID
ポイント
EC2-AのサブネットIDは、後ほどVPC-A側で使用しているルートテーブルを確認するときに利用します。
Step2 CloudFormationテンプレートを作成する
次に、VPC-B側の環境を作成します。
今回はCloudFormationを利用するため、最初にテンプレートを準備します。
① YAMLファイルを作成する
- VSCodeを開きます。
- 任意の作業フォルダを開きます。
- 新規ファイルを作成します。
- ファイル名を
template.ymlとします。 - 以下の内容を貼り付けて保存します。
AWSTemplateFormatVersion: '2010-09-09'
Description: Create VPC-B and EC2-B for VPC Peering hands-on
Parameters:
Name:
Type: String
Description: Resource name suffix
AllowedPattern: '[a-zA-Z0-9-]+'
ConstraintDescription: Use letters, numbers, and hyphens only
LatestAmiId:
Type: AWS::SSM::Parameter::Value
Default: /aws/service/ami-amazon-linux-latest/al2023-ami-kernel-default-x86_64
Description: Latest Amazon Linux 2023 AMI
Resources:
PeerVPC:
Type: AWS::EC2::VPC
Properties:
CidrBlock: 192.168.0.0/24
EnableDnsSupport: true
EnableDnsHostnames: true
Tags:
- Key: Name
Value: !Sub vpc-${Name}-02
PeerSubnet:
Type: AWS::EC2::Subnet
Properties:
VpcId: !Ref PeerVPC
CidrBlock: 192.168.0.0/28
MapPublicIpOnLaunch: false
Tags:
- Key: Name
Value: !Sub subnet-${Name}-02
PeerRouteTable:
Type: AWS::EC2::RouteTable
Properties:
VpcId: !Ref PeerVPC
Tags:
- Key: Name
Value: !Sub rtb-${Name}-02
PeerSubnetRouteTableAssociation:
Type: AWS::EC2::SubnetRouteTableAssociation
Properties:
SubnetId: !Ref PeerSubnet
RouteTableId: !Ref PeerRouteTable
PeerSecurityGroup:
Type: AWS::EC2::SecurityGroup
Properties:
GroupDescription: Allow ICMP from existing VPC-A
VpcId: !Ref PeerVPC
SecurityGroupIngress:
- Description: Allow ping from VPC-A
IpProtocol: icmp
FromPort: -1
ToPort: -1
CidrIp: 10.0.0.0/24
Tags:
- Key: Name
Value: !Sub sgp-${Name}-02
PeerEC2:
Type: AWS::EC2::Instance
Properties:
ImageId: !Ref LatestAmiId
InstanceType: t3.micro
SubnetId: !Ref PeerSubnet
SecurityGroupIds:
- !Ref PeerSecurityGroup
Tags:
- Key: Name
Value: !Sub ec2-${Name}-02
Outputs:
PeerVpcId:
Description: VPC-B ID used as the accepter VPC
Value: !Ref PeerVPC
PeerVpcCidr:
Description: VPC-B CIDR
Value: 192.168.0.0/24
PeerRouteTableId:
Description: Route table ID used when adding the peering route
Value: !Ref PeerRouteTable
PeerEC2PrivateIp:
Description: EC2-B private IP used for Ping
Value: !GetAtt PeerEC2.PrivateIp
PeerSecurityGroupId:
Description: EC2-B security group ID
Value: !Ref PeerSecurityGroup
ポイント
- YAMLではインデントによって項目の階層を表します。
- VPC-Bには
192.168.0.0/24を設定します。 - EC2-BにはパブリックIPアドレスを割り当てません。
- VPC-Aの
10.0.0.0/24からEC2-BへのICMP通信を許可します。
② テンプレートの設定内容を確認する
| 項目 | 役割 |
|---|---|
Parameters | スタック作成時に利用する値を定義する |
Resources | 作成するAWSリソースを定義する |
Outputs | 作成後に使用する値を出力する |
Parameters
Nameは、CloudFormationスタックを作成するときにAWSマネジメントコンソール上で入力する値です。
例えば、Nameへtestと入力すると、以下のようなNameタグが設定されます。
vpc-test-02
subnet-test-02
rtb-test-02
sgp-test-02
ec2-test-02
一方、LatestAmiIdでは、Systems ManagerのAWS公開パラメータを利用します。
これにより、Amazon Linux 2023のAMI IDを取得します。
VPC・Subnet
VPC-Bには192.168.0.0/24を設定します。
その中のSubnetには192.168.0.0/28を設定します。
また、MapPublicIpOnLaunch: falseとしているため、
EC2-BにはパブリックIPアドレスが自動で割り当てられません。
Route Table
VPC-B用のルートテーブルを作成し、EC2-Bを配置するSubnetへ関連付けます。
なお、この段階ではVPCピアリング用のルートは作成しません。
ピアリング接続を作成した後に、AWSマネジメントコンソールから手動で設定します。
Security Group
EC2-BへのPingを許可するため、
VPC-AのCIDRである10.0.0.0/24からのICMP通信を許可します。
Outputs
| 出力キー | 使用する場面 |
|---|---|
PeerVpcId | VPCピアリング接続の作成 |
PeerVpcCidr | VPC-BのCIDR確認 |
PeerRouteTableId | VPC-B側のルート設定 |
PeerEC2PrivateIp | Pingの実行 |
PeerSecurityGroupId | Security Groupの確認 |
Step3 CloudFormationスタックを作成する
テンプレートの準備ができたら、CloudFormationへアップロードしてスタックを作成します。
① テンプレートをアップロードする
- AWSマネジメントコンソール上部の検索欄へ「CloudFormation」と入力します。
- 検索結果から[CloudFormation]をクリックします。
- [スタック]画面右上の[スタックの作成]をクリックします。
- [新しいリソースを使用(標準)]をクリックします。
- [テンプレートの準備]は[既存のテンプレートを選択]を選択します。
- [テンプレートの指定]で[テンプレートファイルのアップロード]を選択します。
- [ファイルの選択]をクリックします。
template.ymlを選択します。- [次へ]をクリックします。
② スタックの詳細を指定する
| 項目 | 設定値 |
|---|---|
| スタック名 | vpc-peering-[name]-01 |
| Name | [name] |
| LatestAmiId | 初期値のまま |
例えば、Nameにtestと入力する場合、
スタック名はvpc-peering-test-01とします。
- [スタック名]へ
vpc-peering-[name]-01を入力します。 - [パラメータ]の[Name]へ自分の名前などの識別用文字列を入力します。
- [LatestAmiId]は初期値のままにします。
- [次へ]をクリックします。
- [スタックオプションの設定]は変更せず、[次へ]をクリックします。
- [確認して作成]画面で設定内容を確認します。
- 最後に、画面下部の[送信]をクリックします。
③ スタックの作成完了を確認する
作成したスタックを開き、[スタック情報]に表示されるステータスを確認します。
CREATE_COMPLETE
ステータスがCREATE_COMPLETEになれば、VPC-B側の環境作成は完了です。
作成に失敗した場合
スタックの[イベント]タブを開きます。
その後、CREATE_FAILEDとなっているリソースの[ステータス理由]を確認します。
Step4 CloudFormationの出力を確認する
スタックの作成が完了したら、後の設定で利用するVPC IDやプライベートIPアドレスを確認します。
- CloudFormationの[スタック]から今回作成した
vpc-peering-[name]-01をクリックします。 - [出力]タブをクリックします。
- 以下の出力値を確認します。
| 出力キー | 確認する値 |
|---|---|
PeerVpcId | VPC-BのVPC ID |
PeerRouteTableId | VPC-BのルートテーブルID |
PeerEC2PrivateIp | EC2-BのプライベートIPアドレス |
PeerSecurityGroupId | EC2-BのSecurity Group ID |
Step5 VPCピアリング接続を作成する
VPC-Bの準備ができたため、次にVPC-AとVPC-BをVPCピアリングで接続します。
① VPCピアリング接続を作成する
- AWSマネジメントコンソールで[VPC]を開きます。
- 左メニューの[ピアリング接続]をクリックします。
- 画面右上の[ピアリング接続を作成]をクリックします。
設定内容
| 項目 | 設定値 |
|---|---|
| 名前 | pcx-[name]-01 |
| VPC ID(リクエスタ) | 既存のVPC-A |
| アカウント | 自分のアカウント |
| VPC ID(アクセプタ) | Step4のPeerVpcId |
- [名前]へ
pcx-[name]-01を入力します。 - [VPC ID(リクエスタ)]で既存のVPC-Aを選択します。
- [アカウント]は[自分のアカウント]を選択します。
- [VPC ID(アクセプタ)]へStep4で確認した
PeerVpcIdを指定します。 - 設定内容を確認します。
- [ピアリング接続を作成]をクリックします。
ポイント
リクエスタVPCは接続を要求する側です。
一方、アクセプタVPCは接続要求を受ける側です。
今回はVPC-AからVPC-Bへ接続を要求します。
② VPCピアリング接続を承認する
- [VPC]→[ピアリング接続]を開きます。
pcx-[name]-01を選択します。- 画面右上の[アクション]をクリックします。
- [リクエストを承諾]をクリックします。
- 確認画面で[リクエストを承諾]をクリックします。
- [ステータス]が[アクティブ]になったことを確認します。
ポイント
ステータスが[アクティブ]になっても、この時点ではEC2-AとEC2-Bは通信できません。
次に、双方のルートテーブルへVPCピアリング用のルートを追加します。
Step6 VPC-A側のルートテーブルを設定する
EC2-AからVPC-Bへ通信を送れるようにします。
そのため、EC2-Aが利用しているルートテーブルへVPC-B宛てのルートを追加します。
VPC-Bへのルートを追加する
- 左メニューの[ルートテーブル]をクリックします。
- VPC-A側のルートテーブルを選択します。
- [ルート]タブをクリックします。
- [ルートを編集]をクリックします。
- [ルートを追加]をクリックします。
| 項目 | 設定値 |
|---|---|
| 送信先 | 192.168.0.0/24 |
| ターゲット | ピアリング接続 → pcx-[name]-01 |
- [送信先]へ
192.168.0.0/24を入力します。 - [ターゲット]で[ピアリング接続]を選択します。
- 作成した
pcx-[name]-01を選択します。 - [変更を保存]をクリックします。
設定後
192.168.0.0/24 → VPC Peering
Step7 VPC-B側のルートテーブルを設定する
続いて、EC2-BからVPC-Aへ通信を返せるようにします。
VPC-B側のルートテーブルへ、VPC-A宛てのルートを追加します。
- [VPC]→[ルートテーブル]を開きます。
- Step4で確認した
PeerRouteTableIdと一致するルートテーブルを選択します。 - [ルート]タブをクリックします。
- [ルートを編集]をクリックします。
- [ルートを追加]をクリックします。
| 項目 | 設定値 |
|---|---|
| 送信先 | 10.0.0.0/24 |
| ターゲット | ピアリング接続 → pcx-[name]-01 |
- [送信先]へ
10.0.0.0/24を入力します。 - [ターゲット]で[ピアリング接続]を選択します。
pcx-[name]-01を選択します。- [変更を保存]をクリックします。
重要
最終的に、以下の2つのルートが設定されていることを確認します。
- VPC-A:
192.168.0.0/24 → VPC Peering - VPC-B:
10.0.0.0/24 → VPC Peering
Step8 EC2-BのSecurity Groupを確認する
ルートテーブルの設定後、EC2-BでPingを受け取れるようになっているかSecurity Groupを確認します。
- AWSマネジメントコンソールから[EC2]を開きます。
- 左メニューの[セキュリティグループ]をクリックします。
sgp-[name]-02を選択します。- [インバウンドルール]タブを確認します。
| タイプ | プロトコル | ソース |
|---|---|---|
| すべてのICMP – IPv4 | ICMP | 10.0.0.0/24 |
このルールはCloudFormationで作成済みです。
そのため、上記の設定になっていれば追加操作は不要です。
Step9 EC2-AからEC2-BへPingを実行する
必要な設定が完了したため、最後にEC2-AからEC2-BへPingを実行して疎通を確認します。
① EC2-BのプライベートIPを確認する
- [CloudFormation]を開きます。
vpc-peering-[name]-01を選択します。- [出力]タブをクリックします。
PeerEC2PrivateIpの値を確認します。
② EC2-Aへ接続する
EC2-Aへ接続し、ターミナルを開きます。
接続方法は、既存環境で利用している方法を使用します。
③ Pingを実行する
EC2-Aのターミナルで、以下のコマンドを実行します。
ping <PeerEC2PrivateIpの値>
例えば、EC2-BのプライベートIPが192.168.0.9の場合は以下のように実行します。
ping 192.168.0.9
想定される結果
64 bytes from 192.168.0.9: icmp_seq=1 ttl=... time=...
64 bytes from 192.168.0.9: icmp_seq=2 ttl=... time=...
64 bytes from 192.168.0.9: icmp_seq=3 ttl=... time=...
EC2-Bから応答が返れば、疎通確認は成功です。
Pingを停止するときはCtrl + Cを押します。
通信経路
EC2-A
↓
VPC-A Route Table
↓
VPC Peering
↓
VPC-B Route Table
↓
Security Group
↓
EC2-B
Pingが失敗する場合の確認ポイント
Pingで応答が返ってこない場合は、VPCピアリングだけでなくルートテーブルやSecurity Groupも確認します。
特に、双方のルート設定が不足していないか確認することが重要です。
| 確認項目 | 確認内容 |
|---|---|
| VPC Peering | pcx-[name]-01が[アクティブ]か |
| VPC-A Route Table | 192.168.0.0/24 → Peeringがあるか |
| VPC-B Route Table | 10.0.0.0/24 → Peeringがあるか |
| Security Group | 10.0.0.0/24からのICMPを許可しているか |
| EC2-B | ec2-[name]-02が[実行中]か |
| Ping先 | PeerEC2PrivateIpの値を指定しているか |
作成した環境を削除する
動作確認が完了したら、今回作成したリソースを削除します。
不要なリソースを残さないよう、順番に削除していきます。
Step10 VPCピアリング接続を削除する
- [VPC]→[ピアリング接続]を開きます。
pcx-[name]-01を選択します。- [アクション]をクリックします。
- [VPCピアリング接続を削除]をクリックします。
- 確認画面の内容を確認します。
- [削除]をクリックします。
Step11 VPC-A側のルートを削除する
- [VPC]→[ルートテーブル]を開きます。
- VPC-A側で使用しているルートテーブルを選択します。
- [ルート]タブを開きます。
- [ルートを編集]をクリックします。
192.168.0.0/24 → VPC Peeringの行にある[削除]をクリックします。- [変更を保存]をクリックします。
Step12 CloudFormationスタックを削除する
- [CloudFormation]を開きます。
- [スタック]から
vpc-peering-[name]-01を選択します。 - 画面右上の[削除]をクリックします。
- 確認画面で[削除]をクリックします。
- ステータスが
DELETE_IN_PROGRESSになることを確認します。 - スタックが一覧から削除されるまで待ちます。
スタックを削除すると、以下のリソースもまとめて削除されます。
ec2-[name]-02sgp-[name]-02rtb-[name]-02subnet-[name]-02vpc-[name]-02
ポイント
EC2-Bは起動している間、利用状況に応じて料金が発生します。
そのため、ハンズオン終了後は不要なリソースが残っていないことを確認します。
追加で設定するとできること
ここまでの手順では、EC2-AからEC2-BへPingを実行してVPC間の疎通を確認しました。
さらに、用途に応じた設定を追加することで、Ping以外の通信にもVPCピアリングを利用できます。
例えば、SSH接続やWeb通信、データベースへの接続などです。
| やりたいこと | 追加する主な設定 | できること |
|---|---|---|
| SSH接続 | TCP 22の許可+キーペアなどの認証設定 | EC2-AからEC2-Bへログインして操作する |
| Web通信 | Webサーバ+TCP 80/443の許可 | 別VPCのWebサービスへアクセスする |
| DB通信 | RDS+DBで利用するポートの許可 | 別VPCのデータベースへ接続する |
まとめ
この記事では、VPCピアリングを利用して異なるVPCに配置されたEC2同士を接続しました。
そして、プライベートIPアドレスを利用して通信できることを確認しました。
今回のハンズオンで確認したポイントは、以下の4つです。
- ・VPCピアリングで異なるVPC同士を接続する
- ・ルートテーブルで相手側VPCへの通信経路を設定する
- ・Security Groupで必要な通信を許可する
- ・Pingを実行してEC2間の疎通を確認する
特に重要なのは、VPCピアリング接続を作成しただけでは通信できない点です。
通信を成立させるには、双方のルートテーブルへ相手VPC宛てのルートを設定する必要があります。
また、Security Groupでも必要な通信を許可します。
このように、VPCピアリング、ルートテーブル、Security Groupを組み合わせることで、
異なるVPCに配置されたAWSリソース同士をプライベートIPアドレスで通信させることができます。
同じカテゴリーの記事
同じカテゴリの記事を読む