📄

Google Cloud Storage のオブジェクトのメタデータを自動収集するインベントリ レポート機能の紹介

2023/11/16に公開

はじめに

こんにちは、クラウドエース データML ディビジョン所属の池上有希乃です。

データML ディビジョンでは、Google Cloud が提供しているデータ領域のプロダクトについて、新規リリースをキャッチアップするための調査報告会を毎週実施しています。新規リリースの中でも、特に重要と考えるリリースを記事としてまとめ、本ページのように公開しています。

たとえば、

など様々な記事を公開しています。

今回紹介するリリースは、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