계층 구조의 모든 리소스 나열

Google Cloud의 리소스는 각 노드(조직, 폴더, 프로젝트 등)가 상위 요소에 대한 참조를 갖는 계층 구조로 구성됩니다. 이 참조를 검색의 키 필터 조건으로 사용하여 리소스 검색의 일관성을 개선할 수 있습니다.

커스텀 역할을 사용하여 사용자에게 권한을 부여할 수 있습니다. 이러한 역할은 최소 권한의 원칙에 따라 작동하며, 일반적으로 특정 작업을 수행하는 데 필요한 최소한의 권한만 제공합니다.

이 스키마는 여러 사용자 그룹을 분리하는 데 유용할 수 있습니다. 예를 들면 다음과 같습니다.

  • 동료의 리소스를 검사하면 안 되는 부서가 있는 대기업.
  • 특정 프로젝트에 대한 권한은 부여받지만 그 밖의 리소스에 대한 권한은 없는 계약업체.

그러나 커스텀 역할의 제한된 권한으로 인해 list 작업을 실행할 때 계층 구조의 많은 리소스가 누락될 수 있습니다. 커스텀 역할이 부여된 사용자로 검색을 수행하면 특정 리소스가 표시되지 않는 이유를 파악하기 어려울 수 있습니다.

이런 시나리오를 피하기 위해 이 페이지에서는 리소스 계층 구조에서 Cloud Resource Manager API가 관리하는 모든 리소스를 나열하기 위한 권장사항에 대해 설명합니다. 이 가이드를 사용하여 커스텀 감사 확인을 구성하거나 Cloud Resource Manager API를 기반으로 자체 사용자 환경을 만들 수 있습니다.

모든 리소스 나열

리소스 계층 구조를 검색하여 모든 리소스를 나열할 때는 strong consistency를 가진 결과가 필요합니다. 검색에서 리소스가 누락되거나 오래된 결과를 제공하는 경우 무엇이 잘못됐는지 알기 어렵습니다. 항상 가장 정확하고 완전한 결과를 얻으려면 서비스 계정을 사용하여 다음 방법으로 검색을 수행하세요.

  1. 조직 리소스에서 조직, 폴더, 프로젝트에 대한 listget 권한을 서비스 계정에 부여합니다.
  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 프로젝트 수가 너무 많을 수 있습니다. 이 문제를 해결하려면 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를 찾으려면 다음 단계를 수행합니다.

  1. Google Cloud 콘솔 툴바에서 리소스, 문서, 제품 등 검색을 클릭하고 apps-script를 입력합니다.

    Google Cloud 콘솔로 이동

  2. 리소스에서 apps-script 폴더를 선택합니다.

  3. 폴더 ID에서 폴더 ID를 복사합니다.

리소스 검색

한참 전에 만들어진 리소스를 검색하는 경우 strong consistency가 아닌 eventual consistency를 가진 더 빠른 검색을 수행할 수 있습니다. 이 검색 방법을 사용하면 일부 리소스, 특히 최근에 변경된 리소스가 검색 결과에서 누락될 수 있습니다. 리소스를 검색하는 방법은 다음과 같습니다.

  1. 검색할 리소스에 대한 get 권한이 있는 서비스 계정을 사용합니다.
  2. 이 서비스 계정을 사용하여 projects.search() 메서드를 실행합니다.

리소스 누락 문제 해결

검색 도구를 개발하는 경우 조직 수준에서 부여된 listget 권한을 사용하는 것이 좋습니다. 이렇게 하면 사용자의 부분적 권한 때문에 목록에서 일부 리소스가 누락되는 문제를 방지할 수 있습니다.

사용자 권한을 확인하는 커스텀 사용자 환경을 설계하는 경우 손쉬운 해결책은 없습니다. 사용자에게 조직 수준의 권한이 없다면 모든 리소스에 대한 특정 권한이 있어야 해당 리소스가 표시됩니다. 사용자에게 계층 구조 어딘가에 있는 리소스에 대한 권한이 없으면 일부 리소스가 표시되지 않을 수 있습니다.

