Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

AWSリージョンをまたぐS3バケットアクセス(2025年11月以降はVPCピアリング不要!)

By Tomer RadianDec 28, 20259 min read

このページはEnglishDeutschEspañolFrançaisItalianoPortuguêsでもご覧いただけます。

クロスリージョンのS3アクセスに、VPC Interface EndpointとプライベートDNSだけでは不十分な理由を実践的に解説するガイドです。

OpenArtで生成

重要なアップデート!

2025年11月19日、AWSは「AWS PrivateLinkがAWSサービス向けにクロスリージョン接続をサポート」と発表しました [1]。

これにより、本記事で解説するVPCピアリングやPrivate Hosted Zoneを使った手順は不要になりました。今ではより直感的かつ簡単に実現できます。

詳細はAWSブログの記事をご覧ください [2]。

それでも従来の方法を知りたい方、あるいはAWSサービス向けのPrivate Hosted Zoneについて理解を深めたい方は、read on, Macduff(ええ、原文は「Lay on, Macduff」だと承知しています…)。

背景

AWSは、別リージョンのS3バケットを利用する場合(例えばus-west-2のEC2インスタンスからus-east-1のS3バケットにアクセスするケース)にいくつかの選択肢があると説明しています [3]。本記事で取り上げるのは「VPC interface endpoint (VPCE) with VPC peering」のオプションです。

ただしAWSが触れていないのは、バケットが存在しない側のリージョン(先ほどの例ではus-west-2)でS3への接続性を少し追加しないと、この方法は動作しないという点です。これについては実装手順のステップ6で詳しく説明します。

シナリオ

us-west-2で稼働しているEC2インスタンスから、us-east-1にあるS3バケットのデータにアクセスしたいとします。最初に思いつくのはVPCにS3 Gateway Endpointを作成することかもしれませんが、ここに落とし穴があります。S3 Gateway Endpointはクロスリージョンアクセスに対応していません。(S3 VPC Interface Endpointもデフォルトでは対応していませんが、こちらは問題解決に活用できます。)

この制限があるのは、AWSのVPCエンドポイントが同一リージョン内のサービスへのプライベート接続を提供する設計になっているためです。

ソリューションのアーキテクチャ

このソリューションでは、VPCピアリングでリージョン間にブリッジを構築し、DNS解決を活用してトラフィックを適切にルーティングします。構築する構成は以下のとおりです。

構成要素:

  • VPC A:EC2インスタンスが稼働している、us-west-2の既存VPC
  • VPC B:S3 Interface Endpointを配置する、us-east-1の新規または既存VPC
  • VPCピアリング接続:2つのVPCをつなぐブリッジ
  • Private Hosted Zone:S3エンドポイントを正しく解決するためのRoute53 DNS
  • S3 VPC Interface Endpoint:エンドポイントとは、対象VPC内のElastic Network Interface (ENI) であり、AWSバックボーンネットワーク経由でS3へのプライベートかつセキュアな接続を提供します(ここではus-east-1に配置)

実装ステップ

前提条件

始める前に、各VPCのCIDRブロックが重複していないことを確認してください。AWSではIPレンジが競合するVPC同士のピアリングは行えません。また、EC2インスタンスにはS3を操作する権限を付与した適切なインスタンスロールが割り当てられていることを前提とします。

ステップ1:S3エンドポイントを保護する

VPC Bにセキュリティグループ(ここではVPC_B_S3_SGと呼びます)を作成し、VPC AのCIDRレンジからポート443のHTTPSトラフィックのみを許可します。このセキュリティグループでS3 Interface Endpointを保護し、意図したトラフィックだけを通します。後から他のVPCやCIDRブロックからのアクセスを許可したくなったら、SGに追加するだけで対応できます。

ステップ2:S3 VPC Interface Endpointを作成する

VPC B(us-east-1)で、以下の設定でS3 VPC Interface Endpointを作成します [4]。

  • プライベートDNSは無効化する
  • 先ほど作成したVPC_B_S3_SGセキュリティグループをアタッチする

ステップ3:VPCピアリングを確立する

