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

プロジェクトまたは組織に属していないユーザーとでも、イメージとスナップショットを共有できます。イメージやスナップショットの読み取りアクセス権を持つユーザーは、これらのリソースを使用して、他のプロジェクトや組織で操作を完了できます。たとえば、プロジェクト内のイメージやスナップショットの読み取りアクセス権をユーザーに付与すると、そのユーザーはそれらのリソースを使用して自分のプロジェクト内で永続ディスクを作成できます。イメージやスナップショットの読み取りアクセス権を共有するには、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 役割を他のチームメンバーに付与し、チームメンバーがそれぞれ自分のプロジェクトでこれらのイメージを使用できるようにします。

イメージ共有の役割を付与するには、Console、gcloud コマンドライン ツール、または API を使用します。IAM を使用する方法については、IAM のドキュメントをご覧ください。

Console

  1. GCP 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 を呼び出し、異常なインスタンスの再作成、インスタンスの更新など、そのグループに関連するアクションを実行します。別のプロジェクトのイメージを使用してマネージド インスタンスを作成する場合は、compute.imageUser の役割を、マネージド インスタンス グループを作成するプロジェクトに属している API サービス アカウントに付与できます。

たとえば、プロジェクト A が、プロジェクト B が所有しているイメージを使用してマネージド インスタンス グループを作成するとします。その場合、プロジェクト B のオーナーがプロジェクト A の Google API サービス アカウントに、プロジェクト B の compute.imageUser の役割を付与する必要があります。これにより、プロジェクト B のイメージを使用してプロジェクト A にマネージド インスタンス グループを作成する権限がアカウントに付与されます。

compute.imageUser の役割を付与した後は、グループのインスタンス テンプレートを作成するときに、特定のイメージの URL を指定できます。

サービス アカウントのメールを取得し、そのアカウントにアクセス権限を付与する手順は次のとおりです。

  1. マネージド インスタンス グループを作成するプロジェクトの GCP 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]

インスタンスの作成など、新しいリソースの作成にイメージを使用する方法については、インスタンスの作成と起動をご覧ください。

たとえば、次のコマンドでは、プロジェクト database-imagesdatabase-image-a というイメージを使用してインスタンスを作成します。

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

同様に、イメージを使用して永続ディスクを作成できます。イメージからのディスクの作成の詳細については、スタンドアロンのルート永続ディスクを作成するをお読みください。

次のステップ

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

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

Compute Engine ドキュメント