Google Cloud 内のリソースは階層で構成され、各ノード(組織、フォルダ、プロジェクトなど)はその親への参照を持ちます。この参照をスキャンのキーフィルタ条件として使用し、リソース検索の一貫性を向上させることができます。
カスタムの役割を使用してユーザーに権限を付与できます。これらの役割は、最小権限の原則で機能し、通常は特定のタスクを実行するために必要な最小限の権限のみを付与します。
このスキームは、異なるユーザー グループを分離するのに役立ちます。例:
- 同僚のリソースを検査できない部門のある大企業。
- 特定のプロジェクトに対する権限は付与されているが、他のリソースへの権限が付与されていない契約者。
ただし、権限が制限されているため、カスタムの役割ではリスト操作を実行すると、階層内の多数のリソースが省略されることがあります。カスタムの役割が付与されたユーザーとして検索を実行すると、特定のリソースが表示されない理由を特定するのが困難になる可能性があります。
このような状況を回避するために、このページでは Cloud Resource Manager API によって管理されるすべてのリソースをリソース階層に一覧表示するためのベスト プラクティスについて説明します。このガイダンスを使用して、カスタム監査チェックの構成、または Cloud Resource Manager API を基盤とした独自のユーザー エクスペリエンスの作成を行えます。
すべてのリソースノードを一覧表示する
リソース階層をスキャンしてすべてのリソースを一覧表示する場合、強整合性の結果を得る必要があります。スキャンでリソースが欠落していたり、古いデータが表示されても、間違いを見分けるのが困難になる可能性があります。常に最も正確で完全な結果を得るには、サービス アカウントを使用して、次の方法でスキャンを実行します。
- サービス アカウントに、組織リソース内の組織、フォルダ、およびプロジェクトに対する
list
権限とget
権限を付与します。 - プロジェクト リソースとフォルダ リソースを一覧表示する場合は、フィルタ文字列に親リソースを指定します。
- 検索するリソースのタイプごと、およびフォルダなどの中間リソースに対して、このサービス アカウントで
projects.list()
メソッドを実行します。
すべてのリソースノードを一覧表示する例
次の擬似コードは、組織内のすべてのリソースノードを一覧表示する方法を示しています。
organizations = organizations.search()
projects = emptyList()
parentsToList = queueOf(organizations)
while (parent = parentsToList.pop()) {
// TODO: Iterate over paginated results as needed.
// TODO: Handle PERMISSION_DENIED appropriately.
projects.addAll(projects.list(parent.type, parent.id))
parentsToList.addAll(folders.list(parent))
}
カスタムのユーザー エクスペリエンスを構築する場合は、必要に応じて検索結果を組み合わせて親リソースを読み込むこともできます(ただし、PERMISSION_DENIED
例外も取得します)。
gcloud プロジェクト リストのレイテンシの短縮
gcloud projects list
クエリが失敗するか、時間がかかりすぎる場合は、返される Google Cloud プロジェクトの数が大きすぎる可能性があります。この問題を解決するには、filter
フラグと page-size
フラグを gcloud projects list
コマンドに適用します。
gcloud projects list
コマンドに追加できるフラグの詳細については、gcloud プロジェクト リスト をご覧ください。
Apps Script プロジェクトを除外する例
クエリの失敗や遅延の最も一般的な原因は、組織内に Apps Script プロジェクト数が多いことです。次のコマンドでは、プロジェクト リストから Apps Script プロジェクトを除外し、ページごとに返されるリソースの数を制限する方法を示します。
gcloud projects list --filter="NOT parent.id: 'APPS_SCRIPT_FOLDER_ID' "--page-size='30'
Apps Script フォルダ ID を取得する
Apps Script フォルダ ID を確認する手順は次のとおりです。
Google Cloud コンソールのツールバーで、[リソース、ドキュメント、プロダクトなどを検索] をクリックし、「
apps-script
」と入力します。[リソース] で [apps-script] フォルダを選択します。
[フォルダ ID] のフォルダ ID をコピーします。
リソースの検索
以前に作成したリソースの検索を目的とするスキャンでは、強整合性ではなく結果整合性を持つ高速スキャンを実行できます。この検索方法では、検索結果から一部のリソース、特に最近変更されたリソースが除外される場合があります。リソースを検索するには:
- 検索するリソースに対する
get
権限を持つサービス アカウントを使用します。 - このサービス アカウントで
projects.search()
メソッドを実行します。
除外されたリソースのトラブルシューティング
スキャンツールを開発する場合は、組織レベルで付与された list
権限と get
権限を使用することをおすすめします。これにより、ユーザーが権限の一部しか持っていないために一部のリソースがリストから除外される問題を回避できます。
ユーザーの権限を確認するカスタム ユーザー エクスペリエンスを作成する場合、簡単な解決策はありません。ユーザーが組織レベルの権限を持っていない場合、リソースを表示させるには、すべてのリソースに対する特定の権限が必要になります。階層内にある特定のリソースに対する権限がない場合、一部のリソースが表示されないことがあります。
ユーザーが、特定のリソースに対する list
権限は持っているが、get
権限は持っていない場合、そのリソースは Google Cloud Console でまったく表示されなくなります。ただし、リソースの親を指定する API や Google Cloud CLI を使用した検索では、そのようなリソースは返されます。Google Cloud Console と他のメソッドとの間にこのような相違があることが、リソース階層をスキャンする際に生じる混乱の一般的な原因となっています。
次の図は、権限の一般的な構成と、検索を実行するユーザーに表示されるリソースが構成によってどのように変化するかを示しています。
この例では、組織リソースで必要な権限がすべて付与されています。そのため、一覧表示や検索を実行するとすべての階層が表示されます。
この例のユーザーには、resourcemanager.organizations.get
を除き、必要な権限がすべて付与されています。ただし権限は、フォルダレベルで付与されています。この権限の相違により、階層の該当する部分の一覧表示や検索は完全に表示されますが、残りの部分は表示されません。
この例は、フォルダ リソース レベルで付与された resourcemanager.projects.get
権限のみを持つユーザーの状況を示しています。階層内の当該のフォルダの下にあるプロジェクトは表示できますが、検索でしか表示されません。リスト機能を使用しても、結果は返されません。
この例は、上記と同じ問題を示しています。ユーザーに付与されている権限では、検索でしかフォルダ リソースを見つけることができません。リスト機能を使用しても、結果は返されません。
この例のユーザーは、組織全体で組み合わされた権限を持っています。組織レベルからフォルダを一覧表示できるため、親リソースを指定して階層全体を検索し、フォルダを見つけることができます。1 つのフォルダのプロジェクト リソースの一覧表示はできますが、別のプロジェクト リソースの一覧表示はできません。また、階層の一番下にある 1 つのプロジェクトに対する resourcemanager.projects.get
権限を持っています。
このため、そのリソース階層の左側にあるプロジェクトを返すことはできません。親リソースを指定した検索で、右側にあるプロジェクトのみを一覧表示できます。Google Cloud コンソールで表示する際には、1 つのプロジェクトのみが表示されます。
この例では、ユーザーは階層全体で親を指定して組織リソースを取得し、プロジェクト リソースを一覧表示できます。ただし、中間フォルダを一覧表示または検索する権限はありません。ユーザーが親フォルダの ID を知っている場合は、プロジェクトを検索できます。フォルダはこのユーザーにはまったく表示されないため、ID を知らない場合は、ID を見つけ出すことはできません。Google Cloud コンソールに表示されるリソースは組織のみです。
カスタムのユーザー エクスペリエンスを設計する際は、上記のような状況に注意する必要があります。一覧表示機能と検索機能を組み合わせて使用し、リソースの階層をレンダリングできます。リソース階層全体を表示できる権限がないことをユーザーに伝える方法も検討してください。