Google Cloud環境では、多くの方がデータの保存や共有のためにCloud Storageサービスを利用していると思います。特に、データアーカイブやログ保管の用途でCloud Storageを使用する際には、データの世代管理など非機能要件の検討が重要だと思います。
今回は、先日Cloud Storageバケット使用時に、世代管理の設定を行った際の実装方法を振り返るとともに、CLIでの実装方法を整理してみたいと思います。
概要
まず、バケットの世代管理には、バージョニングとライフサイクルという機能が必要となります。
それぞれの機能について説明します。
バージョニングとは
Cloud Storageバケット内でオブジェクトの異なるバージョンを保持する機能です。バージョニングを有効にすると、オブジェクトを上書きまたは削除した場合でも、過去のバージョンを非現行バージョンのオブジェクトとして保持し、必要に応じて復元することができます。バージョニングを使うことで、データの誤削除や意図しない変更から保護できます。
詳しくは、以下をご確認ください。
ライフサイクルとは
Cloud Storageバケット内のオブジェクトについて自動管理するためのルールを設定する機能です。経過日数やオブジェクトのバージョン数など、特定の条件に応じてストレージクラスを変更したり、オブジェクトを削除したりできます。これにより、コストの最適化やストレージ管理の効率化が実現できます。
詳しくは、以下をご確認ください。
よって世代管理の実現のためには、バージョニングの有効化と非現行バージョンの扱い方のルール設定を組み合わせることが重要です。
実装例
以下にて、CLIを使用した設定方法を示します。
バージョニングおよびライフサイクルの設定は、バケット単位で行います。
①バージョニング有効化
以下のコマンドでバージョニングの有効化をします。
※デフォルトではバージョニングの設定はオフになっています
gcloud storage buckets update gs://[バケット名] --versioning
例:
$ gcloud storage buckets update gs://test-generation-management --versioning ⠼Updating gs://test-generation-management/... Completed 1
②バージョニング有効化の確認
以下のコマンドでバージョニングの有効化を確認できます。
gcloud storage buckets describe gs://[バケット名] --format="default(versioning_enabled)"
例:
$ gcloud storage buckets describe gs://test-generation-management --format="default(versioning_enabled)" versioning_enabled: true
③ライフサイクルルールの作成
適用するライフサイクルルールを含むJSONファイルを作成します。
今回は、「新しいバージョンを3つ保持しつつ、非現行バージョンとなってから1日経過したオブジェクトを削除する(削除対象は非現行バージョンのみ)」という条件でルールを設定します。
(例)test-lifecycle.json
{ "lifecycle": { "rule": [ { "action": {"type": "Delete"}, "condition": { "daysSinceNoncurrentTime": 1, "isLive": false, "numNewerVersions": 3 } } ] } }
なお、設定したいライフサイクルルールのアクションやオブジェクトの条件についての詳細は以下のサイトをご確認ください。
注意点
条件の設定方法で、削除が行われるタイミングや対象が異なりますのでご注意ください。
{ "lifecycle": { "rule": [ { "action": {"type": "Delete"}, "condition": { "numNewerVersions": 3, "isLive": false } }, { "action": {"type": "Delete"}, "condition": { "daysSinceNoncurrentTime": 1 } } ] } }
例として、先述した「test-lifecycle.json」では、記述しているすべての条件を満たした場合にのみルールが実行されますが、上記のようにルールを設定すると、各条件が独立しているため、どちらかの条件を満たすだけでルールが実行されます。つまり、保持したい新しいバージョンの数に限らず1日経過するとすべてのオブジェクトが削除対象となってしまいます。
④ライフサイクルルールの適用
以下のコマンドで、作成したJSONファイルを使用してライフサイクルルールを適用します。
gcloud storage buckets update gs://[バケット名] --lifecycle-file=[手順③で作成したJSONファイルのパス]
例:
$ gcloud storage buckets update gs://test-generation-management --lifecycle-file=test-lifecycle.json ⠶Updating gs://test-generation-management/... Completed 1
⑤ライフサイクルルール適用の確認
以下のコマンドでライフサイクルルールの適用を確認できます。
gcloud storage buckets describe gs://[バケット名] --format="default(lifecycle_config)"
例:
$ gcloud storage buckets describe gs://test-generation-management --format="default(lifecycle_config)" lifecycle_config: rule: - action: type: Delete condition: daysSinceNoncurrentTime: 1 isLive: false numNewerVersions: 3
最後に
バージョニングとライフサイクルの設定は、一見簡単に思えるかもしれませんが、実際に設定を行う際には詳細な条件設定が必要であり、意外と複雑です。適切な条件を設定することで、効果的なデータ管理と保護につなげることができると思います。
また、今回はGoogle CloudのCloud Storageバケットの世代管理について整理しましたが、AWSのストレージサービスであるS3バケットでも同様に、世代管理の設定が可能です。S3のライフサイクルルールでもJSONファイルを使用して設定を行い、CLIでルールを適用できます。ただし、それぞれのアクションの選択肢や詳細な条件設定の方法には違いがあります。たとえば、S3ではオブジェクトタグを使って、特定のタグが付けられたオブジェクトに対してのみのライフサイクルルールの適用が可能です。一方、Cloud Storageでは現時点でタグを使用したフィルタリングオプションはありません。また、S3では非現行バージョンに対する制御がアクションの一部として設定できるのに対し、Cloud Storageでは非現行バージョンを条件の一部として設定するため、オブジェクトの制御方法が異なります。
このような違いを理解し、両方のクラウド環境でのストレージサービスの世代管理に柔軟に対応できるようにすることも重要だと思いました。
この記事が、Cloud Storageをストレージ先として選択する際や、非機能要件に基づくバケット管理方法の検討時の参考となり、スムーズな設計と構築のお役に立てれば嬉しいです。