이미지 및 스냅샷 공유

이미지와 스냅샷을 프로젝트 또는 조직 외부의 사용자와 공유할 수 있습니다. 다른 프로젝트 및 조직에서 이러한 리소스에 대한 액세스 권한이 있는 사용자는 해당 리소스를 사용하여 작업을 완료할 수 있습니다. 예를 들어 다른 프로젝트의 이미지 또는 스냅샷에 대한 읽기 액세스 권한을 부여받은 사용자는 자신의 프로젝트에서 해당 리소스를 사용하여 영구 디스크를 만들 수 있습니다. 이미지와 스냅샷에 대한 읽기 액세스 권한을 공유하려면 IAM 역할을 사용하세요.

경우에 따라 승인된 사용자에게 이러한 스토리지 리소스에 대한 액세스 권한을 부여하되, 해당 리소스를 현재 조직 또는 특정 프로젝트 내에서만 사용하도록 해야 할 수 있습니다. 사용자가 액세스 권한을 부여받은 이미지와 스냅샷을 사용하여 리소스를 만들 수 있는 프로젝트를 제한하려면 스토리지 리소스 사용량 제약조건을 조직 정책으로 설정하세요.

IAM 역할에 대해 자세히 알아보려면 IAM 문서를 읽어보세요.

전체 프로젝트 대신 이미지와 같은 특정 리소스에 대한 액세스 권한을 부여할 수 있도록 하는 리소스 수준의 IAM 정책에 대해 알아보려면 Compute Engine 리소스에 액세스 권한 부여를 참조하세요.

시작하기 전에

제한사항

스토리지 리소스를 공유할 경우 다음과 같은 제한사항이 적용됩니다.

  • allAuthenticatedUsers에 이미지 또는 스냅샷에 대한 액세스를 허용하는 역할을 부여할 수 있지만, allUsers로 이러한 리소스에 대한 액세스를 허용하는 역할은 부여할 수 없습니다.

  • constraints/compute.storageResourceUseRestrictions 제약조건은 조직 수준에서만 설정할 수 있습니다.

  • 프로젝트 외부의 리소스로 이미지나 스냅샷을 만들려면 Compute Engine API를 사용해야 합니다. 예를 들어 이미지나 스냅샷의 경로를 지정해야 하는 메서드를 실행할 때 원격 프로젝트의 이미지 및 스냅샷을 참조할 수 있습니다. 이러한 메서드의 몇 가지 예시는 다음과 같습니다.

프로젝트 및 조직 간에 스토리지 리소스 공유

리소스, 프로젝트, 폴더 또는 조직 수준에서 다음 IAM 역할이나 권한을 다른 사용자에게 부여하여 이미지 및 스냅샷에 대한 액세스 권한을 해당 사용자와 공유할 수 있습니다.

  • 이미지: roles/compute.imageUser 역할 또는 compute.images.useReadOnly 권한
  • 스냅샷: roles/compute.storageAdmin 역할 또는 compute.snapshots.useReadOnly 권한

이러한 역할 및 권한을 사용하면 이미지와 스냅샷을 소유한 프로젝트 외부의 다른 팀 구성원과 이미지 및 스냅샷을 공유할 수 있습니다. 예를 들어 회사의 특정 프로젝트에 회사의 나머지 프로젝트에서 사용하기에 적합한 이미지가 포함되어 있을 수 있습니다. 팀 구성원에게 프로젝트 수준에서 roles/compute.imageUser 역할을 부여하여 이들이 해당 프로젝트에서 이미지를 사용할 수 있게 만들 수 있습니다.

이미지 공유 역할을 부여하려면 Google Cloud Console, gcloud 명령줄 도구, API를 사용합니다. IAM 사용 방법을 알아보려면 IAM 문서를 읽어보세요.

Console

  1. Cloud Console에서 IAM 페이지로 이동합니다.

    IAM 페이지로 이동

  2. 메시지가 나타나면 프로젝트를 선택합니다.
  3. 새 사용자를 추가하는 경우:
    1. 페이지 상단의 추가를 클릭합니다.
    2. 액세스 권한을 부여할 계정의 이메일 주소를 하나 이상 지정합니다.
    3. 구성원에게 역할을 하나 이상 부여합니다.
      • 이미지: 역할 선택기에서 Compute Engine > Compute 이미지 사용자를 선택합니다.
      • 스냅샷: 역할 선택기에서 Compute Engine > Compute 스토리지 관리자를 선택합니다.
  4. 변경사항을 저장합니다.

gcloud

