AWS

VPCピアリングを用いたEC2間通信

NEW 2026年8月24日

目次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ピアリングを利用してVPC-AのEC2-AとVPC-BのEC2-Bを接続するAWS構成図

項目VPC-AVPC-B
用途既存環境新規作成する環境
CIDR10.0.0.0/24192.168.0.0/24
EC2EC2-AEC2-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サービスの役割を整理します。

サービス役割例えると
VPCAWS上に独立したネットワークを作成する建物
SubnetVPC内のネットワークを分割する建物の部屋
VPC Peering2つのVPCを接続する建物同士を結ぶ専用通路
Route Table通信をどこへ送るか決める道案内
Security GroupEC2への通信を制御する部屋のドア・鍵
EC2VPC内で動作する仮想サーバ部屋の中にいる人
CloudFormationAWSリソースをテンプレートから作成・管理する設計図

今回の構成を建物に例えて考えてみます。
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を確認する

確認手順
  1. AWSマネジメントコンソールを開きます。
  2. 画面上部の検索欄へ「VPC」と入力します。
  3. 検索結果から[VPC]をクリックします。
  4. 左メニューの[お使いのVPC]をクリックします。
  5. 今回使用する既存のVPC-Aを選択します。
  6. [詳細]からVPC IDとIPv4 CIDRを確認します。
確認する値
項目
IPv4 CIDR10.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を確認する

確認手順
  1. 画面上部の検索欄へ「EC2」と入力します。
  2. 検索結果から[EC2]をクリックします。
  3. 左メニューの[インスタンス]をクリックします。
  4. 今回使用するEC2-Aを選択します。
  5. [詳細]タブからインスタンスの状態を確認します。
  6. [ネットワーキング]タブからプライベートIPv4アドレスとサブネットIDを確認します。
確認する値
  • インスタンスの状態:[実行中]
  • VPC ID:Step1で確認したVPC-A
  • プライベートIPv4アドレス
  • サブネットID

ポイント

EC2-AのサブネットIDは、後ほどVPC-A側で使用しているルートテーブルを確認するときに利用します。

Step2 CloudFormationテンプレートを作成する

次に、VPC-B側の環境を作成します。
今回はCloudFormationを利用するため、最初にテンプレートを準備します。

① YAMLファイルを作成する

  1. VSCodeを開きます。
  2. 任意の作業フォルダを開きます。
  3. 新規ファイルを作成します。
  4. ファイル名をtemplate.ymlとします。
  5. 以下の内容を貼り付けて保存します。
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マネジメントコンソール上で入力する値です。

例えば、Nametestと入力すると、以下のような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
出力キー使用する場面
PeerVpcIdVPCピアリング接続の作成
PeerVpcCidrVPC-BのCIDR確認
PeerRouteTableIdVPC-B側のルート設定
PeerEC2PrivateIpPingの実行
PeerSecurityGroupIdSecurity Groupの確認

Step3 CloudFormationスタックを作成する

テンプレートの準備ができたら、CloudFormationへアップロードしてスタックを作成します。

① テンプレートをアップロードする

  1. AWSマネジメントコンソール上部の検索欄へ「CloudFormation」と入力します。
  2. 検索結果から[CloudFormation]をクリックします。
  3. [スタック]画面右上の[スタックの作成]をクリックします。
  4. [新しいリソースを使用(標準)]をクリックします。
  5. [テンプレートの準備]は[既存のテンプレートを選択]を選択します。
  6. [テンプレートの指定]で[テンプレートファイルのアップロード]を選択します。
  7. [ファイルの選択]をクリックします。
  8. template.ymlを選択します。
  9. [次へ]をクリックします。

② スタックの詳細を指定する

項目設定値
スタック名vpc-peering-[name]-01
Name[name]
LatestAmiId初期値のまま

例えば、Nametestと入力する場合、
スタック名はvpc-peering-test-01とします。

  1. [スタック名]へvpc-peering-[name]-01を入力します。
  2. [パラメータ]の[Name]へ自分の名前などの識別用文字列を入力します。
  3. [LatestAmiId]は初期値のままにします。
  4. [次へ]をクリックします。
  5. [スタックオプションの設定]は変更せず、[次へ]をクリックします。
  6. [確認して作成]画面で設定内容を確認します。
  7. 最後に、画面下部の[送信]をクリックします。

③ スタックの作成完了を確認する

作成したスタックを開き、[スタック情報]に表示されるステータスを確認します。

CREATE_COMPLETE

ステータスがCREATE_COMPLETEになれば、VPC-B側の環境作成は完了です。

作成に失敗した場合

スタックの[イベント]タブを開きます。
その後、CREATE_FAILEDとなっているリソースの[ステータス理由]を確認します。

Step4 CloudFormationの出力を確認する

スタックの作成が完了したら、後の設定で利用するVPC IDやプライベートIPアドレスを確認します。

  1. CloudFormationの[スタック]から今回作成したvpc-peering-[name]-01をクリックします。
  2. [出力]タブをクリックします。
  3. 以下の出力値を確認します。
出力キー確認する値
PeerVpcIdVPC-BのVPC ID
PeerRouteTableIdVPC-BのルートテーブルID
PeerEC2PrivateIpEC2-BのプライベートIPアドレス
PeerSecurityGroupIdEC2-BのSecurity Group ID

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

VPC-Bの準備ができたため、次にVPC-AとVPC-BをVPCピアリングで接続します。

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

  1. AWSマネジメントコンソールで[VPC]を開きます。
  2. 左メニューの[ピアリング接続]をクリックします。
  3. 画面右上の[ピアリング接続を作成]をクリックします。
