オブジェクトライフサイクルは、バケットにアップロードしたオブジェクトの保持期間を決めます。Standard ストレージから Infrequent Access ストレージへ移行するタイミングも指定できます。
ライフサイクル設定は、オブジェクトの存続期間中に適用する操作を定義するライフサイクルルールの集まりです。
たとえば、90 日後にオブジェクトを削除するルールや、30 日後に Infrequent Access ストレージへ移行するルールを作成できます。
- オブジェクトは、通常
x-amz-expirationの値から 24 時間以内にバケットから削除されます。 - オブジェクトを削除するライフサイクル設定を適用すると、新規アップロードの
x-amz-expirationはすぐ新しいルールに基づく期限を反映します。既存オブジェクトには遅れが出ることがあります。ほとんどのオブジェクトは 24 時間以内に移行しますが、バケット内のオブジェクト数によってはさらに時間がかかることがあります。移行中は、以前の設定のルールが残って見えることがあります。 - 削除されたオブジェクトは、課金対象ではなくなります。
- バケットには、開始から 7 日後にマルチパートアップロードを期限切れにするデフォルトのライフサイクルルールがあります。
- オブジェクトを Standard ストレージから Infrequent Access ストレージへ移行すると、Class A 操作 が発生します。
- ルールが衝突し、24 時間以内にストレージクラスの移行と期限切れ(削除)の両方を指定している場合は、期限切れ(または削除)のライフサイクル移行がストレージクラスの移行より優先されます。
オブジェクトライフサイクルルールを作成するとき、適用するプレフィックスを指定できます。
- オブジェクトライフサイクルのルール数は、現在最大 1,000 件です。
- オブジェクトライフサイクルの管理はバケット単位の操作です。
Workers R2 Storage Write権限グループを持つ API トークンが必要です。
-
Cloudflare ダッシュボードで、R2 オブジェクトストレージ のページを開きます。
Overview を開く ↗ -
一覧から対象のバケットを探して選択します。
-
バケットのページで 設定 を選択します。
-
オブジェクトライフサイクルルール で ルールを追加 を選択します。
-
新しいルールの項目を入力します。
-
完了したら 変更を保存 を選択します。
npm↗ をインストールします。- Wrangler(Developer Platform CLI) をインストールします。
wrangler loginコマンド で Wrangler にログインします。r2 bucket lifecycle addコマンド を実行し、バケットにライフサイクルルールを追加します。
npx wrangler r2 bucket lifecycle add <BUCKET_NAME> [OPTIONS]または、r2 bucket lifecycle set コマンド で、JSON ファイルからバケットのライフサイクル設定全体を設定できます。
npx wrangler r2 bucket lifecycle set <BUCKET_NAME> --file <FILE_PATH>JSON ファイルは、put object lifecycle configuration API のリクエスト本文と同じ形式にしてください。
用途ごとにルールを分けたライフサイクル設定(ライフサイクルルールの集まり)の設定例です。
const client = new S3({
endpoint: "https://<account_id>.r2.cloudflarestorage.com",
credentials: {
accessKeyId: "<access_key_id>",
secretAccessKey: "<access_key_secret>",
},
region: "auto",
});await client
.putBucketLifecycleConfiguration({
Bucket: "testBucket",
LifecycleConfiguration: {
Rules: [
// Example: deleting objects on a specific date
// Delete 2019 documents in 2024
{
ID: "Delete 2019 Documents",
Status: "Enabled",
Filter: {
Prefix: "2019/",
},
Expiration: {
Date: new Date("2024-01-01"),
},
},
// Example: transitioning objects to Infrequent Access storage by age
// Transition objects older than 30 days to Infrequent Access storage
{
ID: "Transition Objects To Infrequent Access",
Status: "Enabled",
Transitions: [
{
Days: 30,
StorageClass: "STANDARD_IA",
},
],
},
// Example: deleting objects by age
// Delete logs older than 90 days
{
ID: "Delete Old Logs",
Status: "Enabled",
Filter: {
Prefix: "logs/",
},
Expiration: {
Days: 90,
},
},
// Example: abort all incomplete multipart uploads after a week
{
ID: "Abort Incomplete Multipart Uploads",
Status: "Enabled",
AbortIncompleteMultipartUpload: {
DaysAfterInitiation: 7,
},
},
// Example: abort user multipart uploads after a day
{
ID: "Abort User Incomplete Multipart Uploads",
Status: "Enabled",
Filter: {
Prefix: "useruploads/",
},
AbortIncompleteMultipartUpload: {
// For uploads matching the prefix, this rule will take precedence
// over the one above due to its earlier expiration.
DaysAfterInitiation: 1,
},
},
],
},
})
.promise();バケットに紐づくライフサイクルルールの一覧を取得するには、r2 bucket lifecycle list コマンド を実行します。
npx wrangler r2 bucket lifecycle list <BUCKET_NAME>import S3 from "aws-sdk/clients/s3.js";
// Configure the S3 client to talk to R2.
const client = new S3({
endpoint: "https://<account_id>.r2.cloudflarestorage.com",
credentials: {
accessKeyId: "<access_key_id>",
secretAccessKey: "<access_key_secret>",
},
region: "auto",
});
// Get lifecycle configuration for bucket
console.log(
await client
.getBucketLifecycleConfiguration({
Bucket: "bucketName",
})
.promise(),
);-
Cloudflare ダッシュボードで、R2 オブジェクトストレージ のページを開きます。
Overview を開く ↗ -
一覧から対象のバケットを探して選択します。
-
バケットのページで 設定 を選択します。
-
オブジェクトライフサイクルルール で、削除するルールを選択します。
-
完了したら ルールを削除 を選択します。
バケットから特定のライフサイクルルールを削除するには、r2 bucket lifecycle remove コマンド を実行します。
npx wrangler r2 bucket lifecycle remove <BUCKET_NAME> --id <RULE_ID>import S3 from "aws-sdk/clients/s3.js";
// Configure the S3 client to talk to R2.
const client = new S3({
endpoint: "https://<account_id>.r2.cloudflarestorage.com",
credentials: {
accessKeyId: "<access_key_id>",
secretAccessKey: "<access_key_secret>",
},
region: "auto",
});
// Delete lifecycle configuration for bucket
await client
.deleteBucketLifecycle({
Bucket: "bucketName",
})
.promise();