VPC PrivateLink でクロスVPCサービス公開を試してみた

VPC PrivateLink でクロスVPCサービス公開を試してみた

2026.04.26

はじめに

かつまたです。

VPC間の通信というと VPC Peering や Transit Gateway がまず思い浮かびますが、「特定のサービスだけを一方向に公開したい」というユースケースには VPC PrivateLink が適しています。今回は Web サーバー側 VPC の Web サービスを クライアント側 VPC からプライベートに利用する構成を実際に構築してみました。

やりたいことまとめ

  • Web サーバー側 VPC 内の Web サービスを クライアント側 VPC からプライベートに利用する
  • VPC Peering・TGW・DXは使わない
  • 一方向のサービス公開(クライアント → Web サーバー)によるセキュリティメリットを体感する
  • Web サーバー側の IP アドレスを クライアント 側から見えない状態にする

構成図

architecture.drawio.png

前提条件

以下は構築済みの前提とします。操作は Admin 権限で実施しています。

項目
リージョン ap-northeast-1
Web サーバー側 VPC 10.1.0.0/16(プライベートサブネット 1a: 10.1.1.0/24、1c: 10.1.2.0/24)
クライアント側 VPC 10.2.0.0/16(プライベートサブネット 1a: 10.2.1.0/24)
SSM 用 VPC エンドポイント 各 VPC に ssm / ssmmessages / ec2messages の3種
S3 Gateway エンドポイント Web サーバー側 VPC(ユーザデータでの Amazon Linux 2023 リポジトリ接続用)
IAM インスタンスプロファイル AmazonSSMManagedInstanceCore ポリシーをアタッチしたロールを紐付け

セキュリティグループ

SG 名 配置 VPC インバウンドルール
Web サーバー EC2 用 Web サーバー側 TCP 80 ← 10.1.0.0/16(NLB ENI からの転送を受ける)
NLB 用 Web サーバー側 TCP 80 ← 10.0.0.0/8(PrivateLink 経由のクライアントトラフィックを受ける)
Web サーバー側 SSM エンドポイント用 Web サーバー側 TCP 443 ← 10.1.0.0/16
クライアント EC2 用 クライアント側 (不要。egress デフォルト全許可で OK)
PrivateLink エンドポイント用 クライアント側 TCP 80 ← クライアント EC2 用 SG
クライアント側 SSM エンドポイント用 クライアント側 TCP 443 ← 10.2.0.0/16

アウトバウンドは全 SG ともデフォルト(全許可)のままで問題ありません。

やってみた

マネジメントコンソールで以下の手順を実施します。

1. Webサーバー用インスタンス作成

EC2 コンソール →「インスタンスを起動」

設定項目
AMI Amazon Linux 2023(最新)
インスタンスタイプ t3.micro
キーペア なし(SSM で接続)
VPC Web サーバー側 VPC
サブネット プライベートサブネット
パブリック IP 自動割り当て 無効
セキュリティグループ 事前作成した Web サーバー EC2 用SG
IAM インスタンスプロファイル 事前作成したSSM用ロール

スクリーンショット 2026-04-26 15.44.23.png

「高度な詳細」→「ユーザーデータ」に以下を貼り付けます。簡易的な Web ページを構築します。

#!/bin/bash
dnf install -y nginx
systemctl enable --now nginx
TOKEN=$(curl -s -X PUT "http://169.254.169.254/latest/api/token" \
  -H "X-aws-ec2-metadata-token-ttl-seconds: 21600")
INSTANCE_ID=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" \
  http://169.254.169.254/latest/meta-data/instance-id)
PRIVATE_IP=$(curl -s -H "X-aws-ec2-metadata-token: $TOKEN" \
  http://169.254.169.254/latest/meta-data/local-ipv4)
cat > /usr/share/nginx/html/index.html << HTML
<h1>Hello from Web サーバー側 VPC via PrivateLink!</h1>
<p>Instance ID: ${INSTANCE_ID} / Private IP: ${PRIVATE_IP}</p>
HTML

スクリーンショット 2026-04-26 15.44.56.png

「インスタンスを起動」をクリックします。

2. クライアント用インスタンス作成

同じく EC2 コンソール →「インスタンスを起動」

設定項目
AMI Amazon Linux 2023(最新)
インスタンスタイプ t3.micro
キーペア なし(SSM で接続)
VPC クライアント側 VPC
サブネット プライベートサブネット
パブリック IP 自動割り当て 無効
セキュリティグループ 事前作成したクライアント EC2 用 SG
IAM インスタンスプロファイル 事前作成したSSM用ロール

両方のインスタンスが running になったら、Systems Manager のフリートマネージャーでインスタンスが表示されることを確認します。

スクリーンショット 2026-04-26 15.59.25.png

3. NLB の作成

3-1. ターゲットグループの作成

EC2 コンソール → 左メニュー「ターゲットグループ」→「ターゲットグループの作成」

設定項目
ターゲットタイプ インスタンス
プロトコル TCP
ポート 80
VPC Web サーバー側 VPC
ヘルスチェックプロトコル HTTP
ヘルスチェックパス /

スクリーンショット 2026-04-26 16.17.44.png

「次へ」でターゲット登録画面に進み、Web サーバー用インスタンス を選択して「保留中として以下を含める」→「ターゲットグループの作成」をクリックします。

3-2. NLB 本体の作成

EC2 コンソール →「ロードバランサー」→「ロードバランサーの作成」→「Network Load Balancer」を選択。

設定項目
スキーム 内部(Internal)
IP アドレスタイプ IPv4
VPC Web サーバー側 VPC
マッピング ap-northeast-1a → Web サーバー側 VPC のプライベートサブネット 1a / ap-northeast-1c → Web サーバー側 VPC のプライベートサブネット 1c
セキュリティグループ 事前作成した NLB 用 SG
リスナー TCP:80 → 上記で作成したターゲットグループ

作成後、NLB の状態が Active になり、ターゲットのヘルスチェックが healthy になるまで 2〜5分待ちます。

スクリーンショット 2026-04-26 16.13.38.png

4. VPC Endpoint Service の作成(Web サーバー側)

VPC コンソール → 左メニュー「エンドポイントサービス」→「エンドポイントサービスを作成」

設定項目
ロードバランサーのタイプ ネットワーク
使用可能なロードバランサー 先ほど作成したNLB
承諾が必要 有効(接続リクエストを手動承認)
サポートされる IP アドレスタイプ IPv4

作成後、サービス名com.amazonaws.vpce.ap-northeast-1.vpce-svc-xxxxxxxx)をメモします。

