イメージとスナップショットの共有

プロジェクトまたは組織に属していないユーザーとも、イメージとスナップショットを共有できます。イメージやスナップショットの読み取りアクセス権を持つユーザーは、これらのリソースを使用して、他のプロジェクトや組織で操作を完了できます。たとえば、プロジェクト内のイメージやスナップショットの読み取りアクセス権をユーザーに付与すると、そのユーザーはそれらのリソースを使用して自分のプロジェクト内で永続ディスクを作成できます。イメージやスナップショットの読み取りアクセス権を共有するには、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. アクセス権を付与するアカウントのメールアドレスを 1 つ以上指定します。
    3. メンバーに 1 つ以上の役割を付与します。
      • イメージ: 役割セレクタから [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 を指定します。

例えば、次のように roles/compute.imageUser 役割を john@example.com に付与すると、database-images という名前のプロジェクトのイメージにアクセスできます。

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

API

API では、以下の URL に対して POST リクエストを作成します。ここで [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 Platform 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 では、以下の URL に対して POST リクエストを作成します。ここで [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-a のディスク disk-1 のデータを project-b の新しいディスク disk-2 に移動するには、次の手順を行います。この例では、disk-1 は、ゾーン us-west2-a にあり、instance-1 はゾーン us-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-b のインスタンス instance-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. スナップショットに基づく project-b に新しいディスク disk-2 を作成します。POST リクエストを作成して、disks.insert メソッドを使用しているゾーン永続ディスクを作成します。

    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-b のインスタンス instance-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 をご覧ください。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...

Compute Engine ドキュメント