커스텀 이미지를 Cloud Storage로 내보내기

Compute Engine 부팅 디스크 데이터를 Compute Engine 프로젝트 외부로 이전해야 하는 경우 부팅 디스크 이미지를 tar.gz 파일로 Cloud Storage에 내보낼 수 있습니다. Compute Engine에서 새 영구 디스크를 만들 때 사용할 영구 디스크 이미지를 만들어야 하는 경우 커스텀 이미지 만들기를 참조하세요.

이미지를 Cloud Storage로 내보내서 커스텀 이미지를 백업 또는 공유할 수 있습니다. 이 방법은 개별 이미지를 이미지에 액세스할 수 없는 프로젝트와 공유하는 데 적합합니다. 또는 이미지나 이미지를 포함하는 프로젝트에서 Compute Engine 이미지 사용자 역할을 부여하면 이미지를 공유할 수 있습니다.

다음 다이어그램은 커스텀 이미지 만들기와 재사용에 대한 일반적인 몇 가지 워크플로를 보여줍니다.

커스텀 이미지 만들기 및 재사용
그림 1. 커스텀 이미지 만들기 및 재사용 예시

시작하기 전에

Cloud Build API 사용 설정

가상 어플라이언스 내보내기 도구는 Cloud Build를 사용합니다.

대부분의 경우 gcloud compute images export는 Cloud Build 서비스 계정에 이러한 권한을 부여하려고 시도합니다. 하지만 이러한 권한을 수동으로 부여하여 필수 권한이 적용되도록 할 수 있습니다.

Console

  1. Google Cloud Console에서 Cloud Build API를 사용 설정합니다.

    Cloud Build API 사용 설정

    Console에서 Cloud Build API를 사용 설정하면 Cloud Build 서비스가 인스턴스를 Compute Engine에서 내보낼 수 있도록 Compute Engine이 Cloud Build 서비스 계정에 다음 역할을 부여합니다.

    • roles/iam.serviceAccountTokenCreator
    • roles/compute.admin
    • roles/iam.serviceAccountUser

    또한 내보내기 도구는 기본 Compute Engine 서비스 계정을 사용합니다. 기본적으로 Compute Engine 서비스 계정에는 Cloud IAM 프로젝트 편집자 역할이 있습니다. 이 역할을 삭제하면 내보내기 프로세스가 실패할 수 있습니다. 서비스 계정에 역할을 다시 추가하려면 액세스 권한 부여를 참조하세요. Compute Engine 기본 서비스 계정에 대한 자세한 내용은 Compute Engine 기본 서비스 계정을 참조하세요.

gcloud

gcloud 명령줄 도구를 사용하여 Cloud Build 서비스를 설정하려면 다음 단계를 따르세요.

  1. gcloud 명령줄 도구를 사용하여 Cloud Build를 사용 설정합니다.

    gcloud services enable cloudbuild.googleapis.com

    또한 내보내기 도구는 기본 Compute Engine 서비스 계정을 사용합니다. 기본적으로 Compute Engine 서비스 계정에는 Cloud IAM 프로젝트 편집자 역할이 있습니다. 이 역할을 삭제하면 내보내기 프로세스가 실패할 수 있습니다. 서비스 계정에 역할을 다시 추가하려면 액세스 권한 부여를 참조하세요. Compute Engine 기본 서비스 계정에 대한 자세한 내용은 Compute Engine 기본 서비스 계정을 참조하세요.

  2. Cloud Build API의 서비스 계정에 compute.admin 역할을 추가합니다.

    gcloud projects add-iam-policy-binding project-id \
       --member serviceAccount:project-num@cloudbuild.gserviceaccount.com \
       --role roles/compute.admin
    
  3. Cloud Build API의 서비스 계정에 iam.serviceAccountUser 역할을 추가합니다.

    gcloud projects add-iam-policy-binding project-id \
       --member serviceAccount:project-num@cloudbuild.gserviceaccount.com \
       --role roles/iam.serviceAccountUser
    
  4. Cloud Build API의 서비스 계정에 iam.serviceAccountTokenCreator 역할을 추가합니다.

    gcloud projects add-iam-policy-binding project-id \
       --member serviceAccount:project-num@cloudbuild.gserviceaccount.com \
       --role roles/iam.serviceAccountTokenCreator
    

    다음을 바꿉니다.

단일 명령어로 이미지 내보내기