設定内容
項目設定値
名前pcx-[name]-01
VPC ID(リクエスタ)既存のVPC-A
アカウント自分のアカウント
VPC ID(アクセプタ)Step4のPeerVpcId
  1. [名前]へpcx-[name]-01を入力します。
  2. [VPC ID(リクエスタ)]で既存のVPC-Aを選択します。
  3. [アカウント]は[自分のアカウント]を選択します。
  4. [VPC ID(アクセプタ)]へStep4で確認したPeerVpcIdを指定します。
  5. 設定内容を確認します。
  6. [ピアリング接続を作成]をクリックします。

ポイント

リクエスタVPCは接続を要求する側です。
一方、アクセプタVPCは接続要求を受ける側です。
今回はVPC-AからVPC-Bへ接続を要求します。

② VPCピアリング接続を承認する

  1. [VPC]→[ピアリング接続]を開きます。
  2. pcx-[name]-01を選択します。
  3. 画面右上の[アクション]をクリックします。
  4. [リクエストを承諾]をクリックします。
  5. 確認画面で[リクエストを承諾]をクリックします。
  6. [ステータス]が[アクティブ]になったことを確認します。

ポイント

ステータスが[アクティブ]になっても、この時点ではEC2-AとEC2-Bは通信できません。
次に、双方のルートテーブルへVPCピアリング用のルートを追加します。

Step6 VPC-A側のルートテーブルを設定する

EC2-AからVPC-Bへ通信を送れるようにします。
そのため、EC2-Aが利用しているルートテーブルへVPC-B宛てのルートを追加します。

VPC-Bへのルートを追加する

  1. 左メニューの[ルートテーブル]をクリックします。
  2. VPC-A側のルートテーブルを選択します。
  3. [ルート]タブをクリックします。
  4. [ルートを編集]をクリックします。
  5. [ルートを追加]をクリックします。
項目設定値
送信先192.168.0.0/24
ターゲットピアリング接続 → pcx-[name]-01
  1. [送信先]へ192.168.0.0/24を入力します。
  2. [ターゲット]で[ピアリング接続]を選択します。
  3. 作成したpcx-[name]-01を選択します。
  4. [変更を保存]をクリックします。
設定後
192.168.0.0/24 → VPC Peering

Step7 VPC-B側のルートテーブルを設定する

続いて、EC2-BからVPC-Aへ通信を返せるようにします。
VPC-B側のルートテーブルへ、VPC-A宛てのルートを追加します。

  1. [VPC]→[ルートテーブル]を開きます。
  2. Step4で確認したPeerRouteTableIdと一致するルートテーブルを選択します。
  3. [ルート]タブをクリックします。
  4. [ルートを編集]をクリックします。
  5. [ルートを追加]をクリックします。
項目設定値
送信先10.0.0.0/24
ターゲットピアリング接続 → pcx-[name]-01
  1. [送信先]へ10.0.0.0/24を入力します。
  2. [ターゲット]で[ピアリング接続]を選択します。
  3. pcx-[name]-01を選択します。
  4. [変更を保存]をクリックします。

重要

最終的に、以下の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を確認します。

  1. AWSマネジメントコンソールから[EC2]を開きます。
  2. 左メニューの[セキュリティグループ]をクリックします。
  3. sgp-[name]-02を選択します。
  4. [インバウンドルール]タブを確認します。
タイププロトコルソース
すべてのICMP – IPv4ICMP10.0.0.0/24

このルールはCloudFormationで作成済みです。
そのため、上記の設定になっていれば追加操作は不要です。

Step9 EC2-AからEC2-BへPingを実行する

必要な設定が完了したため、最後にEC2-AからEC2-BへPingを実行して疎通を確認します。

① EC2-BのプライベートIPを確認する

  1. [CloudFormation]を開きます。
  2. vpc-peering-[name]-01を選択します。
  3. [出力]タブをクリックします。
  4. 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 Peeringpcx-[name]-01が[アクティブ]か
VPC-A Route Table192.168.0.0/24 → Peeringがあるか
VPC-B Route Table10.0.0.0/24 → Peeringがあるか
Security Group10.0.0.0/24からのICMPを許可しているか
EC2-Bec2-[name]-02が[実行中]か
Ping先PeerEC2PrivateIpの値を指定しているか

作成した環境を削除する

動作確認が完了したら、今回作成したリソースを削除します。
不要なリソースを残さないよう、順番に削除していきます。

Step10 VPCピアリング接続を削除する

  1. [VPC]→[ピアリング接続]を開きます。
  2. pcx-[name]-01を選択します。
  3. [アクション]をクリックします。
  4. [VPCピアリング接続を削除]をクリックします。
  5. 確認画面の内容を確認します。
  6. [削除]をクリックします。

Step11 VPC-A側のルートを削除する

  1. [VPC]→[ルートテーブル]を開きます。
  2. VPC-A側で使用しているルートテーブルを選択します。
  3. [ルート]タブを開きます。
  4. [ルートを編集]をクリックします。
  5. 192.168.0.0/24 → VPC Peeringの行にある[削除]をクリックします。
  6. [変更を保存]をクリックします。

Step12 CloudFormationスタックを削除する

  1. [CloudFormation]を開きます。
  2. [スタック]からvpc-peering-[name]-01を選択します。
  3. 画面右上の[削除]をクリックします。
  4. 確認画面で[削除]をクリックします。
  5. ステータスがDELETE_IN_PROGRESSになることを確認します。
  6. スタックが一覧から削除されるまで待ちます。

スタックを削除すると、以下のリソースもまとめて削除されます。

  • ec2-[name]-02
  • sgp-[name]-02
  • rtb-[name]-02
  • subnet-[name]-02
  • vpc-[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アドレスで通信させることができます。

この記事を書いた人

金山ゆう

yu_kanayama

26卒 AIクラウドセクション