クロスリージョンの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のバケットへアクセスしようとすると、次のような流れで処理されます。
- インスタンスは自身のリージョンのS3サービスに問い合わせ、バケットの所在リージョンを判定する
- バケットが
us-east-1にあると分かると、us-east-1側のIPをDNSに問い合わせる - Private Hosted ZoneがこのDNSクエリを受け取り、VPC B内のS3 Interface EndpointのプライベートIPに解決する
- S3 Interface EndpointのプライベートIPがEC2に返される
- VPC AのEC2サブネットのルートテーブルに追加したルールにより、プライベートIP宛のトラフィックがVPCピアリング接続経由でVPC Bへ、そしてS3 VPC Interface Endpointへ転送される
- エンドポイントが
us-east-1のS3バケットへセキュアでプライベートなアクセスを提供する
S3からの応答(例えばオブジェクトを要求した場合のレスポンス)は、VPCピアリング接続経由でVPC AのEC2インスタンスに返されます。

アーキテクチャの概念図
このアプローチが有効な理由
このソリューションは、AWSのリージョン制限を以下のかたちで巧みに回避します。
- VPCピアリングを活用してリージョン間の接続を確立する
- プライベートPHZによるDNS解決で、対象リージョンのS3エンドポイントのプライベートIPを取得する
- インターネット経由ではなくVPCエンドポイントを利用することでセキュリティを確保する
- クライアントアプリの変更は不要 — リージョンやエンドポイントURLを指定する必要もなく、バケット名だけでアクセスできる
留意すべきポイント
コストの考慮:VPCピアリングはデータ転送料金が発生し [6]、Interface Endpointは時間課金に加えてデータ処理料金がかかります [7]。アーキテクチャ判断の材料に含めましょう。
レイテンシーへの影響:クロスリージョンのトラフィックは、同一リージョン内アクセスよりレイテンシーが大きくなります。性能が重要な場合は、バケットレプリケーションの活用も検討してください [8]。
複雑さとのトレードオフ:この構成はアーキテクチャの複雑さを増します。得られるメリット(コストとVPC内セキュリティ)が、追加の運用負荷に見合うかを見極めましょう。
お問い合わせ
本記事が有益な気づきにつながれば幸いです。さらに詳しく知りたい方や、当社のサービスにご関心のある方は、お気軽にご連絡ください。お問い合わせはこちらからどうぞ。
参考文献
- https://aws.amazon.com/about-aws/whats-new/2025/11/aws-privatelink-cross-region-connectivity-aws-services/
- https://aws.amazon.com/blogs/networking-and-content-delivery/aws-privatelink-extends-cross-region-connectivity-to-aws-services/
- https://repost.aws/articles/ARjzluyMS8RbeOOK4MGXRG6Q/cost-effective-methods-for-accessing-s3-buckets-cross-region
- https://docs.aws.amazon.com/vpc/latest/privatelink/create-interface-endpoint.html#create-interface-endpoint-aws
- https://docs.aws.amazon.com/vpc/latest/peering/create-vpc-peering-connection.html
- https://aws.amazon.com/vpc/pricing/
- https://aws.amazon.com/privatelink/pricing/
- https://docs.aws.amazon.com/AmazonS3/latest/userguide/replication.html
- https://docs.aws.amazon.com/sdk-for-java/latest/developer-guide/s3-cross-region.html
- https://docs.aws.amazon.com/AWSJavaScriptSDK/v3/latest/Package/-aws-sdk-middleware-sdk-s3/Interface/S3InputConfig/
- What is VPC Peering
- Gateway endpoints for Amazon S3
- Working with Private Hosted Zones
VPCピアリングとPHZを組み合わせたクロスリージョンS3アクセスは、AWS内外のさまざまな情報源で推奨されているアプローチです。ただし繰り返し見落とされがちなのが、バケットのないリージョン側にインターネット接続性かS3エンドポイント(できればGateway Endpoint)がない限り、毎回のリクエストでバケットのリージョンを明示しなければ動作しないという点です。上記ステップ6の方法を採用すれば、リージョンを指定せずにバケットへアクセスできます。
みなさんはAWS環境でクロスリージョンVPC接続を実装したことはありますか?体験談や、このアプローチの応用例があれば、ぜひお聞かせください。