列出階層中的所有專案和資料夾

Cloud Resource Manager API 可讓您探索 Google Cloud 資源階層中的每個資料夾和專案,並建立目錄。這項資訊有助於您進行稽核檢查,以及建構自訂管理工具。如果使用者具備受限的自訂角色,標準清單作業可能會省略資源。您可以依據父項參照篩選查詢,取得一致的搜尋結果,並找出可能因最小權限而隱藏的節點。

列出所有資源節點

掃描資源階層來列出所有資源時,您需要同步一致的結果。如果掃描作業遺漏資源或提供過時的結果,可能很難發現有問題。為確保您一律能取得最準確、最完整的結果,請使用服務帳戶,並按照下列方式執行掃描:

  1. 在組織資源上,授予服務帳戶組織、資料夾和專案的 list 和 get 權限。
  2. 如要列出專案和資料夾資源,請在篩選器字串中指定父項資源。
  3. 針對要尋找的每種資源類型,以及任何中繼資源 (例如資料夾),使用這個服務帳戶執行 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 projects list 的延遲時間

如果 gcloud projects list 查詢失敗或耗時過長,可能是因為要傳回的Google Cloud 專案數量過多。如要修正這個問題,請將 filter 和 page-size 旗標套用至 gcloud projects list 指令。

如要進一步瞭解可新增至 gcloud projects list 指令的旗標,請參閱「gcloud projects list」。

排除 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,請按照下列步驟操作。

  1. 在 Google Cloud 控制台的工具列中,按一下「Search for resources, docs, products, and more」(搜尋資源、文件、產品等),然後輸入 apps-script。

    前往 Google Cloud 控制台

  2. 在「資源」下方,選取「apps-script」資料夾。

  3. 複製「資料夾 ID」下方的資料夾 ID。

搜尋資源

如果掃描作業是要搜尋先前建立的資源,您可以執行速度較快的掃描作業,採用最終一致性,而非同步一致。請注意,這種搜尋方法可能會在搜尋結果中省略部分資源,尤其是最近變更過的資源。如要搜尋資源,請按照下列步驟操作:

  1. 使用對您要搜尋的資源具備 get 權限的服務帳戶。
  2. 使用這個服務帳戶執行 projects.search() 方法。

排解省略資源的問題

如果您正在開發掃描工具,建議使用在組織層級授予的 list 和 get 權限。這樣可以避免使用者因部分權限而造成問題,導致清單中省略部分資源。

如果您正在設計自訂使用者體驗,用於檢查使用者授權,則沒有直接的解決方案。如果使用者沒有組織層級權限,則必須具備每項資源的特定權限,才能查看資源。如果使用者缺少階層中某個資源的權限,可能就不會顯示部分資源。

如果使用者對特定資源具有 list 權限,但沒有 get 權限,則該資源完全不會顯示在Google Cloud 控制台中。不過,如果使用 API 或 Google Cloud CLI 搜尋,並指定資源的父項,系統就會傳回該資源。 Google Cloud 控制台與其他方法之間的差異,是嘗試掃描資源階層時常見的混淆來源。

下列圖表說明一些常見的權限設定,以及這些設定如何影響使用者執行搜尋時可看到的資源。

列出所有資源

在本範例中,所有必要權限都是在機構資源中授予。因此,執行清單或搜尋時,整個階層都會顯示。

缺少機構權限

在本例中,使用者擁有所有必要權限 (resourcemanager.organizations.get 除外),但這些權限是在資料夾層級授予。這項權限落差可讓他們完整查看或搜尋該階層部分,但無法查看或搜尋另一半。

僅限專案 get 權限

這個範例顯示使用者在資料夾資源層級僅獲授予 resourcemanager.projects.get 權限時的體驗。他們可以查看階層中該資料夾底下的專案,但只能透過搜尋方式。使用清單功能不會傳回任何結果。

僅限資料夾取得權限

這個範例說明類似的情境,其中授予的權限僅允許您透過搜尋找到資料夾資源。清單作業不會傳回任何結果。

混合權限

本例中的使用者在整個組織中擁有多種權限。他們可以從組織層級列出資料夾,並透過指定階層中上層資源的搜尋,找到這些資料夾。他們可以列出某個資料夾的專案資源,但無法列出其他資料夾的專案資源,而且在階層底部的某個專案中擁有 resourcemanager.projects.get 權限。

因此,他們無法傳回這項資源階層左側的專案。他們只能透過指定上層資源的搜尋,列出右側的專案,而且在 Google Cloud 控制台中查看時,只能看到一個專案。

無法探索的資源

在這個範例中,您可以指定整個階層中的父項,取得機構資源並列出專案資源。不過,您沒有權限列出或搜尋任何中繼資料夾。如果您知道上層資料夾的 ID,就可以搜尋專案。您無法查看資料夾,因此如果尚未取得 ID,就無法找到 ID。 Google Cloud 控制台中只會顯示「組織」資源。

設計自訂使用者體驗時,請務必留意類似情況。您可以結合列出和搜尋功能,呈現資源階層。您也應考慮如何向使用者說明,他們缺少可查看整個資源階層的權限。