
Cloud Storageのライフサイクル管理にオブジェクトサイズの条件が追加されたので確認してみる
はじめに
データ事業本部のkobayashiです。
以前、Cloud Storageのオブジェクトのライフサイクル管理にパスフィルタ条件が追加された際に記事を書きました。
この記事では matchesPrefix によって「特定のパス配下のオブジェクトだけを対象にする」ことができるようになった点を扱いました。その後もライフサイクル管理の条件は少しずつ増えていて、2026年7月20日のアップデートで オブジェクトサイズによる条件 が追加されました。sizeAboveBytes と sizeBelowBytes の2つで、「一定サイズより大きい/小さいオブジェクトだけを対象にする」というルールが書けるようになっています。
小さいオブジェクトをNearlineやColdlineへ移すと、最低保存期間と操作課金によってかえって割高になる場合があります。サイズ条件はそうしたオブジェクトをルールの対象から外す用途に使えます。今回はこのサイズ条件の仕様と設定例を確認します。
なぜサイズ条件が必要なのか
Cloud Storageのストレージクラスには 最低保存期間(Minimum storage duration) が設定されています。
| ストレージクラス | 最低保存期間 |
|---|---|
| Standard storage | なし |
| Nearline storage | 30日 |
| Coldline storage | 90日 |
| Archive storage | 365日 |
最低保存期間より前にオブジェクトを削除すると、残り期間分の保存料金が早期削除料金として請求されます。さらに SetStorageClass による移行はオブジェクト1件ごとに操作課金が発生します。
ここで問題になるのが、数KB程度の小さいオブジェクトが大量にあるケースです。小さいオブジェクトは保存料金そのものが微々たるものなので、クラスを下げて節約できる保存料金よりも、移行時の操作課金や、移行後に最低保存期間より前に削除した場合の早期削除料金の方が大きくなる場合があります。たとえば、大きな本体ファイルと一緒に小さなマニフェストファイルやマーカーファイルを大量に置いているバケットが該当します。
これまでのライフサイクル管理では、こうした小さいオブジェクトをルールの対象から外すには、matchesPrefix / matchesSuffix を使ってパスや拡張子で切り分ける必要がありました。サイズ条件が追加されたことで「一定サイズを超えるオブジェクトだけをアーカイブする」と直接書けるようになります。
サイズ条件の仕様
追加された2つの条件は以下のとおりです。
| 条件 | 意味 |
|---|---|
sizeAboveBytes |
オブジェクトのサイズが指定値を 超える 場合に条件を満たす |
sizeBelowBytes |
オブジェクトのサイズが指定値より 小さい 場合に条件を満たす |
仕様面で押さえておきたい点は次の3つです。
- 単位は バイト
- 指定できる最大値は 5 TiB
- 評価対象は本体のサイズのみで、メタデータのサイズは含まれない
条件はANDで評価される
ライフサイクルルールの条件はすべて省略可能ですが、1つのルールに少なくとも1つは必要です。そして 同一ルール内に複数の条件を書いた場合、すべてを満たしたときにアクションが実行されます (AND評価)。
この性質を利用して、sizeAboveBytes と sizeBelowBytes を同じルールに並べると「サイズがこの範囲のオブジェクトだけ」という指定になります。
大きいオブジェクトだけをColdlineに移す
まずは「1MiBを超えるオブジェクトだけを、90日経過後にColdlineへ移す」ルールを書いてみます。1MiB = 1048576バイトです。
{
"lifecycle": {
"rule": [
{
"action": {
"type": "SetStorageClass",
"storageClass": "COLDLINE"
},
"condition": {
"age": 90,
"matchesStorageClass": ["STANDARD"],
"sizeAboveBytes": 1048576
}
}
]
}
}
age matchesStorageClass sizeAboveBytes の3つがすべて満たされたオブジェクトだけが対象になります。1MiB以下の小さなオブジェクトは移行の対象から外れ、Standardのまま残ります。
適用は gcloud storage buckets update に --lifecycle-file でJSONファイルを渡します。以前の記事では gsutil lifecycle set を使っていましたが、今回は gcloud storage コマンドを使います。
$ gcloud storage buckets update gs://{バケット名} \
--lifecycle-file=./lifecycle.json
バケットに設定済みのライフサイクル構成は、このJSONの内容に置き換わります。既存のルールを残したい場合は、そのルールもJSONに含めておきます。
設定内容の確認は describe で行います。
$ gcloud storage buckets describe gs://{バケット名} \
--format="default(lifecycle_config)"
サイズの範囲を指定する
sizeAboveBytes と sizeBelowBytes を同じ条件ブロックに書くと範囲指定になります。以下は「1MiBより大きく、かつ100MiBより小さいオブジェクトを、30日経過後にNearlineへ移す」ルールです。
{
"lifecycle": {
"rule": [
{
"action": {
"type": "SetStorageClass",
"storageClass": "NEARLINE"
},
"condition": {
"age": 30,
"sizeAboveBytes": 1048576,
"sizeBelowBytes": 104857600
}
}
]
}
}
小さすぎるオブジェクトは移行コストが見合わないので除外し、大きすぎるオブジェクトは別のルールでColdlineやArchiveへ直接送る、といった使い分けができます。
サイズとパスフィルタを組み合わせる
以前の記事で扱った matchesPrefix と組み合わせることもできます。以下は「app_1/ 配下にある1MiB未満の小さいオブジェクトを、7日経過後に削除する」ルールです。一時ファイルやマーカーファイルの掃除に使う想定です。
{
"lifecycle": {
"rule": [
{
"action": {
"type": "Delete"
},
"condition": {
"age": 7,
"matchesPrefix": ["app_1/"],
"sizeBelowBytes": 1048576
}
}
]
}
}
条件はANDなので「app_1/ 配下」かつ「7日以上経過」かつ「1MiB未満」をすべて満たすオブジェクトだけが削除されます。
複数のルールが同時にマッチしたとき
サイズ条件を使い始めると、ルールが増えて条件の重なりが生じやすくなります。1つのオブジェクトに対して複数のルールの条件が同時に満たされた場合、Cloud Storageはそのうち1つのルールのアクションだけを実行します。
優先順位は次のとおりです。
DeleteがSetStorageClassより優先されるSetStorageClassが複数マッチした場合は、保存料金が最も安いストレージクラスへの移行が選ばれる
削除ルールと移行ルールの両方に当たるオブジェクトは削除されます。ルールを追加する際は、既存のルールと条件が重なっていないかを確認しておくとよいでしょう。
まとめ
Cloud Storageのライフサイクル管理に追加されたサイズ条件 sizeAboveBytes / sizeBelowBytes を確認しました。これまでパスや拡張子で切り分けていた小さいオブジェクトを、サイズで直接ルールの対象から外せるようになったので便利になったかと思います。
最後まで読んで頂いてありがとうございました。








