리소스 위치 제한

개요

이 가이드에서는 리소스 위치 제약조건을 포함하는 조직 정책을 설정하는 방법을 설명합니다.

조직 정책 서비스 리소스 위치 제약조건을 사용하여 새 리소스의 물리적 위치를 제한할 수 있습니다. 리소스의 위치 속성을 사용하여 서비스에서 배포하고 유지 관리하는 위치를 식별할 수 있습니다. 일부 Google Cloud 서비스의 데이터 포함 리소스의 경우 이 속성에 데이터 저장 위치도 반영됩니다. 이 제약조건을 사용하면 계층 구조에서 지원되는 서비스의 리소스 생성이 허용되는 Google Cloud 위치를 정의할 수 있습니다.

리소스 위치를 정의한 후에는 새로 만든 리소스에만 제한이 적용됩니다. 리소스 위치 제약조건을 설정하기 전에 만든 리소스는 계속 존재하며 기능을 수행합니다.

이 제약조건이 포함된 정책은 Cloud Storage 및 Dataproc과 같은 특정 서비스의 하위 리소스 생성 시 시행되지 않습니다.

제한사항

리소스 위치 조직 정책 서비스 제약조건은 리전 리소스를 만드는 기능을 제어합니다. 전역 리소스가 생성되는 위치에는 영향을 미치지 않습니다. 기존 서비스 인프라를 손상시키지 않으려면 비프로덕션 프로젝트 및 폴더에서 새 정책을 테스트한 다음 조직 내에서 정책을 점진적으로 적용해야 합니다.

데이터 스토리지 약정의 경우 Google Cloud 서비스 약관서비스별 약관을 참조하세요. 리소스 위치 제약조건이 포함된 조직 정책과 데이터 스토리지 약정은 서로 다른 것입니다.

이 제약조건은 제품 및 리소스 유형의 특정 하위 집합에 적용됩니다. 현재 지원되는 서비스 목록 및 각 서비스의 동작에 대한 자세한 내용은 리소스 위치 지원 서비스 페이지를 참조하세요.

위치 유형

서로 다른 크기 카테고리를 나타내는 위치 유형으로 Google Cloud 리소스를 배포할 수 있습니다. 가장 큰 위치 유형은 둘 이상의 region을 포함하는 multi-region입니다. 각 regionzones로 더 세분화됩니다. 리전 및 영역에 대한 자세한 내용은 리전 및 영역 개요를 참조하세요.

  • Multi-region 위치는 둘 이상의 region에서 물리적 리소스로 지원되며 일반적으로 스토리지 기반 리소스에만 사용됩니다. us, asia, europe, global 등이 여기에 해당합니다.

  • Region 위치는 지리적으로 서로 격리됩니다. us-west1(오리건), asia-northeast1(도쿄), europe-west1(벨기에) 등이 여기에 해당합니다.

  • Zone 위치는 가장 세분화되고 격리된 위치 유형이며 리소스를 배포하는 데 사용됩니다. zoneregion 내의의 독립적 장애 도메인입니다. us-east1-a, us-west1-b, asia-northeast1-a 등이 여기에 해당합니다.

위치를 설정할 때 in: 프리픽스와 값 그룹을 사용해야 합니다. Google Cloud에서 선별한 값 그룹을 사용하면 현재 또는 미래의 클라우드 위치를 지정할 필요 없이 지리적 위치를 선택할 수 있습니다.

값 그룹의 in: 프리픽스는 값 그룹 내에 존재하는 모든 값이 정책의 일부로 간주되도록 지정합니다. 프리픽스 없이 그룹 값 또는 Google Cloud 리전을 입력하면 아래 규칙에 따라 in: 프리픽스가 자동으로 추가됩니다.

  • in: 프리픽스를 사용하는 위치를 입력했는데 거기에 유효하지 않은 그룹이 포함된 경우 정책 변경이 실패합니다.
  • us-east1과 같이 리전인 위치를 입력하면 in: 프리픽스가 추가되어 이 예시에서 in:us-east1-locations가 됩니다.
  • us-locations와 같은 리전 또는 멀티 리전 값 그룹을 입력하면 in: 프리픽스가 추가되어 이 예시에서 in:us-locations가 됩니다.
  • us-east1-a 또는 us와 같은 영역 또는 멀티 리전을 입력하면 값이 변경되지 않습니다.