gcloud 명령줄 도구를 사용하여 이미지 또는 이미지 프로젝트의 Cloud IAM 정책에 바인딩을 추가합니다. 다음은 프로젝트에 바인딩을 추가하는 예시입니다.

gcloud projects add-iam-policy-binding [PROJECT_ID] \
    --member [MEMBER_TYPE]:[ACCOUNT] --role [ROLE]

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

  • [PROJECT_ID]는 공유하려는 이미지가 포함된 프로젝트의 ID입니다.
  • [MEMBER_TYPE]은 액세스 권한을 부여할 계정의 유형입니다. 예를 들어 개별 사용자에게는 user, 서비스 계정에는 serviceAccount, Google 그룹에는 group을 사용합니다.
  • [ACCOUNT]는 이 역할을 부여할 계정의 이메일 주소입니다. 예를 들어 서비스 계정에는 my-sa@my-project-123.iam.gserviceaccount.com과 같은 이메일 주소를 사용할 수 있습니다.
  • [ROLE]은 사용자에게 부여할 역할입니다. 이미지의 경우 roles/compute.imageUser를 지정합니다. 스냅샷의 경우에는 roles/compute.storageAdmin을 지정합니다.

다음은 john@example.comroles/compute.imageUser 역할을 부여하여 이 계정이 database-images라는 프로젝트의 이미지에 액세스할 수 있게 만드는 예시입니다.

gcloud projects add-iam-policy-binding database-images \
    --member user:john@example.com --role roles/compute.imageUser

API

API에서 POST 요청을 다음 URL로 보냅니다. 여기서 [PROJECT_ID]는 공유하려는 이미지가 포함된 프로젝트의 ID입니다.

POST https://cloudresourcemanager.googleapis.com/v1/projects/[PROJECT_ID]:setIamPolicy

프로젝트에 적용할 바인딩 목록이 요청 본문에 포함되어야 하며, 역할이 바인딩의 일부여야 합니다. 예를 들면 다음과 같습니다.

{
   "policy": {
       "version": "0",
       "bindings": [
       {
           "role": "roles/compute.admin",
           "members": [
               "user:example@gmail.com"
           ]
       },
       {
           "role": "roles/compute.imageUser",
           "members": [
               "user:john@gmail.com"
           ]
       }
       ]
   }

}

관리형 인스턴스 그룹에 이미지 액세스 권한 부여

Compute Engine에서는 인스턴스 그룹을 관리형 또는 비관리형 인스턴스 그룹으로 만들 수 있습니다. 관리형 인스턴스 그룹을 만드는 경우 Compute Engine은 Google API 서비스 계정을 사용하여 Compute Engine API를 호출하고 비정상 인스턴스를 다시 만들거나 인스턴스를 업데이트하는 등 그룹과 관련된 작업을 수행합니다. 다른 프로젝트의 이미지를 사용하여 관리형 인스턴스 그룹을 만들려면 관리형 인스턴스 그룹을 만드는 프로젝트에 속한 API 서비스 계정에 compute.imageUser 역할을 부여하면 됩니다.

예를 들어 프로젝트 A에서 프로젝트 B 소유의 이미지를 사용하여 관리형 인스턴스 그룹을 만들어야 하는 경우 프로젝트 B의 소유자가 프로젝트 A의 Google API 서비스 계정에 프로젝트 B의 compute.imageUser 역할을 부여해야 합니다. 그러면 해당 계정이 프로젝트 B의 이미지를 사용하여 프로젝트 A에서 관리형 인스턴스 그룹을 만들 수 있습니다.

compute.imageUser 역할을 부여한 후 해당 그룹의 인스턴스 템플릿을 만들 때 특정 이미지의 URL을 제공할 수 있습니다.

