VPC Endpoint / PrivateLink ハンズオン

NAT を使わずプライベートに AWS API へ通信する ― Gateway / Interface エンドポイントを構築する

VPC Endpoint PrivateLink Gateway Endpoint Interface Endpoint プライベート通信 マネコン操作 所要時間 75〜90 分 v1.0

📋 概要

VPC エンドポイントを使うと、インターネットゲートウェイや NAT ゲートウェイを経由せずに、VPC 内から AWS サービスへプライベートに通信できます。このハンズオンでは、S3 への Gateway Endpoint、SSM / Secrets Manager への Interface Endpoint を構築し、プライベートサブネットの EC2 から NAT なしで AWS API にアクセスする構成を体験します。

項目内容
対象サービスVPC Endpoint(Gateway / Interface)、AWS PrivateLink、S3、SSM、Secrets Manager
主な学習内容Gateway / Interface エンドポイント / プライベート DNS / エンドポイントポリシー / SG 制御
所要時間75〜90 分
難易度★★★★☆(中〜上級者向け)
前提知識VPC / サブネット / ルートテーブル / セキュリティグループの理解
費用目安約 1〜2 USD(Interface Endpoint は 1 個あたり約 0.014 USD/時。終了後削除)
ℹ️ Gateway 型と Interface 型の違い(最重要)
項目Gateway EndpointInterface Endpoint
対象サービスS3・DynamoDB のみほとんどの AWS サービス
仕組みルートテーブルにルート追加サブネットに ENI を配置(PrivateLink)
料金無料有料(時間 + データ処理)
DNSパブリック DNS のままプライベート DNS で上書き

🏗️ アーキテクチャ

🖥️ プライベートサブネットの EC2
パブリック IP なし / NAT なし
↓ S3 アクセス(ルート経由)
🚪 Gateway Endpoint(S3)
ルートテーブルに pl-xxxx → vpce を追加
↓ SSM / Secrets アクセス(ENI 経由)
🔌 Interface Endpoint(ENI + PrivateLink)
ssm / ssmmessages / ec2messages / secretsmanager
↓ AWS バックボーン(インターネットを通らない)
☁️ AWS サービス(S3 / SSM / Secrets Manager)
⚠️ この構成のポイント

EC2 をパブリック IP / NAT なしのプライベートサブネットに置いても、Interface Endpoint があれば Session Manager で接続でき、S3 にもアクセスできます。「インターネットに一切出さずに運用する」セキュアな構成の基礎です。

✅ 前提条件

ℹ️ 検証を分かりやすくするコツ

EC2 のプライベートサブネットのルートテーブルから NAT ゲートウェイへの 0.0.0.0/0 ルートを一時的に外すと、「エンドポイント経由でしか通信できない」状態を作れ、効果を体感しやすくなります。

🚪 ステップ 1 ― S3 用 Gateway Endpoint の作成

1-1. エンドポイントを作成

「VPC」→「エンドポイント」→「エンドポイントを作成」 をクリックします。

設定項目設定値
サービスカテゴリAWS のサービス
サービス名com.amazonaws.ap-northeast-1.s3(タイプ: Gateway)
VPChandson-vpc
ルートテーブルプライベートサブネットのルートテーブル
ポリシーフルアクセス(後で絞る)

「エンドポイントを作成」をクリックします。

1-2. ルートテーブルを確認

選択したルートテーブルを開くと、送信先に pl-xxxxxx(S3 のプレフィックスリスト)、ターゲットに vpce-xxxxxx のルートが自動追加されています。これで S3 宛トラフィックがエンドポイント経由になります。

✅ 確認ポイント

ルートテーブルに S3 プレフィックスリスト宛のルートが追加され、エンドポイントのステータスが「利用可能」になれば成功です。Gateway Endpoint は無料です。

🔬 ステップ 2 ― プライベート EC2 から S3 へ疎通確認

2-1. EC2 に Session Manager で接続

EC2 コンソールから対象インスタンスを選び 「接続」→「Session Manager」 で接続します(この時点では NAT 経由。ステップ 3 で NAT なしでも接続できるようにします)。

2-2. S3 アクセスを確認
# S3 バケット一覧(Gateway Endpoint 経由) aws s3 ls --region ap-northeast-1 # テストアップロード echo "via gateway endpoint" > /tmp/g.txt aws s3 cp /tmp/g.txt s3://handson-bucket-xxxx/g.txt
2-3. NAT を外して効果を確認(任意)

プライベートルートテーブルから NAT への 0.0.0.0/0 ルートを削除します。その状態でも上記の aws s3 ls は成功しますが、curl https://example.com はタイムアウトします。S3 だけがエンドポイント経由で到達できている証拠です。

✅ 確認ポイント

NAT がなくても S3 操作が成功し、一般のインターネット通信は失敗することを確認できれば、Gateway Endpoint が機能しています。

🔌 ステップ 3 ― SSM 用 Interface Endpoint の作成

NAT を完全に外しても Session Manager で接続できるように、SSM 系の Interface Endpoint を作ります。

3-1. 3 つのエンドポイントを作成

