AWS PrivateLink for Amazon S3を分かりやすく解説してみる

記事タイトルとURLをコピーする

杉村です。待望のアップデートがありました。 Amazon S3 用の PrivateLink (Interface 型 VPC Endpoint)です!
従来までも Gateway 型と呼ばれるタイプの S3 用 VPC Endpoint は利用できましたが、今回は Interface 型の VPC Endpoint が利用可能になりました。
東京リージョンでも既に利用可能です。

このアップデートは何が嬉しいのか?従来からある Gateway 型 VPC Endpoint と 今回の Interface 型の VPC Endpoint の違いは?利用方法は?など気になる点を見ていきましょう。

何が嬉しいのか?

考えられるユースケースはいくつかありますが「オンプレミスから専用線(※)や Internet VPN 経由で Amazon S3 が利用できるようになった」という部分が一番大きいでしょう。

※従来も 専用線 (AWS Direct Connect) の Public Virtual Interface という仕組みを使えば利用できましたが、利用されているケースはそこまで多くありませんでした

図解

AWS PrivateLink for Amazon (インターフェイス型 VPC Endpoint) をオンプレミスから使う場合の構成を図で説明すると以下のようになります。

f:id:swx-yuma-sugimura:20210204081136p:plain
PrivateLink for Amazon S3

なお従来のゲートウェイ型 VPC Endpoint の場合、以下のように EC2 インスタンスで Proxy サーバを用意して、それを経由してアクセスする方法がありました。参考までに記載します。

f:id:swx-yuma-sugimura:20210204161104p:plain
Gateway VPC Endpoint for Amazon S3

Gateway 型と Interface 型の違い

公式ドキュメントの表を少し変えて記載すると、以下のようになります。

観点 ゲートウェイ型 VPC Endpoint (S3) インターフェイス型 VPC Endpoint (S3)
クライアントがアクセスに利用するIPアドレス パブリック IP アドレス プライベート IP アドレス(Interface VPC Endpointのもの)
オンプレから利用可能か 不可 (HTTP Proxyを挟むなどすれば可能) 可能
リージョンをまたいだ利用が可能か 不可 可能
料金 無料 有料

1行目の クライアントがアクセスに利用するIPアドレス というは少し分かりづらいかもしれません。
VPC 内の EC2 インスタンスなどから S3 へアクセスする際、従来のゲートウェイ型 VPC Endpoint を使った場合、以下のようなプロセスでした。

  1. クライアント(EC2上のプログラム等)が S3 の DNS 名を名前解決する( S3 のパブリック IP が解決される)
  2. クライアントがそのパブリック IP に向けてアクセスする
  3. Subnet のルートテーブルにより、そのパブリック IP へのパケットは VPC Endpoint に向けルーティングされる

一方で今回の PrivateLink (インターフェイス型 VPC Endpoint) を使った場合は、以下のようになります。

  1. クライアントは S3 アクセス時、Interface VPC Endpoint の DNS名(※) を名前解決する( Interface VPC Endpoint の プライベート IP が解決される)
  2. クライアントがそのプライベート IP に向けてアクセスする
  3. Subnet のルートテーブルにより、そのプライベート IP へのパケットは VPC Endpoint に向けルーティングされる

<エンドポイントごと固有の値>.s3.ap-northeast-1.vpce.amazonaws.com のような Endpoint ごとにユニークな URL 。パブリックな DNS で名前解決可能

使い方

AWS CLI や AWS SDK からの利用

PrivateLink (インターフェイス型 VPC Endpoint) はマネジメントコンソールの VPC 画面から簡単に作成できますので、詳しく解説はしません。

ただし AWS CLI や AWS SDK は、何もしないと普段通りの S3 の DNS 名を使ってしまいせっかく作った VPC Endpoint を使ってくれませんので、 Interface VPC Endpoint の DNS 名を使ってくれるようにプログラム側で指示してあげる必要があります。
AWS CLI の場合は以下のようになります。

aws s3 --endpoint-url https://bucket.<エンドポイントごと固有の値>.s3.ap-northeast-1.vpce.amazonaws.com ls s3://<バケット名>/

--endpoint-url オプションで、アクセスしに行く API エンドポイントを明示的に指定しています。これにより Interface VPC Endpoint 経由でアクセスしてくれるようになります。エンドポイントのDNS名は、マネジメントコンソールで確認できます。

AWS SDK 各種でも同様に、パラメータで接続先の API エンドポイントを指定してあげる必要があります。

参考: AWS PrivateLink for Amazon S3

オンプレからの利用時は?

オンプレミスサイトから Interface VPC Endpoint for Amazon S3 を利用するにあたって、以下の条件を満たしている必要があります。

  • AWS Direct Connect や Site-to-Site VPN でオンプレミスサイトから VPC へ疎通できること
  • クライアントはパブリック(インターネット経由)の名前解決ができること

2つ目が良く分からないという場合、お手持ちの AWS 検証環境で実際に Interface VPC Endpoint を作ってみてください(多少の料金が発生します)。
そして、その VPC Endpoint の DNS 名 ( <エンドポイントごと固有の値>.s3.ap-northeast-1.vpce.amazonaws.com )をご自分のパソコンから nslookup コマンド等で名前解決してみてください。
すると、 VPC Endpoint の Private IP アドレスが解決されるはずです。つまり、インターネット経由で名前解決しているのです。

杉村 勇馬 (記事一覧)

サーバーワークス → 株式会社G-gen 執行役員CTO

2021 Japan APN Ambassadors / 2021 APN All AWS Certifications Engineers

マルチAWSアカウント管理運用やネットワーク関係のAWSサービスに関するブログ記事を過去に執筆。

2021年09月から株式会社G-genに出向、Google Cloud(GCP)が専門に。G-genでもGoogle Cloud (GCP) の技術ブログを執筆中。