조직 정책 설정

리소스 위치 제약조건은 일종의 목록 제약조건입니다. 리소스 위치 제약조건의 allowed_values 또는 denied_values 목록에서 제약조건을 추가하거나 삭제할 수 있습니다. 새 위치가 사용 가능한 목록에 추가될 때 조직 정책이 예기치 않게 서비스 동작을 제한하지 않도록 하려면 값 그룹을 사용하거나 정의할 전체 지리적 경계를 나타내는 allowed_values 목록을 사용하세요.

리소스 위치 제약조건을 포함하여 조직 정책 을 설정하는 방법은 다음과 같습니다.

Console

  1. Google Cloud Console의 조직 정책 페이지로 이동합니다. 조직 정책 페이지로 이동

  2. 화면 상단의 프로젝트 선택기에서 정책을 설정하려는 조직을 선택하세요.

  3. Google Cloud Platform - 리소스 제한 정의를 클릭합니다.

  4. 수정을 클릭합니다.

  5. 적용 대상에서 맞춤설정을 선택합니다.

  6. 정책 값에서 커스텀을 선택합니다.

  7. 정책 값 상자에 in 프리픽스와 값 그룹 위치 문자열을 입력한 후 Enter 키를 누릅니다. 예를 들면 in:us-locations 또는 in:us-west1-locations입니다. 위치 문자열을 여러 개 입력할 수 있습니다.

    1. 특정한 영역, 리전 또는 멀티 리전 위치를 위치 문자열로 입력할 수도 있습니다. 사용 가능한 위치 목록은 리소스 위치 지원 서비스 페이지를 참조하세요.
  8. 저장을 클릭합니다. 정책 업데이트를 확인하는 알림이 나타납니다.

gcloud

gcloud 명령줄 도구를 사용하여 정책을 설정할 수 있습니다. 리소스 위치 제약조건을 포함하는 정책을 만들려면 먼저 정책 파일을 만드세요.

cat POLICY.YAML
etag: BwVUSr8Q7Ng=
constraint: constraints/gcp.resourceLocations
listPolicy:
  deniedValues:

  • in:us-east1-locations
  • in:northamerica-northeast1-locations

그런 다음 set-policy 명령어를 실행합니다.

gcloud beta resource-manager org-policies set-policy \
    --organization 'ORGANIZATION_ID' \
    POLICY.YAML

각 항목의 의미는 다음과 같습니다.

  • ORGANIZATION_ID는 이 정책을 설정할 조직 노드의 ID입니다.
  • POLICY.YAML은 원하는 조직 정책이 포함된 .yaml 파일입니다.

새 조직 정책의 결과와 함께 응답이 반환됩니다.

constraint: constraints/gcp.resourceLocations
etag: BwVUSr8Q7Ng=
listPolicy:
  deniedValues:
  - in:us-east1-locations
  - in:northamerica-northeast1-locations
updateTime: '2018-01-01T00:00:00.000Z'

특정한 영역, 리전 또는 멀티 리전 위치를 위치 문자열로 입력할 수도 있습니다. 사용 가능한 위치 목록은 리소스 위치 지원 서비스 페이지를 참조하세요.

API

Resource Manager API를 사용하여 리소스의 조직 정책을 설정할 수 있습니다. 인증 및 승인에 OAuth 2.0 Bearer 토큰이 필요합니다.

리소스 위치 제약조건을 사용하여 조직 정책을 설정하는 방법은 다음과 같습니다.

