Cloud Resource Manager API 可讓您探索 Google Cloud 資源階層中的每個資料夾和專案,並建立目錄。這項資訊有助於您進行稽核檢查,以及建構自訂管理工具。如果使用者具備受限的自訂角色,標準清單作業可能會省略資源。您可以依據父項參照篩選查詢,取得一致的搜尋結果,並找出可能因最小權限而隱藏的節點。
列出所有資源節點
掃描資源階層來列出所有資源時,您需要同步一致的結果。如果掃描作業遺漏資源或提供過時的結果,可能很難發現有問題。為確保您一律能取得最準確、最完整的結果,請使用服務帳戶,並按照下列方式執行掃描:
- 在組織資源上,授予服務帳戶組織、資料夾和專案的
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 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,請按照下列步驟操作。
在 Google Cloud 控制台的工具列中,按一下「Search for resources, docs, products, and more」(搜尋資源、文件、產品等),然後輸入
apps-script。在「資源」下方,選取「apps-script」資料夾。
複製「資料夾 ID」下方的資料夾 ID。
搜尋資源
如果掃描作業是要搜尋先前建立的資源,您可以執行速度較快的掃描作業,採用最終一致性,而非同步一致。請注意,這種搜尋方法可能會在搜尋結果中省略部分資源,尤其是最近變更過的資源。如要搜尋資源,請按照下列步驟操作:
- 使用對您要搜尋的資源具備
get權限的服務帳戶。 - 使用這個服務帳戶執行
projects.search()方法。
排解省略資源的問題
如果您正在開發掃描工具,建議使用在組織層級授予的 list 和 get 權限。這樣可以避免使用者因部分權限而造成問題,導致清單中省略部分資源。
如果您正在設計自訂使用者體驗,用於檢查使用者授權,則沒有直接的解決方案。如果使用者沒有組織層級權限,則必須具備每項資源的特定權限,才能查看資源。如果使用者缺少階層中某個資源的權限,可能就不會顯示部分資源。
如果使用者對特定資源具有 list 權限,但沒有 get 權限,則該資源完全不會顯示在Google Cloud 控制台中。不過,如果使用 API 或 Google Cloud CLI 搜尋,並指定資源的父項,系統就會傳回該資源。 Google Cloud 控制台與其他方法之間的差異,是嘗試掃描資源階層時常見的混淆來源。
下列圖表說明一些常見的權限設定,以及這些設定如何影響使用者執行搜尋時可看到的資源。
在本範例中,所有必要權限都是在機構資源中授予。因此,執行清單或搜尋時,整個階層都會顯示。
在本例中,使用者擁有所有必要權限 (resourcemanager.organizations.get 除外),但這些權限是在資料夾層級授予。這項權限落差可讓他們完整查看或搜尋該階層部分,但無法查看或搜尋另一半。
這個範例顯示使用者在資料夾資源層級僅獲授予 resourcemanager.projects.get 權限時的體驗。他們可以查看階層中該資料夾底下的專案,但只能透過搜尋方式。使用清單功能不會傳回任何結果。
這個範例說明類似的情境,其中授予的權限僅允許您透過搜尋找到資料夾資源。清單作業不會傳回任何結果。
本例中的使用者在整個組織中擁有多種權限。他們可以從組織層級列出資料夾,並透過指定階層中上層資源的搜尋,找到這些資料夾。他們可以列出某個資料夾的專案資源,但無法列出其他資料夾的專案資源,而且在階層底部的某個專案中擁有 resourcemanager.projects.get 權限。
因此,他們無法傳回這項資源階層左側的專案。他們只能透過指定上層資源的搜尋,列出右側的專案,而且在 Google Cloud 控制台中查看時,只能看到一個專案。
在這個範例中,您可以指定整個階層中的父項,取得機構資源並列出專案資源。不過,您沒有權限列出或搜尋任何中繼資料夾。如果您知道上層資料夾的 ID,就可以搜尋專案。您無法查看資料夾,因此如果尚未取得 ID,就無法找到 ID。 Google Cloud 控制台中只會顯示「組織」資源。
設計自訂使用者體驗時,請務必留意類似情況。您可以結合列出和搜尋功能,呈現資源階層。您也應考慮如何向使用者說明,他們缺少可查看整個資源階層的權限。