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 を有効にすると、Compute Engine は Cloud Build サービス アカウントに次の役割を付与し、Cloud Build サービスが Compute Engine からインスタンスをエクスポートできるようにします。

    • 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
    

    以下を置き換えます。

1 つのコマンドでのイメージのエクスポート

イメージを 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 バケットにエクスポートされます。デフォルトでは、イメージは disk.raw ファイルとしてエクスポートされ、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 リファレンス ドキュメントをご覧ください。

手動でのイメージの作成およびエクスポート

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 は一時ディスクのサイズ(ギガバイト単位またはテラバイト単位)です。たとえば、100 GB のディスクを作成するには 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

    後の手順で Google 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 とパーティションのリストが出力されます。たとえば、次のディスクには 1 つのパーティションがあるパーティション テーブルがあります。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 ディレクトリ内のファイルを変更し、ディスク上のファイルを構成します。たとえば、/mnt/image-disk/home/[USER]/.ssh/authorized_keys ファイルを削除して、SSH 認証鍵が共有されないよう保護できます。

    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 にアップロードします。

    tar ファイルを Cloud Storage にアップロードするには、インスタンスにプリインストールされている 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 プロジェクトに新規イメージを追加したりできます。

次のステップ