사용자에게 특정 리소스에 대한 list 권한은 있지만 get 권한이 없으면 Google Cloud Console에서 해당 리소스를 전혀 볼 수 없습니다. 하지만 리소스의 상위 요소를 지정하는 API 또는 Google Cloud CLI를 사용하는 검색에서 리소스가 반환됩니다. 리소스 계층 구조를 스캔하려고 할 때 Google Cloud Console과 다른 메서드 간의 이런 불일치가 자주 발생합니다.

다음 다이어그램은 몇 가지 일반적인 권한 구성과 이 구성이 검색을 실행하는 사용자에게 표시되는 리소스를 어떻게 변경하는지 보여줍니다.

모든 리소스 나열

이 예시에서는 조직 리소스에서 모든 필수 권한이 부여됩니다. 따라서 list 또는 search 작업을 수행할 때 전체 계층 구조가 표시됩니다.

누락된 조직 권한

이 예시에서 사용자는 resourcemanager.organizations.get을 제외한 모든 필수 권한을 가지고 있지만 이 권한은 폴더 수준에서 부여됩니다. 이 권한 차이로 인해 계층 구조 해당 부분의 list 또는 search는 완전히 표시되지만 나머지 절반은 표시되지 않습니다.

project get 권한만 있는 경우

이 예시는 폴더 리소스 수준에서 resourcemanager.projects.get 권한만 부여된 사용자의 환경을 보여줍니다. 사용자는 계층 구조의 해당 폴더 아래에서 프로젝트를 볼 수 있지만 검색을 통해서만 가능합니다. list 기능을 사용하면 결과가 반환되지 않습니다.

folder get 권한만 있는 경우

이 예시는 위와 동일한 문제를 보여주는데, 부여된 권한이 사용자가 검색으로 폴더 리소스를 찾는 것만 허용합니다. list 기능을 사용하면 결과가 반환되지 않습니다.

혼합 권한

이 예시에서 사용자는 조직 전체에서 혼합된 권한을 보유하고 있습니다. 조직 수준에서 폴더를 나열할 수 있으므로 계층 구조 전체에서 상위 리소스를 지정하는 검색으로 폴더를 찾을 수 있습니다. 폴더 하나의 프로젝트 리소스를 나열할 수 있지만 다른 폴더의 프로젝트 리소스는 나열할 수 없으며, 계층 구조의 맨 아래에 있는 프로젝트 하나에 대한 resourcemanager.projects.get 권한이 있습니다.

결과적으로 이 리소스 계층 구조 왼쪽에 있는 프로젝트는 반환할 수 없습니다. 상위 리소스를 지정하는 검색을 통해서만 오른쪽에 있는 프로젝트를 나열할 수 있으며 Google Cloud 콘솔에서 볼 때 하나의 프로젝트만 표시됩니다.

검색할 수 없는 리소스

이 예시에서 사용자는 계층 구조 전체에서 상위 요소를 지정하여 조직 리소스를 가져오고 프로젝트 리소스를 나열할 수 있습니다. 그러나 중간 폴더를 나열하거나 검색할 수 있는 권한이 없습니다. 사용자가 우연히 상위 폴더의 ID를 알고 있다면 프로젝트를 검색할 수 있습니다. 폴더는 이 사용자에게 전혀 표시되지 않으므로 ID를 모르는 사용자는 ID를 찾을 수 없습니다. Google Cloud 콘솔에 표시되는 유일한 리소스는 조직입니다.

커스텀 사용자 환경을 설계할 때는 위와 유사한 상황을 파악하는 것이 중요합니다. 나열과 검색의 조합을 사용하면 리소스 계층 구조를 렌더링할 수 있습니다. 전체 리소스 계층 구조를 볼 수 있는 권한이 없다고 사용자에게 알리는 방법도 고려해야 합니다.