Cloud Asset Inventory を用いて Google Cloud 組織内の特定プロダクトを使っているプロジェクトを抽出する
クラウドエースの亀梨です。
Google Container Registry (以降、GCR) から Artifact Registry (以降、AR) への移行期日が 2025年3月18日に迫ってきました。
以下弊社ブログでも紹介しました通り、GCR から AR へ「自動移行」と呼ばれる、 gcr.io
ドメイン名を使い続ける方式で、簡単に移行できるツールが Google から提供されました。
「自動移行ツール」の適用スコープは、プロジェクト単位です。
つまり、GCR を使っているプロジェクトの数だけ、移行作業を繰り返し実施する必要があります。
自動化するために、 GCR を使っているプロジェクト一覧を取得する方法を考えましょう。
GCR 移行対象 Google Cloud プロジェクトを組織で絞りたい(古いやり方)
私たち、クラウドエースの作業者は、お客様からいただく案件対応の関係上、複数の組織にわたって様々なプロジェクトの IAM 権限を付与されています。そのため、単純に gcloud projects list
を実行した場合、自分が権限を持つすべてのプロジェクトがリストアップされてしまいます。
また、 gcloud projects describe
の API で得ることができるプロジェクトのオブジェクトには、「 parent.id
」という、直接の親(フォルダや組織ノード)の属性しか存在しないため、「組織配下に存在するプロジェクト一覧を得る」ということができません。
困りましたね。
$ gcloud projects describe MY_PROJECT_ID
createTime: '2021-02-12T08:22:05.936Z'
lifecycleState: ACTIVE
name: MY_PROJECT_ID
parent:
id: 'FOLDER_ID_NUMBER'
type: folder
projectId: MY_PROJECT_ID
projectNumber: 'PROJECT_ID_NUMBER'
このやり方は、実は古いんです。
組織内のリソース検索なら、Cloud Asset Inventory の出番です
Cloud Asset Inventory を用いると、組織スコープ、プロジェクトスコープなどの切り口で、Google Cloud リソースの存在を直接、検索することができます。
前項で「組織内のプロジェクト一覧を探す → GCR API が有効になっているプロジェクト一覧を探す → 実際に GCR を使っているプロジェクト一覧を探す」という、けっこう手間な手法を想定していましたが、たったの1手順で完遂できてしまいます。
コンソールでリソースを探す
Cloud Asset Inventory の Web-UI で問題のリソースを抽出します。
組織内に存在するリソースを検索するには、組織スコープでの作業が必要です。
そのため、まずはプロジェクトセレクターで、対象の組織を選択。
コンソールの大メニュー > IAM > アセットインベントリ を選択してください。
権限が足りない場合、以下のようなエラーとなりますので、管理者に権限付与をしてもらって下さい。
組織の権限を得ている場合、左ペインに「概要」「リソース」「IAM ポリシー」の3つのタブが表示されます。
ここで「リソース」を選択してください。
「リソースの種類」には、この時点では GCR のリソースがないため、「さらに表示...」メニューから追加します。
containerregistry.Image
にチェックを入れてください。
前画面に戻ると、左ペインの要素に「プロジェクト」がリストアップされています。
2プロジェクトが対象のようですね。
Cloud Asset Inventory API クエリの自動生成
この時点で、既に「GCR を使っているプロジェクトをリストアップする」という目的は達成されているのですが、もしプロジェクトの数が10個、100個あった場合に備えて、 gcloud
コマンドでプロジェクトのリストを取得しましょう。
アセットインベントリ Web画面 リソースタブの右ペインに「クエリを表示」というリンクがあります。
これをクリックすると、現在画面に出ている情報を CLI で取得できる gcloud
コマンドが得られます。
結論: 組織 ID 番号を指定して、GCR を使っているプロジェクト ID の一覧を得るコマンド
$ gcloud asset search-all-resources \
--scope='organizations/{組織番号}' \
--asset-types='containerregistry.googleapis.com/Image' \
--format="table(parentFullResourceName)" | sort | uniq | cut -d/ -f 5
実行結果
PROJECT_ID_1
PROJECT_ID_2
PARENT_FULL_RESOURCE_NAME
見事、取得することができました。
Discussion