서비스 계정 이메일을 가져오고 계정에 액세스 권한을 부여하려면 다음 단계를 따르세요.

  1. 관리형 인스턴스 그룹을 만들려는 프로젝트의 Cloud Console에서 IAM 페이지로 이동합니다.

    IAM 페이지로 이동

  2. 메시지가 나타나면 목록에서 프로젝트를 선택합니다.
  3. 다음과 같은 형식의 이메일 주소를 사용하는 Google API 서비스 계정을 찾습니다.

    [PROJECT_NUMBER]@cloudservices.gserviceaccount.com
    
  4. 위의 이메일 주소를 적어 둡니다. 그런 다음 이미지를 소유한 프로젝트의 액세스 권한을 계정에 부여합니다.

    Console

    1. Google Cloud Console에서 액세스하려는 이미지가 포함된 프로젝트의 IAM 페이지로 이동합니다.

      IAM 페이지로 이동

    2. 프로젝트 목록에서 프로젝트를 선택합니다.
    3. 추가 버튼을 클릭해 새 구성원을 추가합니다.
    4. 구성원 상자에 서비스 계정의 이메일 주소를 입력합니다.
    5. 역할 드롭다운 목록을 펼치고 Compute Engine > Compute 이미지 사용자(베타)를 선택합니다.
    6. 추가를 클릭하여 계정을 추가합니다.

    gcloud

    gcloud 명령줄 도구를 사용하여 이미지 또는 이미지 프로젝트의 Cloud IAM 정책에 바인딩을 추가합니다. 다음은 프로젝트 수준에서 바인딩을 추가하는 예시입니다.

    gcloud projects add-iam-policy-binding [PROJECT_ID] \
        --member serviceAccount:[SERVICE_ACCOUNT_EMAIL] --role roles/compute.imageUser

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

    • [PROJECT_ID]는 공유하려는 이미지가 포함된 프로젝트의 ID입니다.
    • [SERVICE_ACCOUNT_EMAIL]은 서비스 계정의 이메일입니다.

    예를 들면 다음과 같습니다.

    gcloud projects add-iam-policy-binding database-images \
        --member serviceAccount:123456789012@cloudservices.gserviceaccount.com  \
        --role roles/compute.imageUser

    API

    API에서 POST 요청을 다음 URL로 보냅니다. 여기서 [PROJECT_ID]는 공유하려는 이미지가 포함된 프로젝트의 ID입니다.

    POST https://cloudresourcemanager.googleapis.com/v1/projects/$[PROJECT_ID]:setIamPolicy
    

    프로젝트에 적용할 바인딩 목록이 요청 본문에 포함되어야 하며, roles/compute.imageUser 역할이 바인딩의 일부여야 합니다. 예를 들면 다음과 같습니다.

    {
       "policy": {
           "version": "0",
           "bindings": [
           {
               "role": "roles/owner",
               "members": [
                   "user:example@gmail.com"
               ]
           },
           {
               "role": "roles/compute.imageUser",
               "members": [
                   "serviceAccount:123456789012@cloudservices.gservbiceaccount.com"
               ]
           }
           ]
       }
    }
    

공유 이미지 및 스냅샷 사용 제한

이미지 및 스냅샷을 다른 사용자와 공유한 후에는 해당 사용자가 해당 리소스를 사용할 위치를 제어할 수 있습니다. constraints/compute.storageResourceUseRestrictions 제약조건을 설정하여 사용자가 스토리지 리소스를 사용할 수 있는 프로젝트를 정의합니다.

이러한 제약 조건을 설정하려면 조직 정책을 수정할 권한이 있어야 합니다. 예를 들어 resourcemanager.organizationAdmin 역할에 이러한 제약조건을 설정할 권한이 있습니다.

  1. 조직의 조직 ID를 확인합니다.

    gcloud organizations list
    
  2. 조직의 기존 정책 설정을 가져옵니다.

    gcloud beta resource-manager org-policies describe \
        compute.storageResourceUseRestrictions \
        --organization [ORGANIZATION_ID] > org-policy.yaml
    

    여기서 [ORGANIZATION_ID]는 조직 ID입니다.

  3. 텍스트 편집기에서 org-policy.yaml 파일을 열고 compute.storageResourceUseRestrictions 제약조건을 수정합니다. 필요한 제한사항을 추가하거나 더 이상 필요하지 않은 제한사항을 삭제합니다. 파일 수정이 끝나면 변경사항을 저장합니다. 예를 들어 정책 파일에서 설정할 수 있는 제약조건 항목은 다음과 같습니다.

    constraint: compute.storageResourceUseRestrictions
    listPolicy:
      allowedValues:
        - under:organization/[ORGANIZATION_ID]
    
  4. 조직에 policy.yaml 파일을 적용합니다.

    gcloud beta resource-manager org-policies set-policy
    --organization [ORGANIZATION_ID] org-policy.yaml
    

    여기서 [ORGANIZATION_ID]는 조직 ID입니다.

조직 정책에서 제약조건 구성을 완료한 후에는 이 제약조건을 테스트하여 제한사항이 원하는 대로 구현되는지 확인합니다.

다른 프로젝트의 이미지 사용

다른 사용자로부터 compute.imageUser 역할을 부여받은 경우 요청에 이미지 프로젝트를 지정하여 해당 프로젝트의 이미지에 액세스할 수 있습니다. 예를 들어 사용할 수 있는 이미지 목록을 가져오는 방법은 다음과 같습니다.