スクリーンショット 2026-04-26 16.20.15.png

続いて「プリンシパルを許可」タブで、プリンシパルを登録します。

設定例

arn:aws:iam::<アカウントID>:root
arn:aws:iam::<アカウントID>:role/<操作ロール名>

スクリーンショット 2026-04-26 16.20.44.png
スクリーンショット 2026-04-26 16.21.00.png

5. VPC Endpoint の作成(クライアント 側)

VPC コンソール → 左メニュー「エンドポイント」→「エンドポイントを作成」

設定項目
サービスカテゴリ NLB と GWLB を使用するエンドポイントサービス
サービス名 4 でメモしたサービス名
VPC クライアント側 VPC
サブネット ap-northeast-1a → クライアント側 VPC のプライベートサブネット
IP アドレスタイプ IPv4
セキュリティグループ 事前作成した PrivateLink エンドポイント用 SG

スクリーンショット 2026-04-26 16.25.43.png

サービス名を入力した後、「サービスの検証」で サービス名が検証されました。 と表示されることを確認してから作成します。

6. 接続リクエストの承認(Web サーバー側)

VPC コンソール →「エンドポイントサービス」→ 4 で作成したエンドポイントサービスを選択 →「エンドポイント接続」タブ。

作成したエンドポイントを選択し、「アクション」→「エンドポイント接続リクエストの承諾」→「承諾」をクリックします。

スクリーンショット 2026-04-26 16.27.55

7. Endpoint DNS 名の確認

VPC コンソール →「エンドポイント」→ 5 で作成したエンドポイントの「詳細」タブにある DNS 名 をメモします。

これが クライアント側 VPC 内からサービスにアクセスするための URL になります。

動作確認

クライアント EC2 に SSM Session Manager で接続して動作確認します。

$ curl <7 で記録した DNS>

出力例

<h1>Hello from Provider VPC via PrivateLink!</h1>
<p>Instance ID: i-0d4060bc7079c4b22 / Private IP: 10.1.1.73</p>

Web サーバー側 VPC の Nginx からレスポンスが返ってきました。

テスト2:Web サーバー IP への直接通信が不可能なことの確認

$ curl --connect-timeout 5 http://<Web サーバー IP>

出力例

curl: (28) Connection timed out after 5001 milliseconds

VPC Peering も TGW も無いため、IP 直接の通信はタイムアウトします。PrivateLink は 一方向のサービス公開であり、クライアント側から Web サーバー側のネットワークに侵入することはできません。

おわりに

ご覧いただきありがとうございました。

VPC PrivateLink を使い、Web サーバー側の IP アドレスを完全に隠蔽した上で、特定のサービスだけを一方向に公開できることが実機で確認できました。VPC Peering や TGW のように VPC 全体を相互接続する必要がなく、「サービス提供側が誰に公開するかを制御できる」点が大きなセキュリティメリットです。

参考

https://docs.aws.amazon.com/ja_jp/vpc/latest/privatelink/endpoint-service.html
https://docs.aws.amazon.com/ja_jp/vpc/latest/privatelink/create-interface-endpoint.html

クラスメソッドオペレーションズ株式会社について

クラスメソッドグループのオペレーション企業です。
運用・保守開発・サポート・情シス・バックオフィスの専門チームが、IT・AIをフル活用した「しくみ」を通じて、お客様の業務代行から課題解決や高付加価値サービスまでを提供するエキスパート集団です。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、クラスメソッドオペレーションズ株式会社 コーポレートサイト をぜひご覧ください。※2026年1月 アノテーション㈱から社名変更しました

この記事をシェアする

関連記事