1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

AWS SDKのS3クライアントをCloudflare R2へ移行する最小構成 — 互換性・Sippy・料金の注意点

1
Last updated at Posted at 2026-05-17

検証日: 2026-08-17

結論

AWS SDK for JavaScript v3やboto3を使っている場合、S3クライアントの接続先、リージョン、認証情報をR2用に変更すると、PutObjectGetObject などの対応APIを再利用できます。

ただし、Cloudflare R2は「S3 API互換」であって、S3の全機能を実装しているわけではありません。移行前に、利用中のAPIがR2でサポートされているかを確認してください。

変更する値

  1. エンドポイントを https://<ACCOUNT_ID>.r2.cloudflarestorage.com にする
  2. リージョンを auto にする
  3. Access Key ID / Secret Access KeyをR2用にする

AWS SDK for JavaScript v3

S3側のクライアントは次のような構成です。

import { S3Client } from "@aws-sdk/client-s3";

const s3 = new S3Client({
  region: "ap-northeast-1",
  credentials: {
    accessKeyId: process.env.AWS_ACCESS_KEY_ID!,
    secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!,
  },
});

R2では次のように変更します。

import { S3Client } from "@aws-sdk/client-s3";

const r2 = new S3Client({
  region: "auto",
  endpoint: `https://${process.env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com`,
  credentials: {
    accessKeyId: process.env.R2_ACCESS_KEY_ID!,
    secretAccessKey: process.env.R2_SECRET_ACCESS_KEY!,
  },
});

対応APIだけを使っていれば、操作コードは同じ形で利用できます。

import { PutObjectCommand } from "@aws-sdk/client-s3";

await r2.send(new PutObjectCommand({
  Bucket: "my-bucket",
  Key: "hello.txt",
  Body: "hello",
  ContentType: "text/plain",
}));

Python / boto3

import boto3

r2 = boto3.client(
    "s3",
    endpoint_url=f"https://{ACCOUNT_ID}.r2.cloudflarestorage.com",
    aws_access_key_id=R2_ACCESS_KEY_ID,
    aws_secret_access_key=R2_SECRET_ACCESS_KEY,
    region_name="auto",
)

r2.put_object(
    Bucket="my-bucket",
    Key="hello.txt",
    Body=b"hello",
    ContentType="text/plain",
)

一括移行を避けたい場合はSippyを検討する

Sippyを有効にすると、R2に存在しないオブジェクトが要求された時点で、移行元のS3またはGCSから取得し、R2へコピーできます。

段階移行に向いていますが、次の点に注意が必要です。

  • 移行元ストレージ側の通常のデータ転送料が発生する場合がある
  • R2側のストレージと操作料金は発生する
  • 移行後にETagが変わる場合がある
  • 移行元の認証情報は読み取り専用を推奨

「Sippy自体が無料」と「移行全体の費用がゼロ」は別です。

料金は固定比較表より計算式で見る

2026年8月時点で、R2 Standard Storageの主な単価は次のとおりです。

項目 単価
ストレージ $0.015 / GB-month
Class A操作 $4.50 / 100万回
Class B操作 $0.36 / 100万回
Internet egress $0

例えば、Standard Storageを1,000GB保管する場合、無料枠や操作料金を除いたストレージ料金は概算で月$15です。

1,000 GB × $0.015 = $15 / month

実際の総額は、保存量、書き込み回数、読み取り回数、無料枠、移行元からの転送料で変わります。AWS S3との比較も、リージョン、転送先、CloudFrontの利用、料金階層によって変わるため、固定額ではなく各社の公式料金表で同じ条件を入れて比較するのが安全です。

移行前チェックリスト

  • 利用中のS3 APIがR2でサポートされているか
  • CORSをR2側へ設定したか
  • バケット名とオブジェクトキーの扱いが同じか
  • 署名付きURLの有効期限と動作を確認したか
  • Content-Type、Cache-Controlなどのメタデータを確認したか
  • 公開配信にCustom DomainまたはWorkersを使うか
  • 移行元のデータ転送料を見積もったか
  • 切り戻し手順を用意したか

自社サービスで使って分かったこと

自社サービスでも画像・ファイル保存にR2を利用しています。小規模サービスでは無料枠内に収まることもありますが、「常にほぼ$0」とは限りません。保存量だけでなく、操作回数と移行時の転送料まで見て判断するのが重要です。

公式ドキュメント


この記事は株式会社Root on Tech Blogによる、自社実装をもとにした技術検証です。

生成AI・DX、PoC、PM・PMO、Web・システム実装の相談は、Root on公式サイトをご覧ください。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?