Session Manager には以下 3 つの Interface Endpoint が必要です。それぞれ「エンドポイントを作成」で作成します。

サービス名用途
com.amazonaws.ap-northeast-1.ssmSSM 本体 API
com.amazonaws.ap-northeast-1.ssmmessagesSession Manager の通信
com.amazonaws.ap-northeast-1.ec2messagesSSM エージェント通信
3-2. 共通設定
設定項目設定値
タイプInterface
VPChandson-vpc
サブネットプライベートサブネット(2 AZ)
プライベート DNS 名を有効化オン(重要)
セキュリティグループ後述の sg-endpoint
ℹ️ プライベート DNS を有効化する意味

有効にすると、ssm.ap-northeast-1.amazonaws.com という通常のエンドポイント名が VPC 内では自動的にエンドポイントの ENI(プライベート IP)に解決されます。アプリ側のコード変更なしでプライベート通信に切り替わります。

3-3. NAT なしで Session Manager 接続を確認

NAT ルートを外したまま、EC2 に Session Manager で接続できることを確認します。エンドポイントが効いていれば、インターネットに一切出ずに接続できます。

✅ 確認ポイント

NAT ゲートウェイへのルートがない状態でも、Session Manager で EC2 に接続できれば成功です。

🔐 ステップ 4 ― Secrets Manager 用 Interface Endpoint

4-1. エンドポイントを作成

サービス名 com.amazonaws.ap-northeast-1.secretsmanager で Interface Endpoint を作成します(プライベート DNS 有効、同じプライベートサブネット・SG)。

4-2. DNS 解決とアクセスを確認
# エンドポイント名がプライベート IP に解決されるか nslookup secretsmanager.ap-northeast-1.amazonaws.com # => 10.0.x.x(VPC 内のプライベート IP)が返ればプライベート DNS が有効 # NAT なしでシークレット取得が成功するか aws secretsmanager get-secret-value \ --secret-id handson/db-credentials \ --query SecretString --output text
4-3. エンドポイントポリシーで絞る(任意)

エンドポイントの「ポリシー」タブで、特定のシークレットだけ許可するように制限できます。VPC からアクセスできる範囲をエンドポイント単位で最小化できます。

{
  "Statement": [{
    "Effect": "Allow",
    "Principal": "*",
    "Action": "secretsmanager:GetSecretValue",
    "Resource": "arn:aws:secretsmanager:ap-northeast-1:<AccountId>:secret:handson/*"
  }]
}
✅ 確認ポイント

エンドポイント名がプライベート IP に解決され、NAT なしでシークレットを取得できれば成功です。

🛡️ ステップ 5 ― セキュリティグループによる制御

Interface Endpoint の ENI はセキュリティグループで保護できます。誰がエンドポイントを使えるかを制御します。

5-1. エンドポイント用 SG を作成

sg-endpoint を作成し、インバウンドルールで EC2 の SG からの HTTPS(443)だけを許可します。

タイプポートソース
HTTPS443sg-ec2(EC2 のセキュリティグループ)

各 Interface Endpoint にこの SG を割り当てます。

5-2. アクセス制御を検証

EC2 の SG を一時的にソースから外すと、エンドポイント経由の API がタイムアウトすることを確認します(443 が届かなくなるため)。確認後は元に戻します。

ℹ️ PrivateLink でカスタムサービス公開(発展)

自社の ALB/NLB の背後にあるサービスを、別 VPC や別アカウントに Endpoint Service として公開できるのが PrivateLink です。SaaS 提供者が顧客 VPC にプライベート接続を提供する仕組みもこれです。NLB + エンドポイントサービスを作成し、コンシューマー側で Interface Endpoint を作れば、インターネットを経由しないサービス間接続が実現します。

✅ 確認ポイント

SG でソースを許可したときのみエンドポイント経由の通信が成功し、外すとタイムアウトすることを確認できれば、エンドポイントのアクセス制御を理解できています。

🧹 クリーンアップ

⚠️ Interface Endpoint は時間課金

Interface Endpoint は 1 個あたり約 0.014 USD/時 × AZ 数の課金が続きます。複数作成しているので、終了後は必ずすべて削除してください。Gateway Endpoint は無料です。

削除手順

  1. すべての VPC エンドポイントを削除
    VPC → エンドポイント → ssm / ssmmessages / ec2messages / secretsmanager / s3 をすべて選択 → 「アクション」→「VPC エンドポイントを削除」
  2. NAT ルートを戻す(検証で外した場合)
    プライベートルートテーブルに 0.0.0.0/0 → NAT を再追加
  3. エンドポイント用 SG を削除
    sg-endpoint を削除
  4. テスト用リソースを削除
    cfn-base スタックを使った場合はスタックごと削除

学習のまとめ

習得したスキル実践内容
Gateway EndpointS3 用エンドポイント・ルートテーブル連携(無料)
プライベート疎通NAT なしで S3 アクセス・インターネット遮断の確認
Interface EndpointSSM 3 種で NAT なし Session Manager 接続
プライベート DNSエンドポイント名をプライベート IP に自動解決
アクセス制御SG とエンドポイントポリシーによる最小化 / PrivateLink の概念