Worker 内の R2 API は、R2 バケットを Worker にバインドして使います。書いた Worker は、ルート経由でバケットへの外部アクセスを公開したり、内部で R2 オブジェクトを操作したりできます。
R2 API には、S3 API との拡張や意味の違いがあります。S3 互換が必要な場合は、S3 互換 API の利用を検討してください。
R2 は、保存するデータ(オブジェクト)を、バケットというコンテナにまとめます。バケットは、R2 におけるパフォーマンス、スケーリング、アクセスの基本単位です。
R2 バケットを Worker にバインドするには、Wrangler ファイルに次を追加します。binding プロパティは有効な JavaScript の変数識別子に、bucket_name は R2 バケット名に更新します。
{
"r2_buckets": [
{
"binding": "MY_BUCKET", // <~ valid JavaScript variable name
"bucket_name": "<YOUR_BUCKET_NAME>"
}
]
}[[r2_buckets]]
binding = "MY_BUCKET"
bucket_name = "<YOUR_BUCKET_NAME>"Worker 内では、バケットのバインディングが MY_BUCKET 変数として使えます。以降は、次に説明する バケットのメソッド で操作できます。
コードに注入されるバケットバインディングオブジェクトで、次のメソッドが使えます。
たとえば、上記のバインディングでオブジェクトの PUT リクエストを発行するには、次のようにします。
export default {
async fetch(request, env) {
const url = new URL(request.url);
const key = url.pathname.slice(1);
switch (request.method) {
case "PUT":
await env.MY_BUCKET.put(key, request.body);
return new Response(`Put ${key} successfully!`);
default:
return new Response(`${request.method} is not allowed.`, {
status: 405,
headers: {
Allow: "PUT",
},
});
}
},
};from workers import WorkerEntrypoint, Response
from urllib.parse import urlparse
class Default(WorkerEntrypoint):
async def fetch(self, request):
url = urlparse(request.url)
key = url.path[1:]
if request.method == "PUT":
await self.env.MY_BUCKET.put(key, request.body)
return Response(f"Put {key} successfully!")
else:
return Response(
f"{request.method} is not allowed.",
status=405,
headers={"Allow": "PUT"}
)-
head(key: string): Promise<R2Object | null>- 指定したキーのメタデータだけを含む
R2Objectを取得します。キーが存在すればそのオブジェクト、存在しなければnullです。
- 指定したキーのメタデータだけを含む
-
get(key: string, options?: R2GetOptions): Promise<R2ObjectBody | R2Object | null>- 指定したキーのオブジェクトメタデータと、オブジェクト本体を
ReadableStreamとして含むR2ObjectBodyを取得します。キーが存在すればそのオブジェクト、存在しなければnullです。 optionsで指定した前提条件が満たされない場合、get()はbodyが未定義のR2Objectを返します。
- 指定したキーのオブジェクトメタデータと、オブジェクト本体を
-
put(key: string, value: ReadableStream | ArrayBuffer | ArrayBufferView | string | null | Blob, options?: R2PutOptions): Promise<R2Object | null>- 指定した
valueとメタデータを、関連するkeyの下に保存します。書き込みが成功すると、保存した Object のメタデータを含むR2Objectを返します。 optionsで指定した前提条件が満たされない場合、put()はnullを返し、オブジェクトは保存されません。- R2 の書き込みは強い一貫性があります。Promise が解決したあと、以降のすべての読み取り操作は、このキーと値のペアをグローバルに参照できます。
- 指定した
-
delete(key: string | string[]): Promise<void>- 関連する
keysの下にある指定のvaluesとメタデータを削除します。削除が成功するとvoidを返します。 - R2 の削除は強い一貫性があります。Promise が解決したあと、以降のすべての読み取り操作は、指定したキーと値のペアをグローバルに参照しなくなります。
- 1 回の呼び出しで最大 1000 個のキーを削除できます。
- 関連する
-
list(options?: R2ListOptions): Promise<R2Objects>- バケット内の
R2Objectの一覧を含むR2Objectsを返します。 - 返されるオブジェクトの一覧は辞書順です。
- 最大 1000 件を返します。Worker 内のメモリ負荷を抑えるため、それより少ない件数になることがあります。
- 一覧するオブジェクト数を明示するには、
limitプロパティを設定した R2ListOptions オブジェクトを渡します。
- バケット内の
-
createMultipartUpload(key: string, options?: R2MultipartOptions): Promise<R2MultipartUpload>- マルチパートアップロードを作成します。
- 新しく作成したマルチパートアップロードを表す
R2MultipartUploadオブジェクトに解決する Promise を返します。作成後は、Workers API または S3 API 経由で、すぐにグローバルに操作できます。
-
resumeMultipartUpload(key: string, uploadId: string): R2MultipartUpload- 指定したキーと uploadId のマルチパートアップロードを表すオブジェクトを返します。
- resumeMultipartUpload 操作は、uploadId の妥当性や、対応するアクティブなマルチパートアップロードの存在を検証しません。これは、
R2MultipartUploadオブジェクトに対する後続操作をすぐ呼べるように、レイテンシを抑えるためです。
R2Object は、R2 バケットにオブジェクトを PUT したときに作成されます。R2Object は、アップローダーが提供した情報に基づくオブジェクトのメタデータを表します。R2 バケットに PUT したすべてのオブジェクトに、R2Object が作成されます。
-
keystring- オブジェクトのキーです。
-
versionstring- キーの特定のアップロードに紐づく、ランダムな一意の文字列です。
-
sizenumber- オブジェクトのサイズ(バイト)です。
-
etagstring
-
オブジェクトのアップロードに紐づく etag です。
-
httpEtagstring- ヘッダーとして返すために引用符で囲んだ、オブジェクトの etag です。
-
uploadedDate- オブジェクトがアップロードされた時刻を表す Date オブジェクトです。
-
httpMetadataR2HTTPMetadata- オブジェクトに紐づく各種 HTTP ヘッダーです。HTTP Metadata を参照してください。
-
customMetadataRecord<string, string>- オブジェクトに紐づく、ユーザー定義のカスタムメタデータのマップです。
-
rangeR2Range任意- 返されたオブジェクトの範囲を含む
R2Rangeオブジェクトです。
- 返されたオブジェクトの範囲を含む
-
checksumsR2Checksums- オブジェクトに保存されているチェックサムを含む
R2Checksumsオブジェクトです。checksums を参照してください。
- オブジェクトに保存されているチェックサムを含む
-
writeHttpMetadata(headers: Headers): voidR2ObjectからhttpMetadataを取り出し、対応する HTTP ヘッダーを入力のHeadersオブジェクトに適用します。HTTP Metadata を参照してください。
-
storageClass'Standard' | 'InfrequentAccess'- オブジェクトに紐づくストレージクラスです。Storage Classes を参照してください。
-
ssecKeyMd5string任意- 暗号化に使った SSE-C キーの、16 進数エンコードした MD5 ハッシュです(キーを指定した場合)。ハッシュは、オブジェクトの復号に必要なキーの識別に使えます。
R2ObjectBody は、オブジェクトのメタデータと本体を合わせたものです。R2 バケットからオブジェクトを GET したときに返されます。R2ObjectBody のキーの完全な一覧は、次の一覧に加え、R2Object から継承するすべてのキーです。
-
bodyReadableStream- オブジェクトの値です。
-
bodyUsedboolean- オブジェクトの値が消費済みかどうかです。
-
arrayBuffer(): Promise<ArrayBuffer>- オブジェクトの値を含む
ArrayBufferに解決する Promise を返します。
- オブジェクトの値を含む
-
text(): Promise<string>- オブジェクトの値を含む文字列に解決する Promise を返します。
-
json<T>() : Promise<T>- オブジェクトの値を含む指定のオブジェクトに解決する Promise を返します。
-
blob(): Promise<Blob>- オブジェクトの値を含むバイナリの Blob に解決する Promise を返します。
R2MultipartUpload オブジェクトは、createMultipartUpload または resumeMultipartUpload を呼び出したときに作成されます。R2MultipartUpload は、進行中のマルチパートアップロードを表します。
未完了のマルチパートアップロードは、7 日後に自動で中止されます。
-
keystring- マルチパートアップロードの
keyです。
- マルチパートアップロードの
-
uploadIdstring- マルチパートアップロードの
uploadIdです。
- マルチパートアップロードの
-
uploadPart(partNumber: number, value: ReadableStream | ArrayBuffer | ArrayBufferView | string | Blob, options?: R2MultipartOptions): Promise<R2UploadedPart>- 指定したパート番号で、このマルチパートアップロードに 1 つのパートをアップロードします。各パートのサイズは揃える必要があります。最後のパートだけ、小さくできます。
etagとpartNumberを含むR2UploadedPartオブジェクトを返します。これらのR2UploadedPartオブジェクトは、マルチパートアップロードを完了するときに必要です。
-
abort(): Promise<void>- マルチパートアップロードを中止します。アップロードの中止が成功したときに解決する Promise を返します。
-
complete(uploadedParts: R2UploadedPart[]): Promise<R2Object>- 指定したパートでマルチパートアップロードを完了します。
- 完了操作が終わったときに解決する Promise を返します。完了後、オブジェクトは以降の読み取り操作からすぐにグローバルにアクセスできます。
-
onlyIfR2Conditional | HeadersR2Conditionalまたは条件付き Headers の特定条件を満たす場合にだけ、オブジェクトを返すように指定します。条件付き操作 を参照してください。
-
rangeR2Range | Headers任意R2Rangeまたは range のHeadersで指定した範囲に従い、オブジェクトの特定の長さ(任意のオフセットから)または末尾のバイトだけを返すように指定します。範囲読み取り を参照してください。
-
ssecKeyArrayBuffer | string- SSE-C に使うキーを指定します。キーは 32 バイトで、16 進数エンコードした文字列または ArrayBuffer の形式である必要があります。
R2GetOptions は range パラメーターを受け取り、body で返すデータを制限できます。
範囲で使える引数のバリエーションは次の 3 つです。
-
オフセットと、任意の長さ。
-
任意のオフセットと、長さ。
-
サフィックス。
-
offsetnumber- データの返却を開始するバイト位置です(この位置を含みます)。
-
lengthnumber- 返すバイト数です。オブジェクトに存在するバイト数より多く要求した場合、この数より少ないバイト数が返ることがあります。
-
suffixnumber- ファイル末尾(最後のバイト)から返すバイト数です。オブジェクトに存在するバイト数より多く要求した場合、この数より少ないバイト数が返ることがあります。
-
onlyIfR2Conditional | HeadersR2Conditionalの特定条件を満たす場合にだけ、オブジェクトを保存するように指定します。条件付き操作 を参照してください。
-
httpMetadataR2HTTPMetadata | Headers任意- オブジェクトに紐づく各種 HTTP ヘッダーです。HTTP Metadata を参照してください。
-
customMetadataRecord<string, string>任意- オブジェクトと一緒に保存する、ユーザー定義のカスタムメタデータのマップです。
-
md5ArrayBuffer | string任意- 受信したオブジェクトの整合性を確認するための md5 ハッシュです。
-
sha1ArrayBuffer | string任意- 受信したオブジェクトの整合性を確認するための SHA-1 ハッシュです。
-
sha256ArrayBuffer | string任意- 受信したオブジェクトの整合性を確認するための SHA-256 ハッシュです。
-
sha384ArrayBuffer | string任意- 受信したオブジェクトの整合性を確認するための SHA-384 ハッシュです。
-
sha512ArrayBuffer | string任意- 受信したオブジェクトの整合性を確認するための SHA-512 ハッシュです。
-
storageClass'Standard' | 'InfrequentAccess'- 指定した場合、オブジェクトのストレージクラスを設定します。指定しない場合、バケットに紐づくデフォルトのストレージクラスに保存されます。Storage Classes を参照してください。
-
ssecKeyArrayBuffer | string- SSE-C に使うキーを指定します。キーは 32 バイトで、16 進数エンコードした文字列または ArrayBuffer の形式である必要があります。
-
httpMetadataR2HTTPMetadata | Headers任意- オブジェクトに紐づく各種 HTTP ヘッダーです。HTTP Metadata を参照してください。
-
customMetadataRecord<string, string>任意- オブジェクトと一緒に保存する、ユーザー定義のカスタムメタデータのマップです。
-
storageClassstring- 指定した場合、オブジェクトのストレージクラスを設定します。指定しない場合、バケットに紐づくデフォルトのストレージクラスに保存されます。Storage Classes を参照してください。
-
ssecKeyArrayBuffer | string- SSE-C に使うキーを指定します。キーは 32 バイトで、16 進数エンコードした文字列または ArrayBuffer の形式である必要があります。
-
limitnumber任意-
返す結果の件数です。デフォルトは
1000、最大は1000です。 -
includeを設定した場合、メタデータを収めるために、レスポンスの件数がlimitより少なくなることがあります。
-
-
prefixstring任意- キーと照合するプレフィックスです。指定したプレフィックスで始まるキーだけが返されます。
-
cursorstring任意- オブジェクトの一覧をどこから続けるかを示す不透明なトークンです。cursor は、以前の list 操作から取得できます。
-
delimiterstring任意- キーをグループ化するときに使う文字です。
-
includeArray<string>任意-
httpMetadataやcustomMetadataを含められます。含めた場合、list が返す項目に指定したメタデータが入ります。 -
1 回の
list操作が返せるデータ量には上限があります。データを要求すると、メタデータを収めるために、レスポンスの件数がlimitより少なくなることがあります。 -
Wrangler ファイルの compatibility date を
2022-08-04以降にする必要があります。そうでない場合は、r2_list_honor_include互換性フラグを設定します。設定しないと、実際のincludeオプションに関係なく、include: ['httpMetadata', 'customMetadata']として扱われます。
そのため、返されたオブジェクト数を
limitと比較しないように注意してください。代わりに、truncatedプロパティでlistリクエストに続きがあるかを判断します。 -
const options = {
limit: 500,
include: ["customMetadata"],
};
const listed = await env.MY_BUCKET.list(options);
let truncated = listed.truncated;
let cursor = truncated ? listed.cursor : undefined;
// ❌ - if your limit can't fit into a single response or your
// bucket has less objects than the limit, it will get stuck here.
while (listed.objects.length < options.limit) {
// ...
}
// ✅ - use the truncated property to check if there are more
// objects to be returned
while (truncated) {
const next = await env.MY_BUCKET.list({
...options,
cursor: cursor,
});
listed.objects.push(...next.objects);
truncated = next.truncated;
cursor = next.cursor;
}limit = 500
include = ["customMetadata"]
listed = await self.env.MY_BUCKET.list(limit=limit, include=include)
truncated = listed.truncated
cursor = listed.cursor if truncated else None
# ❌ - if your limit can't fit into a single response or your
# bucket has less objects than the limit, it will get stuck here.
while len(listed.objects) < limit:
...
# ✅ - use the truncated property to check if there are more
# objects to be returned
while truncated:
next_page = await self.env.MY_BUCKET.list(limit=limit, include=include, cursor=cursor)
listed.objects.extend(next_page.objects)
truncated = next_page.truncated
cursor = next_page.cursorBUCKET_BINDING.list() が返す、R2Object 配列を含むオブジェクトです。
-
objectsArray<R2Object>listリクエストに一致するオブジェクトの配列です。
-
truncatedboolean- true の場合、現在の
listリクエストに取得できる結果がまだあることを示します。
- true の場合、現在の
-
cursorstring任意- その地点から一覧を再開するために、以降の
list呼び出しへ渡せるトークンです。truncated が true の場合にだけ存在します。
- その地点から一覧を再開するために、以降の
-
delimitedPrefixesArray<string>-
delimiter を指定した場合、指定したプレフィックスから次の delimiter 出現までのすべてのプレフィックスを含みます。
-
たとえば、プレフィックスを指定せず delimiter が '/' のとき、
foo/bar/bazは区切りプレフィックスとしてfooを返します。同じ構造と delimiter でプレフィックスにfoo/を渡すと、区切りプレフィックスとしてfoo/barが返されます。
-
R2GetOptions と R2PutOptions に R2Conditional オブジェクトを渡せます。get() の条件チェックが失敗すると、本体は返されません。これにより get() のレイテンシが下がります。
put() の条件チェックが失敗すると、R2Object の代わりに null が返されます。
-
etagMatchesstring任意- オブジェクトの etag が指定した文字列と一致する場合に、操作を実行します。
-
etagDoesNotMatchstring任意- オブジェクトの etag が指定した文字列と一致しない場合に、操作を実行します。
-
uploadedBeforeDate任意- オブジェクトが指定した日付より前にアップロードされている場合に、操作を実行します。
-
uploadedAfterDate任意- オブジェクトが指定した日付より後にアップロードされている場合に、操作を実行します。
代わりに、条件付きヘッダーを含む Headers オブジェクトを R2GetOptions と R2PutOptions に渡せます。これらの条件付きヘッダーについては、条件付きリクエストに関する MDN のドキュメント ↗ を参照してください。If-Range 以外の条件付きヘッダーに対応しています。
条件付きリクエストの詳細は、RFC 7232 ↗ を参照してください。
一般に、これらのフィールドはオブジェクト作成時に渡された HTTP メタデータと一致します。GET リクエスト時に上書きでき、その場合は指定した値がレスポンスにそのまま返されます。
-
contentTypestring任意 -
contentLanguagestring任意 -
contentDispositionstring任意 -
contentEncodingstring任意 -
cacheControlstring任意 -
cacheExpiryDate任意
put() バインディングでチェックサムを指定した場合、返されるオブジェクトの checksums プロパティで利用できます。マルチパートでないオブジェクトでは、MD5 チェックサムがデフォルトで含まれます。
-
md5ArrayBuffer任意- オブジェクトの MD5 チェックサムです。
-
sha1ArrayBuffer任意- オブジェクトの SHA-1 チェックサムです。
-
sha256ArrayBuffer任意- オブジェクトの SHA-256 チェックサムです。
-
sha384ArrayBuffer任意- オブジェクトの SHA-384 チェックサムです。
-
sha512ArrayBuffer任意- オブジェクトの SHA-512 チェックサムです。
R2UploadedPart オブジェクトは、アップロード済みのパートを表します。R2UploadedPart オブジェクトは uploadPart 操作から返され、completeMultipartUpload 操作に渡す必要があります。
-
partNumbernumber- パートの番号です。
-
etagstring- パートの
etagです。
- パートの
R2Object が保存されるストレージクラスです。利用できるストレージクラスは Standard と InfrequentAccess です。詳細は Storage classes を参照してください。