Console

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

    이미지 페이지로 이동

  2. 내보내려는 이미지의 이름을 클릭하여 이미지 세부정보 페이지로 이동합니다. Google에서 제공하는 공개 이미지는 내보낼 수 없습니다. 이전에 만들거나 가져온 이미지만 내보낼 수 있습니다.

  3. 이미지 세부정보 페이지에서 내보내기를 클릭하여 이미지 내보내기 페이지를 엽니다.

  4. 이미지 내보내기 페이지에서 이미지의 내보내기 형식을 선택합니다.

  5. 찾아보기를 클릭하여 이미지를 내보낼 Cloud Storage 위치를 선택합니다.

  6. 기존 Cloud Storage 위치를 선택하여 이미지를 내보냅니다. 또는 안내에 따라 새 Cloud Storage 버킷을 만들고 새 Cloud Storage 버킷의 이름을 입력합니다.

  7. Cloud Storage를 선택한 후 내보낸 이미지의 파일 이름을 선택합니다. 기본 파일 이름을 사용하거나 직접 파일 이름을 선택할 수 있습니다.

  8. Cloud Storage를 선택하고 이미지의 파일 이름을 입력한 후 선택을 클릭합니다.

  9. 이미지 내보내기 페이지에서 내보내기를 클릭합니다. 내보내기를 선택하면 Cloud Console에 이미지 내보내기 프로세스를 볼 수 있는 이미지 내보내기 기록이 표시됩니다. 이미지 내보내기 프로세스에 대한 자세한 내용을 보려면 Cloud Build ID를 클릭하여 이미지 내보내기 로그를 보고 다운로드할 수 있는 이미지 내보내기 세부정보 페이지로 이동합니다.

  10. Storage 페이지로 이동하여 내보낸 이미지에 액세스합니다.

    Storage 페이지로 이동

gcloud

이미지를 Cloud Storage로 내보내는 가장 좋은 방법은 gcloud compute images export 명령어를 사용하는 것입니다. 이 명령어는 Daisy를 사용하여 이미지를 내보내는 데 필요한 여러 단계를 연결합니다. 예를 들어 gcloud compute images create 명령어를 사용하여 이미 이미지를 만들었다고 가정합니다.

gcloud 명령줄 도구를 사용하여 다음을 실행합니다.

gcloud compute images export \
    --destination-uri destination-uri \
    --image image-name

다음을 바꿉니다.

  • destination-uri: 내보낸 가상 디스크 파일의 Cloud Storage URI 대상입니다.
  • image-name: 내보낼 디스크 이미지의 이름입니다.

예를 들어 다음 명령어는 my-image라는 이미지를 my-project에서 my-bucket이라는 Cloud Storage 버킷으로 내보냅니다. 기본적으로 이미지는 디스크 원시 파일로 내보내지고 tar.gz 파일 형식으로 압축됩니다.

gcloud compute images export \
    --destination-uri gs://my-bucket/my-image.tar.gz \
    --image my-image \
    --project my-project

사용할 수 있는 전체 플래그 목록은 gcloud compute images export 참조 문서를 확인하세요.

API

API에서 Cloud Build API에 대한 POST 요청을 작성합니다.

POST https://cloudbuild.googleapis.com/v1/projects/project-id/builds
{
  "timeout":"timeout",
  "steps":[
    {
      "args":[
        "-timeout=timeout",
        "-source_image=source-image",
        "-client_id=api",
        "-format=image-format",
        "-destination_uri=destination-uri"
      ],
      "name":"gcr.io/compute-image-tools/gce_vm_image_export:release",
      "env":[
        "BUILD_ID=$BUILD_ID"
      ]
    }
  ],
  "tags":[
    "gce-daisy",
    "gce-daisy-image-export"
  ]
}

다음을 바꿉니다.

  • project-id: 내보낼 이미지가 포함된 프로젝트의 ID입니다.
  • timeout: 빌드가 실패하여 TIMEOUT 메시지가 나타나기 전에 빌드가 지속되는 최대 시간입니다. API에서 시간을 초 단위로 지정해야 합니다. 7200s의 제한 시간 값은 대부분의 상황에 적합합니다.
  • source-image: 내보낼 이미지의 이름입니다.
  • image-format: 내보내는 이미지의 형식입니다. 유효한 형식에는 vmdk, vhdx, vpc, vdi, qcow2가 있습니다.
  • destination-uri: 가상 디스크 파일을 내보낼 Cloud Storage URI 위치입니다. 예를 들면 gs://my-bucket/my-exported-image.vmdk입니다.