gcloud compute images list --project [IMAGE_PROJECT_ID]

이미지를 사용하여 인스턴스 등의 새 리소스를 만드는 방법은 인스턴스 만들기 및 시작을 참조하세요.

예를 들어 다음 명령어를 실행하면 database-images 프로젝트에 포함된 database-image-a라는 이름의 이미지를 사용하여 인스턴스가 생성됩니다.

gcloud compute instances create test-instance --image database-image-a --image-project database-images

마찬가지로 이미지를 사용하여 영구 디스크를 만들 수 있습니다. 이미지로 디스크를 만드는 방법은 독립형 루트 영구 디스크 만들기를 참조하세요.

다른 프로젝트의 스냅샷 사용

다른 사람으로부터 특정 프로젝트에 있는 스냅샷에 대한 compute.snapshots.useReadOnly 역할을 부여 받은 경우, 요청에 이 프로젝트 ID를 지정하여 해당 스냅샷에 액세스할 수 있습니다. 다른 사람으로부터 특정 프로젝트의 compute.storageAdmin 역할을 부여 받은 경우 요청에 이 프로젝트 ID를 지정하여 해당 프로젝트의 스냅샷에 액세스할 수 있습니다. 예를 들어 [SNAPSHOT_PROJECT_ID] 프로젝트에서 내가 사용할 수 있는 스냅샷 목록을 가져오려면 다음 안내를 따르세요.

gcloud compute snapshots list --project [SNAPSHOT_PROJECT_ID]

프로젝트 간 디스크 데이터를 이동하려면 다른 프로젝트의 사용자와 스냅샷을 공유합니다.

예를 들어 project-adisk-1 디스크 데이터를 project-b의 새 disk-2 디스크로 이동하려면 다음 단계를 수행합니다. 이 예시에서 disk-1us-west2-a 영역에 있고 instance-1us-west2-b 영역에 있습니다.

gcloud

  1. disk-1의 스냅샷을 만듭니다.

    gcloud --project project-a compute disks snapshot disk-1 --snapshot-names snapshot-1
    
  2. 이 스냅샷 기반의 새 디스크를 project-b에 만듭니다.

    gcloud --project project-b beta compute disks create disk-2 --source-snapshot projects/project-a/global/snapshots/snapshot-1
    
  3. 새 디스크를 project-binstance-1 인스턴스에 연결합니다. 디스크는 인스턴스와 동일한 영역에 있어야 합니다.

    gcloud --project project-b compute instances attach-disk instance-1 --disk disk-2
    
  4. 디스크를 마운트합니다. 영구 디스크 포맷 및 마운트의 5-7단계를 참조하세요.

API

  1. disks.createSnapshot 메서드에 대해 POST 요청을 수행하여 disk-1의 스냅샷을 만듭니다.

    POST https://compute.googleapis.com/compute/v1/projects/project-a/zones/us-west2-a/disks/disk-1/createSnapshot
    
    {
     "name": "snapshot-1"
    }
    
  2. 이 스냅샷 기반의 새 디스크 disk-2project-b에 만듭니다. disks.insert 메서드를 사용하여 영역 영구 디스크를 만들기 위한 POST 요청을 생성합니다.

    POST https://compute.googleapis.com/compute/v1/projects/project-b/zones/us-west2-b/disks
    
    {
     "name": "disk-2",
     "sizeGb": [DISK_SIZE],
     "type": "zones/us-west2-b/diskTypes/[DISK_TYPE]"
     "sourceSnapshot": "projects/project-a/global/snapshots/snapshot-1"
    }
    

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

    • [DISK_SIZE]는 새 디스크의 크기(GB)입니다.
    • [DISK_TYPE]은 영구 디스크의 유형입니다. pd-standard 또는 pd-ssd입니다.
  3. 새 디스크를 project-binstance-1 인스턴스에 연결합니다. 디스크는 인스턴스와 동일한 영역에 있어야 합니다. instances.attachDisk 메서드에 대한 POST 요청을 작성하고 방금 만든 영역 영구 디스크의 URL을 포함합니다.

    POST https://compute.googleapis.com/compute/v1/projects/project-b/zones/us-west2-b/instances/instance-1/attachDisk
    
    {
     "source": "/compute/v1/projects/project-b/zones/us-west2-b/disks/disk-2"
    }
    
  4. 디스크를 마운트합니다. 영구 디스크 포맷 및 마운트의 5-7단계를 참조하세요.

다음 단계