この例では、パブリックインターネットに公開されていないプライベートな S3 バケットへアクセスする方法を示します。内部の S3 互換ストレージ向けに Workers VPC Service を設定し、そのバケットへリクエストする Worker を作成してデプロイし、変更を確認します。
- VPC / 仮想ネットワーク上で稼働するプライベートな S3 互換ストレージ(AWS S3 VPC エンドポイント、MinIO など)
- S3 VPC エンドポイントと同じ VPC 上で稼働する仮想マシン / EC2 インスタンス
- Workers VPC にアクセスできる Workers アカウント
Cloudflare Tunnel は、プライベートネットワークから Cloudflare への安全な接続を作ります。このトンネルにより、Workers からプライベートリソースへ安全にアクセスできます。
-
Workers VPC ダッシュボード ↗ を開き、Tunnels タブを選択します。
-
Create を選択し、新しいトンネルを作成します。
-
トンネル名(例:
s3-tunnel)を入力し、Save tunnel を選択します。 -
OS とアーキテクチャを選びます。ダッシュボードに、環境向けのインストール手順が表示されます。
-
表示されたコマンドに従い、VM に
cloudflaredをダウンロードしてインストールし、固有のトークン付きでサービスインストールコマンドを実行します。
トンネルが接続されると、ダッシュボードに確認が表示されます。次の手順で使うため、トンネル ID を控えます。
まず、内部の S3 ストレージ向けに Workers VPC Service を作成します。
npx wrangler vpc service create s3-storage \
--type http \
--tunnel-id <YOUR_TUNNEL_ID> \
--hostname s3.us-west-2.amazonaws.comIP アドレスを使って Workers VPC Service を作成することもできます(MinIO を使う場合など)。
npx wrangler vpc service create s3-storage \
--type http \
--tunnel-id <YOUR_TUNNEL_ID> \
--ipv4 10.0.1.60 \
--http-port 9000次の手順で使うため、返されたサービス ID を控えます。
VPC エンドポイントからの匿名アクセスを許可するよう、S3 バケットを設定します。暗号化されていない S3 オブジェクトで使えます。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowAnonymousAccessFromVPCE",
"Effect": "Allow",
"Principal": "*",
"Action": ["s3:GetObject", "s3:ListBucket"],
"Resource": [
"arn:aws:s3:::your-bucket-name",
"arn:aws:s3:::your-bucket-name/*"
],
"Condition": {
"StringEquals": {
"aws:sourceVpce": "vpce-your-endpoint-id"
}
}
}
]
}Cloudflare Tunnel を動かしている VM から S3 へ直接アクセスし、バケットポリシーが正しく動いているかを確認できます。これらのコマンドは、AWS 認証情報なしで成功する必要があります。
# Test listing bucket contents
curl -i https://s3.us-west-2.amazonaws.com/your-bucket-name/
# Test downloading a specific file
curl -i https://your-bucket-name.s3.us-west-2.amazonaws.com/test-file.txtWrangler 設定ファイルを更新します。
{
"$schema": "./node_modules/wrangler/config-schema.json",
"name": "private-s3-gateway",
"main": "src/index.js",
// Set this to today's date
"compatibility_date": "2026-09-20",
"vpc_services": [
{
"binding": "S3_STORAGE",
"service_id": "<YOUR_SERVICE_ID>"
}
]
}"$schema" = "./node_modules/wrangler/config-schema.json"
name = "private-s3-gateway"
main = "src/index.js"
# Set this to today's date
compatibility_date = "2026-09-20"
[[vpc_services]]
binding = "S3_STORAGE"
service_id = "<YOUR_SERVICE_ID>"Workers のコードで、Workers VPC Service のバインディングを使い、サービスへリクエストを送ります。
export default {
async fetch(request, env, ctx) {
try {
// Fetch a file from the private S3 bucket via VPC endpoint
const response = await env.S3_STORAGE.fetch("https://s3.us-west-2.amazonaws.com/my-bucket/data.json");
// Use the response from S3 to perform more logic in Workers, before returning the final response
return response;
} catch (error) {
return new Response("Storage unavailable", { status: 503 });
}
},
};このガイドでは、Workers からプライベートなオブジェクトストレージへアクセスする方法を示しています。Workers VPC Services でファイルを直接取得し、レスポンスを加工すれば、Workers 上でより本格的なフルスタックおよびバックエンド機能を構築できます。
作成した Worker をデプロイしてテストできます。
npx wrangler deploy# Test GET request
curl https://private-s3-gateway.workers.dev