curl -X POST -H "Content-Type: application/json" -H "Authorization: \
Bearer ${bearer_token}" -d '{policy: {etag: "BwVtXec438Y=", constraint: \
"constraints/gcp.resourceLocations", list_policy: {denied_values: \
["in:europe-locations", "in:southamerica-locations"] }}}' \
https://cloudresourcemanager.googleapis.com/v1/organizations/123456789:setOrgPolicy

새 조직 정책의 결과와 함께 응답이 반환됩니다.

{
  "constraint": "constraints/gcp.resourceLocations",
  "etag": "BwVtXec438Y=",
  "updateTime": "2018-01-01T00:00:00.000Z",
  "listPolicy": {
    "deniedValues": [
      "europe-locations",
      "southamerica-locations",
    ]
  }
}

특정한 영역, 리전 또는 멀티 리전 위치를 위치 문자열로 입력할 수도 있습니다. 사용 가능한 위치 목록은 리소스 위치 지원 서비스 페이지를 참조하세요.

조직 정책의 제약조건을 사용하는 방법은 제약조건 사용을 참조하세요.

조직 정책에서 상속 사용

리소스의 상위 노드에서 조직 정책을 상속하도록 조직 정책을 구체화할 수 있습니다. 상속을 통해 리소스 계층 구조 전체에 사용되는 조직 정책을 자세히 제어할 수 있습니다.

리소스 노드에서 상속을 사용하도록 설정하려면 조직 정책 .yaml 파일에서 inheritFromParent = true를 설정하세요. 예를 들면 다음과 같습니다.

etag: BwVtXec438Y=
constraint: constraints/gcp.resourceLocations
listPolicy:
  deniedValues:
    "us-west1"
  inheritFromParent: true

오류 메시지 예시

리소스 위치 제약조건을 지원하는 서비스는 제약조건을 위반하는 위치에 새 리소스를 만들 수 없습니다. 서비스가 제약조건을 위반하는 위치에 리소스를 만들려고 시도하면 실패하고 오류 메시지가 생성됩니다.

이 오류 메시지의 형식은 다음과 같습니다. LOCATION_IN_REQUEST violates constraint constraints/gcp.resourceLocations on the resource RESOURCE_TESTED.

다음 예시에서는 정책 시행으로 인해 Compute Engine 리소스가 새 인스턴스를 만들지 못합니다.

Location ZONE:us-east1-b violates constraint constraints/gcp.resourceLocations
on the resource
projects/policy-violation-test/zones/us-east1-b/instances/instance-3.

Google Cloud의 작업 제품군 및 Cloud 감사 로그 로그 항목

{
 insertId: "5u759gdngec"
 logName: "projects/policy-violation-test/logs/cloudaudit.googleapis.com%2Factivity"
 protoPayload: {
  @type: "type.googleapis.com/google.cloud.audit.AuditLog"
  authenticationInfo: {…}
  authorizationInfo: [6]
  methodName: "beta.compute.instances.insert"
  request: {…}
  requestMetadata: {…}
  resourceLocation: {…}
  resourceName: "projects/policy-violation-test/zones/us-east1-b/instances/instance-3"
  response: {
   @type: "type.googleapis.com/error"
   error: {
    code: 412
    errors: [
     0: {
      domain: "global"
      location: "If-Match"
      locationType: "header"
      message: "Location ZONE:us-east1-b violates constraint constraints/gcp.resourceLocations on the resource projects/policy-violation-test/zones/us-east1-b/instances/instance-3."
      reason: "conditionNotMet"
     }
    ]
    message: "Location ZONE:us-east1-b violates constraint constraints/gcp.resourceLocations on the resource projects/policy-violation-test/zones/us-east1-b/instances/instance-3."
   }
  }
  serviceName: "compute.googleapis.com"
  status: {
   code: 3
   message: "INVALID_ARGUMENT"
  }
 }
 receiveTimestamp: "2019-06-14T03:04:23.660988360Z"
 resource: {
  labels: {…}
  type: "gce_instance"
 }
 severity: "ERROR"
 timestamp: "2019-06-14T03:04:22.783Z"
}

