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

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

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

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

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

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

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

모든 리소스 나열

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

  1. 조직 리소스에서 조직, 폴더, 프로젝트에 대한 listget 권한을 서비스 계정에 부여합니다.
  2. 프로젝트 및 폴더 리소스를 나열하는 경우 필터 문자열에 상위 리소스를 지정합니다.
  3. 이 서비스 계정을 사용하여 찾으려는 각 리소스 유형과 폴더 등의 모든 중간 리소스에 대해 projects.list() 메서드를 실행합니다.

모든 리소스 나열 예시

다음 예시는 조직의 모든 리소스 노드를 나열하는 방법을 보여줍니다.

organizations = CloudResourceManager.Organizations.Search()
projects = emptyList()

parentsToList = queueOf(organizations)
while (parent = parentsToList.pop()) {
  // NOTE: Don't forget to iterate over paginated results.
  // TODO: handle PERMISSION_DENIED appropriately.
  projects.addAll(CloudResourceManager.Projects.List(
      "parent.type:" + parent.type + " parent.id:" + parent.id))
  parentsToList.addAll(CloudResourceManager.Folders.List(parent))
}

커스텀 사용자 환경을 빌드할 때 검색 결과를 조합하여 필요에 따라 상위 리소스를 로드할 수도 있습니다(동시에 PERMISSION_DENIED 오류 포착).

리소스 검색

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

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

리소스 누락 문제해결

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

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

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

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

모든 리소스 나열

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

누락된 조직 권한

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

project get 권한만 있는 경우

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

folder get 권한만 있는 경우

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

혼합 권한

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

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

검색할 수 없는 리소스

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

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