Cloud Resource Manager API를 사용하면 Google Cloud 리소스 계층 구조 전반에서 모든 폴더와 프로젝트를 검색하고 카탈로그화할 수 있습니다. 이러한 가시성은 감사 검사를 수행하고 커스텀 관리 도구를 빌드하는 데 도움이 됩니다. 사용자에게 제한된 커스텀 역할이 있는 경우 표준 목록 작업에서 리소스를 생략할 수 있습니다. 상위 참조로 쿼리를 필터링하여 일관된 검색 결과를 얻고 최소 권한으로 인해 숨겨질 수 있는 노드를 식별할 수 있습니다.
모든 리소스 노드 나열
리소스 계층 구조를 검색하여 모든 리소스를 나열할 때는 strong consistency를 가진 결과가 필요합니다. 검색에서 리소스가 누락되거나 오래된 결과를 제공하는 경우 무엇이 잘못됐는지 알기 어렵습니다. 항상 가장 정확하고 완전한 결과를 얻으려면 서비스 계정을 사용하여 다음 방법으로 검색을 수행하세요.
- 조직 리소스에서 조직, 폴더, 프로젝트에 대한
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 프로젝트 수가 너무 많을 수 있습니다. 이 문제를 해결하려면 gcloud projects list 명령어에 filter 플래그와 page-size 플래그를 적용합니다.
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 콘솔 툴바에서 리소스, 문서, 제품 등 검색을 클릭하고
apps-script를 입력합니다.리소스에서 apps-script 폴더를 선택합니다.
폴더 ID에서 폴더 ID를 복사합니다.
리소스 검색
한참 전에 만들어진 리소스를 검색하는 경우 strong consistency가 아닌 eventual consistency를 가진 더 빠른 검색을 수행할 수 있습니다. 이 검색 방법을 사용하면 일부 리소스, 특히 최근에 변경된 리소스가 검색 결과에서 누락될 수 있습니다. 리소스를 검색하는 방법은 다음과 같습니다.
- 검색할 리소스에 대한
get권한이 있는 서비스 계정을 사용합니다. - 이 서비스 계정을 사용하여
projects.search()메서드를 실행합니다.
리소스 누락 문제 해결
검색 도구를 개발하는 경우 조직 수준에서 부여된 list 및 get 권한을 사용하는 것이 좋습니다. 이렇게 하면 사용자의 부분적 권한 때문에 목록에서 일부 리소스가 누락되는 문제를 방지할 수 있습니다.
사용자 권한을 확인하는 맞춤 사용자 환경을 설계하는 경우 간단한 해결책은 없습니다. 사용자에게 조직 수준의 권한이 없다면 모든 리소스에 대한 특정 권한이 있어야 해당 리소스가 표시됩니다. 사용자에게 계층 구조 어딘가에 있는 리소스에 대한 권한이 없으면 일부 리소스가 표시되지 않을 수 있습니다.
사용자에게 특정 리소스에 대한 list 권한은 있지만 get 권한이 없으면Google Cloud 콘솔에서 해당 리소스를 전혀 볼 수 없습니다. 하지만 리소스의 상위 요소를 지정하는 API 또는 Google Cloud CLI를 사용하는 검색에서 리소스가 반환됩니다. 리소스 계층 구조를 스캔하려고 할 때 Google Cloud 콘솔과 다른 메서드 간의 이런 불일치가 자주 발생합니다.
다음 다이어그램은 몇 가지 일반적인 권한 구성과 이 구성이 검색을 실행하는 사용자에게 표시되는 리소스를 어떻게 변경하는지 보여줍니다.
이 예시에서는 조직 리소스에서 모든 필수 권한이 부여됩니다. 따라서 list 또는 search 작업을 수행할 때 전체 계층 구조가 표시됩니다.
이 예시에서 사용자는 resourcemanager.organizations.get을 제외한 모든 필수 권한을 가지고 있지만 이 권한은 폴더 수준에서 부여됩니다. 이 권한 차이로 인해 계층 구조 해당 부분의 list 또는 search는 완전히 표시되지만 나머지 절반은 표시되지 않습니다.
이 예시는 폴더 리소스 수준에서 resourcemanager.projects.get 권한만 부여된 사용자의 환경을 보여줍니다.
사용자는 계층 구조의 해당 폴더 아래에서 프로젝트를 볼 수 있지만 검색을 통해서만 가능합니다. 목록 기능을 사용해도 결과가 반환되지 않습니다.
이 예시에서는 부여된 권한으로 검색을 통해서만 폴더 리소스를 찾을 수 있는 유사한 시나리오를 보여줍니다. 목록 작업은 결과를 반환하지 않습니다.
이 예시에서 사용자는 조직 전체에서 혼합된 권한을 보유하고 있습니다.
조직 수준에서 폴더를 나열할 수 있으므로 계층 구조 전체에서 상위 리소스를 지정하는 검색으로 폴더를 찾을 수 있습니다.
폴더 하나의 프로젝트 리소스를 나열할 수 있지만 다른 폴더의 프로젝트 리소스는 나열할 수 없으며, 계층 구조의 맨 아래에 있는 프로젝트 하나에 대한 resourcemanager.projects.get 권한이 있습니다.
결과적으로 이 리소스 계층 구조 왼쪽에 있는 프로젝트는 반환할 수 없습니다. 상위 리소스를 지정하는 검색을 통해서만 오른쪽에 있는 프로젝트를 나열할 수 있으며 Google Cloud 콘솔에서 볼 때 하나의 프로젝트만 표시됩니다.
이 예시에서는 계층 구조 전체에서 상위 요소를 지정하여 조직 리소스를 가져오고 프로젝트 리소스를 나열할 수 있습니다. 하지만 중간 폴더를 나열하거나 검색할 권한은 없습니다. 상위 폴더의 ID를 알고 있으면 프로젝트를 검색할 수 있습니다. 폴더가 표시되지 않으므로 ID를 모르는 경우 ID를 찾을 수 없습니다. Google Cloud 콘솔에 표시되는 유일한 리소스는 조직입니다.
커스텀 사용자 환경을 설계할 때는 위와 유사한 상황을 파악하는 것이 중요합니다. 나열과 검색의 조합을 사용하면 리소스 계층 구조를 렌더링할 수 있습니다. 전체 리소스 계층 구조를 볼 수 있는 권한이 없다고 사용자에게 알리는 방법도 고려해야 합니다.