값 그룹

값 그룹은 리소스 위치를 간단하게 정의하는 방법을 제공하기 위해 Google에서 선별한 그룹 및 위치 컬렉션입니다. 값 그룹은 관련 위치를 여러 개 포함하며 새 위치를 수용하도록 조직 정책을 변경하지 않아도 시간이 갈수록 Google에서 확장합니다.

조직 정책에 값 그룹을 사용하려면 in: 문자열을 항목의 프리픽스로 지정하세요. 값 프리픽스 사용에 대한 자세한 내용은 제약조건 사용을 참조하세요. 조직 정책을 설정하기 위한 호출에서는 그룹 이름이 검증되지 않습니다. 제공된 그룹 이름이 없을 경우 나중에 Google에서 그룹 이름을 만들지 않으면 유효한 조직 정책에 새 값이 추가되지 않습니다.

다음 표에는 현재 사용 가능한 그룹 목록이 나와 있습니다.

그룹 세부정보 직접 멤버
아시아 아시아 내의 모든 위치:
in:asia-locations
그룹:
  • asia-east1-locations
  • asia-east2-locations
  • asia-northeast1-locations
  • asia-northeast2-locations
  • asia-northeast3-locations
  • asia-south1-locations
  • asia-southeast1-locations

값:
  • asia
타이완 타이완 내의 모든 위치:
in:asia-east1-locations
값:
  • asia-east1
  • asia-east1-a
  • asia-east1-b
  • asia-east1-c
홍콩 홍콩 내의 모든 위치:
in:asia-east2-locations
값:
  • asia-east2
  • asia-east2-a
  • asia-east2-b
  • asia-east2-c
도쿄 도쿄 내의 모든 위치:
in:asia-northeast1-locations
값:
  • asia-northeast1
  • asia-northeast1-a
  • asia-northeast1-b
  • asia-northeast1-c
오사카 오사카 내의 모든 위치:
in:asia-northeast2-locations
값:
  • asia-northeast2
  • asia-northeast2-a
  • asia-northeast2-b
  • asia-northeast2-c
서울 서울 내의 모든 위치:
in:asia-northeast3-locations
값:
  • asia-northeast3
  • asia-northeast3-a
  • asia-northeast3-b
  • asia-northeast3-c
뭄바이 뭄바이 내의 모든 위치:
in:asia-south1-locations
값:
  • asia-south1
  • asia-south1-a
  • asia-south1-b
  • asia-south1-c
싱가포르 싱가포르 내의 모든 위치:
in:asia-southeast1-locations
값:
  • asia-southeast1
  • asia-southeast1-a
  • asia-southeast1-b
  • asia-southeast1-c
오스트레일리아 오스트레일리아 내의 모든 위치:
in:australia-locations
그룹:
  • australia-southeast1-locations
시드니 시드니 내의 모든 위치:
in:australia-southeast1-locations
값:
  • australia-southeast1
  • australia-southeast1-a
  • australia-southeast1-b
  • australia-southeast1-c
유럽 유럽 내의 모든 위치:
in:europe-locations
그룹:
  • europe-north1-locations
  • europe-west1-locations
  • europe-west2-locations
  • europe-west3-locations
  • europe-west4-locations
  • europe-west6-locations

값:
  • EU
  • eu
  • eur4
  • europe
  • europe-west
핀란드 핀란드 내의 모든 위치:
in:europe-north1-locations
값:
  • europe-north1
  • europe-north1-a
  • europe-north1-b
  • europe-north1-c
벨기에 벨기에 내의 모든 위치:
in:europe-west1-locations
값:
  • europe-west1
  • europe-west1-b
  • europe-west1-c
  • europe-west1-d
런던 런던 내의 모든 위치:
in:europe-west2-locations
값:
  • europe-west2
  • europe-west2-a
  • europe-west2-b
  • europe-west2-c
프랑크푸르트 프랑크푸르트 내의 모든 위치:
in:europe-west3-locations
값:
  • europe-west3
  • europe-west3-a
  • europe-west3-b
  • europe-west3-c