VPC AとVPC Bの間にVPCピアリング接続を作成します。これでリージョン間にトラフィックを流すためのネットワークブリッジが完成します [5]。

ステップ4:PHZでDNS解決を構成する

Route53で、ドメインs3.us-east-1.amazonaws.comのPrivate Hosted Zone (PHZ) を作成し、us-west-2のVPC Aに関連付けます。us-east-1とピアリングする予定の他のVPC(同一リージョンか別リージョンかを問わず)についても同様に関連付けることで、us-east-1のS3 VPC Interface Endpointへトラフィックを到達させられます。

us-west-2のVPC Aを新しいPHZに関連付ける

このPHZ内に、S3 VPC Interface EndpointのRegional DNS名*を指す2つのAliasレコード(Aレコード)を作成します。

1. ルートレコード:レコード名は空欄のままで、以下のレコードを作成します

s3.us-east-1.amazonaws.com

ルートレコード — レコード名は空欄に

2. ワイルドカードレコード:レコード名に*を指定して、以下に対応します

*.s3.us-east-1.amazonaws.com

キャッチオール — レコード名に「*」を入力

\* Regional DNS名とは、アベイラビリティゾーンの指定を含まない名前を指します。

形式は次のとおりです。

*.vpce-0123456789abcdefg-dawd972fe.s3.us-east-1.vpce.amazonaws.com であり、us-east-1a(こちらはZonal DNS名)ではありません。

Zonal DNS名は、アベイラビリティゾーン単位でworkloadsを分離するアーキテクチャで有用です。たとえば、トラフィックをInterface EndpointのENIと同じAZ・リージョン内に留めることで、リージョン間のデータ転送料金を抑えられます。ただしこのメリットは同一リージョン・同一AZ内のアクセスに限られ、クロスリージョンのシナリオには当てはまりません。

作成後のレコード:

新しいPHZに作成されたレコード

ステップ5:ルーティングを構成する

VPC間でトラフィックが流れるよう、ルートテーブルを更新します。

  • VPC A:EC2インスタンスが稼働しているサブネットのルートテーブルに、VPC BのCIDRブロック宛トラフィックをピアリング接続経由でルーティングするルールを追加
  • VPC B:VPC Interface Endpointを配置したサブネットのルートテーブルに、VPC AのCIDRブロック宛トラフィックを同じピアリング接続経由でルーティングするルールを追加

ステップ6:ローカルDNSからリージョン内S3へのアクセスを有効化する

ここが見落とされがちな重要なポイントです。VPC AのEC2インスタンスは、バケットがどのリージョンに属するかを判別するために、自身のリージョンのS3エンドポイント(s3.us-west-2.amazonaws.com)にアクセスできる必要があります。これがないと、us-east-1リージョンのバケットにアクセスするたびに「--region 」を指定しなければなりません。

実現方法は次のいずれかです。

  • インターネットアクセス用のInternet GatewayまたはNAT Gateway
  • VPC AにS3 Gateway Endpointを配置する(コスト面で推奨)
  • プライベートDNSを有効化したVPC AのS3 VPC Interface Endpoint

推奨は、S3アクセスが必要な各VPC/リージョンにS3 Gateway Endpointを配置する方法です。他の選択肢と異なり、時間料金もトラフィック処理料金もかからず無料で利用できます。

クロスリージョンS3アクセス向けのAWS SDK設定

VPCピアリング経由でリージョンをまたいでS3バケットにアクセスする際は、AWS SDKがクロスリージョンリクエストを正しく処理できるよう設定します。

オプション1:リージョンエンドポイントを指定する

対象バケットのリージョンに対応するエンドポイントURL(例:s3.us-east-1.amazonaws.com)を明示的に指定します。

JavaScript SDK V2の例:

const AWS = require('aws-sdk');

const s3 = new AWS.S3({
  endpoint: 's3.us-east-1.amazonaws.com'
});

オプション2:クロスリージョンアクセスを有効化する

  • Java SDK v2:S3クライアントビルダーでcrossRegionAccessEnabled(true)を指定 [9]
  • JavaScript SDK v3:S3クライアント設定でfollowRegionRedirects: trueを指定 [10]