제공할 수 있는 추가 args 값은 VM 이미지 내보내기 GitHub 페이지의 선택적 플래그 섹션을 참조하세요.

응답 예시

다음은 반환되는 출력과 비슷한 샘플 응답입니다.

{
"name": "operations/build/myproject-12345/operation-1578608233418",
"metadata": {
 "@type": "type.googleapis.com/google.devtools.cloudbuild.v1.BuildOperationMetadata",
 "build": {
  "id": "3a2055bc-ccbd-4101-9434-d376b88b8940",
  "status": "QUEUED",
  "createTime": "2019-10-02T18:59:13.393492020Z",
  "steps": [
   {
    "name": "gcr.io/compute-image-tools/gce_vm_image_export:release",
    "env": [
     "BUILD_ID=3a2055bc-ccbd-4101-9434-d376b88b8940"
    ],
    "args": [
     "-timeout=7056s",
     "-source_image=my-image",
     "-client_id=api",
     "-format=vmdk",
     "-destination_uri=gs://my-bucket/my-exported-image.vmdk"
    ]
   }
  ],
  "timeout": "7200s",
  "projectId": "myproject-12345",
  "logsBucket": "gs://123456.cloudbuild-logs.googleusercontent.com",
  "options": {
   "logging": "LEGACY"
  },
  "logUrl": "https://console.cloud.google.com/gcr/builds/3a2055bc-ccbd-4101-9434-d376b88b8940?project=123456"
 }
 }

빌드를 모니터링하는 몇 가지 방법은 다음과 같습니다.

  • 반환된 build-id를 사용하여 projects.builds.get 요청을 실행합니다.
  • 제공된 logUrl에 호스팅된 로그를 검토합니다.

수동으로 이미지 만들기 및 내보내기

gcloud compute images create 명령어와 gcloud compute images export 명령어가 요구사항을 충족하지 못하면 Compute Engine 인스턴스에서 수동으로 이미지를 만들고 내보낼 수 있습니다. 이 프로세스에는 먼저 이미지를 만든 후 내보내는 별도의 단계가 있습니다.

다음 예시에서는 생성된 디스크를 image-disk라고 부릅니다.

이미지를 만들고 내보내려면 다음 안내를 따르세요.

  1. 원하는 경우 스냅샷을 만들기 전에 디스크가 연결된 인스턴스를 중지합니다. 인스턴스를 중지하면 스냅샷 내 디스크 내용의 무결성이 보장됩니다. disk-name을 스냅샷을 만드는 데 사용할 디스크의 이름으로 바꿉니다.

  2. 디스크의 스냅샷을 만듭니다. 스냅샷 이름을 image-snapshot으로 지정합니다.

    gcloud compute disks snapshot disk-name \
        --snapshot-names image-snapshot
  3. 다음 명령어를 실행하여 image-snapshot 스냅샷으로 image-disk라는 새 디스크를 만듭니다.

    gcloud compute disks create image-disk \
        --source-snapshot image-snapshot
  4. tar 파일을 저장할 temporary-disk라는 임시 디스크를 만들고 디스크의 size를 이미지 디스크보다 최소 50% 이상 크게 지정합니다.

    나중에 디스크를 분리하고 삭제할 수 있습니다.

    gcloud compute disks create temporary-disk \
        --size size

    여기서 size는 임시 디스크의 크기(GB 또는 TB)입니다. 예를 들어 100GB를 지정하면 100GB 디스크가 생성됩니다.

  5. 인스턴스를 만들고 인스턴스에서 storage-rw 범위를 사용 설정합니다. 또한 image-disktemporary-disk를 특정 device-name 속성이 있는 보조 디스크로 인스턴스에 연결합니다. instance-name을 만들 인스턴스의 이름으로 바꿉니다.

    gcloud compute instances create instance-name \
        --scopes storage-rw \
        --disk name=image-disk,device-name=image-disk \
        --disk name=temporary-disk,device-name=temporary-disk

    이후 단계에서 Cloud Storage에 파일을 업로드할 수 있도록 서비스 계정 범위를 전달합니다.

    필요한 경우 새 인스턴스 시작의 세부정보를 확인합니다.

  6. 인스턴스에 연결합니다. instance-name을 연결할 인스턴스의 이름으로 바꿉니다.

    gcloud compute ssh instance-name
  7. 임시 디스크를 포맷하고 마운트합니다. 디스크를 포맷하면 임시 디스크의 내용이 삭제됩니다.

    sudo mkdir /mnt/tmp
    sudo mkfs.ext4 -F /dev/disk/by-id/google-temporary-disk
    sudo mount -o discard,defaults /dev/disk/by-id/google-temporary-disk /mnt/tmp
  8. 원하는 경우 tar 파일을 만들기 전에 이미지 디스크를 마운트하고 추가 변경사항을 적용할 수 있습니다. 예를 들어 기존 파일을 이미지에 포함하지 않으려면 /home 디렉터리에서 삭제하면 됩니다. 수정할 디스크 파티션을 마운트한 다음 변경해야 하는 디스크의 파일을 수정하고 작업이 끝나면 마운트를 해제하세요.

    1. 디스크나 파티션을 마운트할 수 있는 디렉터리를 만듭니다.

      sudo mkdir /mnt/image-disk
    2. ls 명령어를 사용하여 마운트해야 하는 디스크나 디스크 파티션을 결정합니다.

      ls /dev/disk/by-id/

      명령어는 디스크 ID와 파티션 목록을 출력합니다. 예를 들어 다음 디스크에는 파티션이 하나인 파티션 테이블이 있습니다. google-image-disk ID는 이미지를 만들려는 디스크 전체를 가리킵니다. google-image-disk-part1 ID는 이 디스크의 첫 번째 파티션을 가리킵니다. 디스크에 변경사항을 적용해야 하는 경우 파티션을 마운트한 후 전체 디스크에서 이미지를 만듭니다.

      google-image-disk
      google-image-disk-part1
      
    3. 디스크나 파티션을 마운트합니다. 디스크에 파티션 테이블이 있으면 개별 파티션을 디스크에 마운트합니다. 예를 들면 google-image-disk-part1을 마운트합니다.

      sudo mount /dev/disk/by-id/google-image-disk-part1 /mnt/image-disk

      또는 디스크가 파티션 테이블이 없는 원시 형식이라면 전체 google-image-disk 디스크를 마운트합니다.

      sudo mount /dev/disk/by-id/google-image-disk /mnt/image-disk
    4. /mnt/image-disk 디렉터리의 파일을 수정하여 디스크의 파일을 구성합니다. 예를 들어 SSH 키가 공유되지 않도록 /mnt/image-disk/home/[USER]/.ssh/authorized_keys 파일을 삭제할 수도 있습니다.

    5. 파일 수정이 완료되면 디스크를 마운트 해제합니다.

      sudo umount /mnt/image-disk/
  9. 이미지의 tar 파일을 만듭니다.

    이미지 디스크에서 파일의 맞춤설정이 끝나면 임시 디스크에서 원시 디스크 파일을 생성하세요. 원시 디스크 이미지의 이름은 'disk.raw'여야 합니다.

     sudo dd if=/dev/disk/by-id/google-image-disk of=/mnt/tmp/disk.raw bs=4096

    그런 다음 이 파일을 tar와 gzip으로 변환합니다.

    cd /mnt/tmp

    sudo tar czvf myimage.tar.gz disk.raw

    이 명령어는 다음 위치에서 인스턴스의 이미지를 만듭니다.

    /mnt/tmp/myimage.tar.gz

  10. Cloud Storage에 이미지를 업로드합니다.

    Cloud Storage에 tar 파일을 업로드하려면 인스턴스에 사전 설치된 gsutil 명령줄 도구를 사용합니다.

    1. gsutil을 사용하여 버킷을 만듭니다.

      버킷을 만들기 전에 버킷 및 객체 이름 지정 가이드라인을 검토하세요. 검토 후 다음 명령어를 사용하여 버킷을 만듭니다. bucket-name을 만들 버킷의 이름으로 바꿉니다.

      me@example-instance:~$ 
      gsutil mb gs://bucket-name
    2. 파일을 새 버킷에 복사합니다. bucket-name을 파일을 복사할 버킷의 이름으로 바꿉니다.

      me@example-instance:~$ 
      gsutil cp /mnt/tmp/myimage.tar.gz gs://bucket-name

파일을 Cloud Storage로 내보냈습니다. 이제 이미지를 다른 사람과 공유하거나 tar 파일을 사용하여 새 이미지를 Google Cloud Console 프로젝트에 추가할 수 있습니다.

다음 단계