네덜란드 네덜란드 내의 모든 위치:
in:europe-west4-locations
값:
  • europe-west4
  • europe-west4-a
  • europe-west4-b
  • europe-west4-c
취리히 취리히 내의 모든 위치:
in:europe-west6-locations
값:
  • europe-west6
  • europe-west6-a
  • europe-west6-b
  • europe-west6-c
북미 북미 내의 모든 위치:
in:northamerica-locations
그룹:
  • northamerica-northeast1-locations
  • us-locations
몬트리올 몬트리올 내의 모든 위치:
in:northamerica-northeast1-locations
값:
  • northamerica-northeast1
  • northamerica-northeast1-a
  • northamerica-northeast1-b
  • northamerica-northeast1-c
미국 미국 내의 모든 위치:
in:us-locations
그룹:
  • us-central1-locations
  • us-central2-locations
  • us-east1-locations
  • us-east4-locations
  • us-west1-locations
  • us-west2-locations
  • us-west3-locations

값:
  • US
  • nam3
  • nam4
  • nam5
  • nam6
  • us
  • us-central
아이오와 아이오와 내의 모든 위치:
in:us-central1-locations
값:
  • us-central1
  • us-central1-a
  • us-central1-b
  • us-central1-c
  • us-central1-f
오클라호마 오클라호마 내의 모든 위치:
in:us-central2-locations
값:
  • us-central2
  • us-central2-a
  • us-central2-b
  • us-central2-c
  • us-central2-d
사우스캐롤라이나 사우스캐롤라이나 내의 모든 영역:
in:us-east1-locations
값:
  • us-east1
  • us-east1-a
  • us-east1-b
  • us-east1-c
  • us-east1-d
북버지니아 북버지니아 내의 모든 위치:
in:us-east4-locations
값:
  • us-east4
  • us-east4-a
  • us-east4-b
  • us-east4-c
오리건 오리건 내의 모든 위치:
in:us-west1-locations
값:
  • us-west1
  • us-west1-a
  • us-west1-b
  • us-west1-c
로스앤젤레스 로스앤젤레스 내의 모든 위치:
in:us-west2-locations
값:
  • us-west2
  • us-west2-a
  • us-west2-b
  • us-west2-c
솔트레이크시티 솔트레이크시티 내의 모든 위치:
in:us-west3-locations
값:
  • us-west3
  • us-west3-a
  • us-west3-b
  • us-west3-c
남미 남미 내의 모든 위치:
in:southamerica-locations
그룹:
  • southamerica-east1-locations
상파울루 상파울루 내의 모든 위치:
in:southamerica-east1-locations
값:
  • southamerica-east1
  • southamerica-east1-a
  • southamerica-east1-b
  • southamerica-east1-c

인증

조직 정책 서비스에서는 API 인증 및 승인에 OAuth 2.0을 사용합니다. OAuth 2.0 Bearer 토큰을 가져오려면 다음 안내를 따르세요.

  1. OAuth 2.0 Playground 페이지로 이동합니다.

  2. 1단계 범위 목록에서 Cloud Resource Manager API v2 > https://www.googleapis.com/auth/cloud-platform을 선택하고 API 승인을 클릭합니다.

  3. Google 계정으로 로그인 페이지가 나타나면 계정을 선택하고 로그인합니다.

  4. Google Oauth 2.0 Playground에 대한 액세스를 제공하려면 나타나는 프롬프트에서 허용을 클릭합니다.

  5. 2단계에서 승인 코드를 토큰으로 교환을 클릭합니다.

  6. 오른쪽의 요청/응답 창 하단에 액세스 토큰 문자열이 표시됩니다.

     {
       "access_token": "ACCESS_TOKEN",
       "token_type": "Bearer",
       "expires_in": 3600
     }
    

    ACCESS_TOKEN은 API 승인에 사용할 수 있는 OAuth 2.0 Bearer 토큰 문자열입니다.