JavaScript SDK v3の例:

const { S3Client } = require('@aws-sdk/client-s3');

const s3Client = new S3Client({
});

注意:Java SDK V2では、別リージョンのバケットへの初回リクエストはレイテンシーが増えることがありますが、2回目以降はキャッシュされたリージョン情報の恩恵を受けられます。

一方、JavaScript SDK V3はリージョン情報をキャッシュしないため、クロスリージョンリクエストのたびにリダイレクトによるレイテンシーが発生する可能性があります。クロスリージョンのアクセスパターンが事前に分かっている場合は、対象リージョンのエンドポイントURLを明示的に指定したほうがパフォーマンス面で有利です。

AWS CLIはこうしたリダイレクトを自動的に処理するため、上記ステップ6を実施していれば、バケットのリージョンやエンドポイントURLを指定する必要はありません。

全体の動作の流れ

EC2インスタンスがus-east-1のバケットへアクセスしようとすると、次のような流れで処理されます。

  1. インスタンスは自身のリージョンのS3サービスに問い合わせ、バケットの所在リージョンを判定する
  2. バケットがus-east-1にあると分かると、us-east-1側のIPをDNSに問い合わせる
  3. Private Hosted ZoneがこのDNSクエリを受け取り、VPC B内のS3 Interface EndpointのプライベートIPに解決する
  4. S3 Interface EndpointのプライベートIPがEC2に返される
  5. VPC AのEC2サブネットのルートテーブルに追加したルールにより、プライベートIP宛のトラフィックがVPCピアリング接続経由でVPC Bへ、そしてS3 VPC Interface Endpointへ転送される
  6. エンドポイントがus-east-1のS3バケットへセキュアでプライベートなアクセスを提供する

S3からの応答(例えばオブジェクトを要求した場合のレスポンス)は、VPCピアリング接続経由でVPC AのEC2インスタンスに返されます。

アーキテクチャの概念図

このアプローチが有効な理由

このソリューションは、AWSのリージョン制限を以下のかたちで巧みに回避します。

  • VPCピアリングを活用してリージョン間の接続を確立する
  • プライベートPHZによるDNS解決で、対象リージョンのS3エンドポイントのプライベートIPを取得する
  • インターネット経由ではなくVPCエンドポイントを利用することでセキュリティを確保する
  • クライアントアプリの変更は不要 — リージョンやエンドポイントURLを指定する必要もなく、バケット名だけでアクセスできる

留意すべきポイント

コストの考慮:VPCピアリングはデータ転送料金が発生し [6]、Interface Endpointは時間課金に加えてデータ処理料金がかかります [7]。アーキテクチャ判断の材料に含めましょう。

レイテンシーへの影響:クロスリージョンのトラフィックは、同一リージョン内アクセスよりレイテンシーが大きくなります。性能が重要な場合は、バケットレプリケーションの活用も検討してください [8]。

複雑さとのトレードオフ:この構成はアーキテクチャの複雑さを増します。得られるメリット(コストとVPC内セキュリティ)が、追加の運用負荷に見合うかを見極めましょう。

お問い合わせ

本記事が有益な気づきにつながれば幸いです。さらに詳しく知りたい方や、当社のサービスにご関心のある方は、お気軽にご連絡ください。お問い合わせはこちらからどうぞ。

参考文献

VPCピアリングとPHZを組み合わせたクロスリージョンS3アクセスは、AWS内外のさまざまな情報源で推奨されているアプローチです。ただし繰り返し見落とされがちなのが、バケットのないリージョン側にインターネット接続性かS3エンドポイント(できればGateway Endpoint)がない限り、毎回のリクエストでバケットのリージョンを明示しなければ動作しないという点です。上記ステップ6の方法を採用すれば、リージョンを指定せずにバケットへアクセスできます。

みなさんはAWS環境でクロスリージョンVPC接続を実装したことはありますか?体験談や、このアプローチの応用例があれば、ぜひお聞かせください。