Google Cloud Storage のオブジェクトのメタデータを自動収集するインベントリ レポート機能の紹介
はじめに
こんにちは、クラウドエース データML ディビジョン所属の池上有希乃です。
データML ディビジョンでは、Google Cloud が提供しているデータ領域のプロダクトについて、新規リリースをキャッチアップするための調査報告会を毎週実施しています。新規リリースの中でも、特に重要と考えるリリースを記事としてまとめ、本ページのように公開しています。
たとえば、
- BigQuery のデータクリーンルームに入門しました
- Colab Enterprise を解説
- Dataflow の費用モニタリングが一般提供(GA)になりました
- Duet AI in BigQuery と生きる
- BigQuery クエリ性能改善: BigQuery の主キーと外部キーにより、クエリの性能改善が得られるかどうか検証してみた
など様々な記事を公開しています。
今回紹介するリリースは、Google Cloud Storage の Storage Insights にて manifest files が利用可能になったことについてです。Storage Insights のインベントリ レポート機能を使うと、Google Cloud Storage のバケットのオブジェクト情報のレポートが CSV や Apache Parquet 形式で保存されますが、そのインベントリ レポートのメタ情報を格納する manifest files (以降マニフェスト ファイルと表記) が生成されることにより、どのようにインベントリ レポートを生成しているかを把握できるようになりました。これによって、自分以外の人がインベントリ レポートの設定をした場合、マニフェスト ファイルを参照することで設定情報をすぐに把握できるといった用途が考えられます。
この記事では、インベントリ レポートとそのマニフェスト ファイルについて紹介していきます。
Google Cloud Storage について
Google Cloud Storage は、Google Cloud インフラストラクチャにデータを保存してアクセスするための RESTful なオブジェクト ストレージ サービスです。このサービスは、Google Cloud のパフォーマンスとスケーラビリティに、高度なセキュリティと共有機能を組み合わせたものです。いわゆる IaaS (Infrastructure as a Service) です。
Storage Insights のインベントリ レポート機能
Storage Insights のインベントリ レポート機能を使用すると、大規模なオブジェクト ストレージを管理できます。これは、Objects: list API オペレーションに代わる、高速でスケジュール可能な機能です。
インベントリ レポートには、オブジェクトのストレージ クラス、ETag、コンテンツ タイプなど、オブジェクトに関するメタデータ情報が含まれています。この情報は、ストレージ費用の分析、オブジェクトの監査と検証、データ セキュリティとコンプライアンスの確保に役立ちます。インベントリ レポートをカンマ区切り値 (CSV) ファイルまたは Apache Parquet ファイルとしてエクスポートすると、BigQuery などのツールでさらに詳しい分析を行うことができます。
Storage Insights のインベントリ レポートより
Storage Insights のインベントリ レポート機能は、Google Cloud Storage のオブジェクトのストレージ クラスやサイズ、世代、コンテンツ タイプなどのオブジェクトに関するメタデータをスケジュール通りに収集するものです。これは Objects: list
API を使っても実現可能ですが、それよりも高速で一度設定さえすれば自動的に定期的にやってくれます。
収集可能なメタデータの一覧は、オブジェクトのメタデータのフィールドにて確認できます。
インベントリ レポートのマニフェスト ファイル
Storage Insights はシャード オブジェクトとインベントリ レポートを作成します。全てのシャードが正常に生成されたとき、それらのシャードと同じ宛先バケットにマニフェスト ファイルが生成されます。 (インベントリ レポートのシャードより要約)
マニフェスト ファイルには、下記のような内容が記載されます。
- インベントリ レポートのシャード オブジェクトの名前
- インベントリ レポートに含まれるオブジェクトの数
- データ スナップショットが発生する自動生成 (インベントリ レポートのすべてのデータは、スナップショットでキャプチャされます) の日時 (UTC)
- インベントリ レポートが生成される自動生成の日時 (UTC)
- インベントリ レポートを構成する生成されたシャードの合計数
- インベントリ レポートを生成するスケジュール (頻度や開始日時、終了日時)
- CSV あるいは Apache Parquet のオプション
- インベントリ レポートに記載するオブジェクトのメタデータ項目 (プロジェクト名、バケット名、ストレージクラス、サイズ、更新日時、md5 ハッシュ値など)
- Storage Insights 対象バケット
- インベントリ レポートを格納するバケットやそのフォルダの情報
なお、Storage Insights の料金やサポートされているバケットのロケーションは、料金とサポートされているバケットのロケーションを参照することで確認できます。
Storage Insights のインベントリ レポート機能をためしに使ってみる
それでは Storage Insights のインベントリ レポート機能をためしに使ってみましょう。
Storage Insights API の有効化
まずは対象プロジェクトの Storage Insights API を有効化します。
$ gcloud services enable storageinsights.googleapis.com
Storage Insightsのサービスアカウントに監視対象バケットへのデータ収集の権限を与える
$ gcloud storage buckets add-iam-policy-binding gs://${TARGET_BUCKET} \
--member=serviceAccount:service-${PROJECT_NUMBER}@gcp-sa-storageinsights.iam.gserviceaccount.com \
--role=roles/storage.insightsCollectorService
Storage Insightsのインベントリ レポート機能を有効化する
この例では CSV 形式ではなく Parquet 形式で保存するよう設定しています。--schedule-repeats
を設定していない場合は daily
になります (2023/11/08現在)。また、--metadata-fields
で収集するメタデータの種類を指定できます。収集可能なメタデータの一覧は、オブジェクトのメタデータのフィールドにて確認できます。指定しない場合は、収集可能な全てのメタデータを収集します (2023/11/08現在)。
$ gcloud storage insights inventory-reports create gs://${TARGET_BUCKET} \
--parquet \
--destination=gs://${REPORT_BUCKET}
詳しくはインベントリ レポートの構成を作成するを参照してください。
ためしにファイルを置いてみる
今回はためしに CLOUD_ACE_INC.jpg
というファイルを監視対象バケットに置いてみます。
$ gcloud storage cp CLOUD_ACE_INC.jpg gs://${TARGET_BUCKET}
インベントリ レポートおよびマニフェスト ファイルの生成確認
しばらく時間をおくと (daily
なら日付けが変わったあと、weekly
なら翌週になったあと) レポート置き場のバケットにインベントリ レポートとマニフェスト ファイルが生成されます。
$ gcloud storage ls gs://${REPORT_BUCKET}
gs://gcs-manifest-test/8b615080-bf05-468a-ba46-8978b8199dba_2023-11-03T00:00_manifest.json
gs://gcs-manifest-test/8b615080-bf05-468a-ba46-8978b8199dba_2023-11-03T00:06_0.parquet
インベントリ レポートの内容確認
今回は Python とそのライブラリ pandas を使って確認します。
>>> import pandas as pd
>>> pd.read_parquet("8b615080-bf05-468a-ba46-8978b8199dba_2023-11-03T00_06_0.parquet").T
0
project ${PROJECT_NUMBER}
bucket ${TARGET_BUCKET}
name CLOUD_ACE_INC.jpg
location ASIA-NORTHEAST1
size 55990
timeCreated 2023-11-02 07:59:27.348703+00:00
timeDeleted NaT
updated 2023-11-02 07:59:27.348703+00:00
storageClass STANDARD
etag COqExqLspIIDEAE=
retentionExpirationTime NaT
crc32c eCTBIA==
md5Hash Iu5z8IlYNdWLr/ERuZ2K9Q==
generation 1698911967347306
metageneration 1
contentType image/jpeg
contentEncoding None
timeStorageClassUpdated 2023-11-02 07:59:27.348703+00:00
監視対象バケット ${TARGET_BUCKET}
に CLOUD_ACE_INC.jpg
が置かれたことが記載されています。また、CLOUD_ACE_INC.jpg
のサイズやロケーションなどのメタデータも記されています。
マニフェスト ファイルの内容確認
次に、生成されたマニフェスト ファイルの内容が、インベントリ レポートのマニフェスト ファイルで説明したようなインベントリ レポートのメタ情報を記したものになっているかを確認します。
ここでも Python を使って確認します。
>>> import json
>>> import pprint
>>> manifest = json.load(open("8b615080-bf05-468a-ba46-8978b8199dba_2023-11-03T00_00_manifest.json"))
>>> pprint.pprint(manifest)
{'recordsProcessed': '1',
'reportConfig': {'createTime': '2023-11-02T07:20:35.769325585Z',
'frequencyOptions': {'endDate': {'day': 2,
'month': 11,
'year': 2024},
'frequency': 'DAILY',
'startDate': {'day': 3,
'month': 11,
'year': 2023}},
'name': 'projects/${PROJECT_NUMBER}/locations/asia-northeast1/reportConfigs/8b615080-bf05-468a-ba46-8978b8199dba',
'objectMetadataReportOptions': {'metadataFields': ['project',
'bucket',
'name',
'location',
'size',
'timeCreated',
'timeDeleted',
'updated',
'storageClass',
'etag',
'retentionExpirationTime',
'crc32c',
'md5Hash',
'generation',
'metageneration',
'contentType',
'contentEncoding',
'timeStorageClassUpdated'],
'storageDestinationOptions': {'bucket': '${REPORT_BUCKET}'},
'storageFilters': {'bucket': '${TARGET_BUCKET}'}},
'parquetOptions': {},
'updateTime': '2023-11-02T07:20:35.769325585Z'},
'reportNames': ['gs://${REPORT_BUCKET}/8b615080-bf05-468a-ba46-8978b8199dba_2023-11-03T00:06_0.parquet'],
'shardsCount': '1',
'snapshotTime': '2023-11-03T00:06:50Z',
'targetDatetime': {'day': 3, 'month': 11, 'year': 2023}}
2023-11-03
から2024-11-02
の期間まで毎日インベントリ レポートを作成する設定になっていることや、2023-11-03
にバケット ${TARGET_BUCKET}
のインベントリ レポートを gs://${REPORT_BUCKET}/8b615080-bf05-468a-ba46-8978b8199dba_2023-11-03T00:06_0.parquet
に書き込んだことなどがわかります。
>>> pprint.pprint(manifest['reportConfig']['objectMetadataReportOptions']['metadataFields'])
['project',
'bucket',
'name',
'location',
'size',
'timeCreated',
'timeDeleted',
'updated',
'storageClass',
'etag',
'retentionExpirationTime',
'crc32c',
'md5Hash',
'generation',
'metageneration',
'contentType',
'contentEncoding',
'timeStorageClassUpdated']
また、['reportConfig']['objectMetadataReportOptions']['metadataFields']
にインベントリ レポートに書き込むオブジェクトのメタ情報の一覧が記されています。上の例では、各オブジェクトの Google Cloud プロジェクト名やオブジェクトのサイズ、更新日時、md5 ハッシュ値などがインベントリ レポートに記録されることがわかります。
BigQuery でインベントリ レポートを分析してみる
インベントリ レポートを BigQuery に取り込む
それでは、ためしに bq
コマンドを使ってインベントリ レポートを BigQuery に取り込んでみます。
詳しくは、Cloud Storage からの CSV データの読み込みを参照してください。
bq --location=asia-northeast1 load \
--source_format=PARQUET \
${DATASET_NAME}.${TABLE_NAME} \
gs://${REPORT_BUCKET}/8b615080-bf05-468a-ba46-8978b8199dba_2023-11-03T00:06_0.parquet
BigQuery でインベントリ レポートを分析してみる
たとえば料金がかかる容量の大きいオブジェクトをさっと調べたい時は、size
カラムに容量が記されているので以下のようなコマンドで容量の大きい順に表示することができます。
% bq query "SELECT * FROM ${DATASET_NAME}.${TABLE_NAME} ORDER BY size DESC LIMIT 100"
まとめ
この記事では Google Cloud Storage の Storage Insights にて manifest files が利用可能になったことにまつわり、インベントリ レポートの設定方法、マニフェスト ファイルが生成されること、BigQuery でのインベントリ レポートの分析例を紹介しました。
インベントリ レポートにはオブジェクトのサイズや md5 ハッシュ値などが記載されているので、「料金のかかる大きいファイルを削除する」ことや「md5 ハッシュ値が一致する同内容ファイルを削除する」ことなどの効率化が見込めそうです。CSV や Apache Parquet 形式なので簡単に BigQuery に取り込めて分析できる点も便利そうです。
また、マニフェスト ファイルを参照することで Storage Insights をどのような設定にしているのかを把握することができるため、担当者が変わっても引き継ぎが容易になるかと思われます。
Discussion