「CIDR重複でPeering接続が拒否された」
VPC Peeringの設定でつまずくポイントは、ほぼこの2点に集約されます。Peering接続がActiveになっても、ルートテーブルへの経路追加を両VPC側で行わなければ疎通はできません。またCIDRブロックが重複したままでは、そもそも接続要求が通りません。
この記事では、AWS VPC Peeringを使ったマルチAZ構成設計を中心に、CIDR重複を防ぐアドレス計画から、ルートテーブルへの経路追加・セキュリティグループ設定・VPCをまたいだDNS名前解決まで、CLIコマンドを交えて体系的に解説します。Transit Gatewayとの比較ではなく「VPC Peeringだけで複数VPCを繋ぐ設計」を想定した実践ガイドです。この記事では、Amazon Linux 2023/AWS CLI v2を想定環境として説明します。
この記事のポイント
・CIDRブロックの重複があるとVPC Peering接続要求が通らない(設計段階で分割する)
・PeeringがActiveでも双方のルートテーブルに相手CIDR宛の経路を追加しないと疎通しない
・セキュリティグループはPeering先のCIDRブロックを送信元として明示的に許可する
・enableDnsSupport・enableDnsHostnamesを有効にするとVPC間でDNS名前解決が可能になる
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
VPC Peeringとは:どんな場面で使うか
VPC Peering(VPCピアリング)は、2つのVPCをAWSのプライベートネットワーク上で直接接続する機能です。インターネットゲートウェイ・VPN・Direct Connectを経由しないため、低レイテンシ・低コストでVPC間通信を実現できます。代表的なユースケースは次のとおりです。
・本番VPCとステージングVPCを分離しつつ共通サービスへアクセスさせる
・アカウント間でDBやログ収集サービスを共有する
・組織内の複数プロジェクトVPCを1つの共通サービスVPCに集約する
3つ以上のVPCを相互に接続する場合、VPC Peeringは N×(N-1)/2 本の接続が必要です。VPCが4つなら6本、5つなら10本になります。この段階ではTransit Gatewayの方がシンプルになります。VPC Peeringは「2~3個のVPCを繋ぐシンプルな構成」に最も向いています。
CIDRブロック設計:重複しないアドレス計画の立て方
VPC Peeringの最大の制約は「CIDRブロックが重複しているVPC間では接続できない」点です。後から気づいても、既存VPCのCIDRは変更できないため(追加はCIDR追加機能で可能ですが既存サブネット削除が前提)、**設計段階での計画が最重要**です。1. 推奨するCIDRアドレス設計パターン
RFC 1918のプライベートIPアドレス空間(10.0.0.0/8など)を組織全体で体系的に分割します。# CIDRアドレス割り当て例(マルチVPC設計) # # 環境 VPC CIDR AZ-a サブネット AZ-c サブネット # ───────────────────────────────────────────────────── # 本番 10.0.0.0/16 10.0.1.0/24 10.0.2.0/24 # ステージング 10.1.0.0/16 10.1.1.0/24 10.1.2.0/24 # 共通サービス 10.2.0.0/16 10.2.1.0/24 10.2.2.0/24 # 開発 10.3.0.0/16 10.3.1.0/24 10.3.2.0/24
2. CIDR重複チェックのCLIコマンド
既存VPCのCIDRを一覧確認してから設計するのが安全です。# 既存VPCのCIDRブロック一覧を取得する aws ec2 describe-vpcs \ --query 'Vpcs[*].{VpcId:VpcId,CIDR:CidrBlock,Name:Tags[?Key==`Name`]|[0].Value}' \ --output table
-------------------------------------------------- | DescribeVpcs | +---------------+------------------+-------------+ | CIDR | Name | VpcId | +---------------+------------------+-------------+ | 10.0.0.0/16 | prod-vpc | vpc-0abc123 | | 10.1.0.0/16 | staging-vpc | vpc-0def456 | | 172.31.0.0/16 | default | vpc-0ghi789 | +---------------+------------------+-------------+
VPC PeeringをCLIで設定する手順
ここでは、本番VPC(10.0.0.0/16)と共通サービスVPC(10.2.0.0/16)をマルチAZで接続する手順を示します。1. VPC Peering接続の要求
# Peering接続を要求する(要求元VPCから実行) aws ec2 create-vpc-peering-connection \ --vpc-id vpc-0abc123 \ --peer-vpc-id vpc-0xyz999 \ --tag-specifications 'ResourceType=vpc-peering-connection,Tags=[{Key=Name,Value=prod-to-shared}]' # 出力から VpcPeeringConnectionId(pcx-xxxxxxxx)を控える
2. Peering接続の承認
# 承認(同一アカウントなら要求元で実行可能) aws ec2 accept-vpc-peering-connection \ --vpc-peering-connection-id pcx-0abc12345 # ステータスがActiveになることを確認する aws ec2 describe-vpc-peering-connections \ --vpc-peering-connection-ids pcx-0abc12345 \ --query 'VpcPeeringConnections[0].Status.Code' # 出力: "active"
3. 双方向のルートテーブルへ経路を追加する
ここが最も見落とされやすいポイントです。**PeeringがActiveになっただけでは疎通しません。**両VPC側のルートテーブルに、相手VPCのCIDRブロック宛の経路を手動で追加する必要があります。# 本番VPCのルートテーブルID一覧を確認する aws ec2 describe-route-tables \ --filters "Name=vpc-id,Values=vpc-0abc123" \ --query 'RouteTables[*].{RouteTableId:RouteTableId,Subnets:Associations[*].SubnetId}' \ --output table # 本番VPC側:共通サービスVPC(10.2.0.0/16)宛の経路を追加する aws ec2 create-route \ --route-table-id rtb-0prod1234 \ --destination-cidr-block 10.2.0.0/16 \ --vpc-peering-connection-id pcx-0abc12345 # 共通サービスVPC側:本番VPC(10.0.0.0/16)宛の経路を追加する aws ec2 create-route \ --route-table-id rtb-0shared5678 \ --destination-cidr-block 10.0.0.0/16 \ --vpc-peering-connection-id pcx-0abc12345
セキュリティグループ設定:Peering先CIDRで絞る
ルートテーブルの経路を追加しただけでは、セキュリティグループ(SG)が通信をブロックします。SGの送信元(インバウンドルール)に、Peering先VPCのCIDRブロックを明示的に許可します。# 共通サービスVPC内のDBへ、本番VPCからのMySQL接続を許可する例 aws ec2 authorize-security-group-ingress \ --group-id sg-0shared-db \ --protocol tcp \ --port 3306 \ --cidr 10.0.0.0/16 # 設定を確認する aws ec2 describe-security-groups \ --group-ids sg-0shared-db \ --query 'SecurityGroups[0].IpPermissions'
VPCをまたいだDNS名前解決の有効化
VPC Peeringで繋いだだけでは、相手VPCのEC2インスタンスをプライベートDNS名(ip-10-2-1-50.ap-northeast-1.compute.internal など)で解決できません。DNS名前解決を有効にするには、Peering接続のオプションを設定します。# 要求元VPC → 相手VPCのDNS名解決を有効化する aws ec2 modify-vpc-peering-connection-options \ --vpc-peering-connection-id pcx-0abc12345 \ --requester-peering-connection-options '{"AllowDnsResolutionFromRemoteVpc":true}' # 相手VPC(承認側)でも同様に有効化する aws ec2 modify-vpc-peering-connection-options \ --vpc-peering-connection-id pcx-0abc12345 \ --accepter-peering-connection-options '{"AllowDnsResolutionFromRemoteVpc":true}'
よくあるトラブルと解決策
「PeeringがActiveなのにPingが通らない」
最も多いパターンです。確認順序は次のとおりです。・ルートテーブル: 双方のVPCで相手CIDR宛の経路が追加されているか
・セキュリティグループ: インバウンドルールにPeering先CIDRが許可されているか
・ネットワークACL: VPCのACLにデフォルト(DENY ALL)以外のルールが入っているか
# ルートテーブルの確認(相手CIDRへの経路がpcxに向いているか確認する) aws ec2 describe-route-tables \ --route-table-ids rtb-0prod1234 \ --query 'RouteTables[0].Routes[?DestinationCidrBlock==`10.2.0.0/16`]'
「Peering接続要求が拒否されてActiveにならない」
・CIDRブロックが重複している: 片方のVPCのCIDRを変更(または追加)して再設計する・アカウントIDまたはリージョンが違う: `--peer-owner-id` と `--peer-region` を明示して再要求する
・承認前にタイムアウト(7日): 新たに接続を要求し直す
「異なるリージョン間(クロスリージョンPeering)でDNSが解決できない」
クロスリージョンPeeringでは `AllowDnsResolutionFromRemoteVpc` オプションがサポートされていません。Route 53プライベートホストゾーンを両リージョンのVPCに関連付けることで代替します。本記事のまとめ
| やりたいこと | コマンド・設定 |
|---|---|
| 既存VPCのCIDRを確認する | aws ec2 describe-vpcs --query '...' |
| VPC Peering接続を要求する | aws ec2 create-vpc-peering-connection |
| Peering接続を承認する | aws ec2 accept-vpc-peering-connection |
| ルートテーブルに経路を追加する(双方) | aws ec2 create-route --vpc-peering-connection-id |
| SGでPeering先CIDRを許可する | aws ec2 authorize-security-group-ingress --cidr |
| DNS名前解決を有効にする | aws ec2 modify-vpc-peering-connection-options |
VPC Peeringを含むAWSネットワーク設計の基礎から学びたい場合は、AWSセミナーの詳細ページもあわせてご確認ください。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら
- 前のページへ:マルチAZ冗長設計を正しく理解するAWSアーキテクチャ図例|Draw.ioで描く障害シナリオ
- この記事の属するカテゴリ:AWS(Amazon Linux)へ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は30秒、解除もいつでも可。
登録無料・いつでも解除できます