カスタム イメージへのアクセスの管理

ユーザーがカスタム イメージを作成、削除、使用、共有できるようにするには、ユーザーに Identity and Access Management(IAM)の適切なロールを付与する必要があります。IAM を使用して次の作業を行います。

Compute Engine リソースへのアクセス権限の付与に関する一般情報については、Compute Engine リソースへのアクセスの管理をご覧ください。IAM については、IAM のドキュメントをご覧ください。

始める前に

制限事項

イメージに対する allUsers ロールをユーザーに付与することはできません。

カスタム イメージを作成する権限を付与する

ユーザーに、組織またはプロジェクトでのカスタム イメージの作成を可能にする権限を付与できます。

Compute Engine には、事前定義されたストレージ管理者ロールが用意されています。このロールが割り当てられたユーザーは、イメージ、ディスク、スナップショットを含むストレージ関連のリソースを作成、削除、管理できます。イメージの作成のみを許可するロールが必要な場合は、カスタムロールを作成する必要があります。作成するカスタムロールに、必要に応じて次の権限を含めます。

  • 新しいイメージの作成を許可する compute.images.create
  • プロジェクト内のイメージの一覧表示を許可する compute.images.list
  • compute.disks.use(ディスクからイメージを作成する場合)
  • compute.disks.list(プロジェクト内のディスクのリストを表示する権限を付与する場合)

ユーザーに組織でカスタム イメージを作成する権限を付与した場合、そのユーザーは組織内の任意のプロジェクトのカスタム イメージを作成できます。

Console

  1. Google Cloud Console で、プロジェクトまたは組織の [IAM と管理] ページに移動します。

    [IAM と管理] ページに移動

  2. [追加] ボタンをクリックして新しいメンバーを追加します。

  3. [新しいメンバー] フィールドに、アクセスを付与する ID のメールアドレスを入力します。

  4. [ロールを選択] リストで、[Compute Engine] > [Compute ストレージ管理者] を選択します。カスタムロールを作成した場合は、そのロールを選択します。

  5. 変更を保存します。

gcloud

組織レベルで roles/compute.storageAdmin ロールを付与するには:

gcloud organizations add-iam-policy-binding organization-id \
    --member='member' \
    --role='roles/compute.storageAdmin'

プロジェクト レベルで roles/compute.storageAdmin ロールを付与するには:

gcloud projects add-iam-policy-binding project-id \
    --member='member' \
    --role='roles/compute.storageAdmin'

以下を置き換えます。

  • organization-id または project-id: 組織 ID またはプロジェクト ID。たとえば、my-organization-1my-project-1 です。
  • member: ロールを付与する有効な ID。形式は user|group|serviceAccount:email または domain:domain にする必要があります。例:
    • user:test-user@gmail.com
    • group:admins@example.com
    • serviceAccount:test123@example.domain.com
    • domain:example.domain.com

API

API を使用して IAM ポリシーを直接変更するには、次の手順に従います。

  1. getIamPolicy メソッドを使用して既存のポリシーを読み取ります。プロジェクトの場合は、次の URL を使用します。project-id の部分は、プロジェクト ID で置き換えます。例: my-project-1

    POST https://cloudresourcemanager.googleapis.com/v1/projects/project-id:getIamPolicy

    組織の場合は、次の URL を使用します。organization-id の部分は、12 桁の数値の組織 ID で置き換えます。例: 123456578920

    POST https://cloudresourcemanager.googleapis.com/v1/organizations/organization-id:getIamPolicy

    Compute Engine からレスポンスとして現在のポリシーが返されます。

  2. テキスト エディタでポリシーを編集して、メンバーおよび関連するロールを追加または削除します。たとえば、roles/compute.storageAdmin ロールを email@example.com に付与するには、次の新しいバインディングをポリシーに追加します。

    {
      "members": [
        "group:admins@example.com"
      ],
      "role":"roles/compute.storageAdmin"
    }
    
  3. setIamPolicy() を使用して、更新したポリシーを書き込みます。

    POST https://cloudresourcemanager.googleapis.com/v1/projects/project-id:setIamPolicy

    project-id の部分は、プロジェクト ID で置き換えます。リクエストの本文で、前のステップで更新した IAM ポリシーを指定します。

カスタム イメージを削除する権限を付与する

必要に応じて、次の権限をユーザーに付与できます。

  • 特定のイメージを削除する
  • 特定のプロジェクトが所有するイメージを削除する
  • 組織内の任意のプロジェクトからイメージを削除する

プロジェクト レベルで権限を付与すると、ユーザーはそのプロジェクトが所有するすべてのイメージを削除できます。組織レベルで権限を付与すると、プロジェクトに関係なく、ユーザーは組織が所有する任意のイメージを削除できます。

Compute Engine には、事前定義されたストレージ管理者ロールが用意されています。このロールが割り当てられたユーザーは、イメージ、ディスク、スナップショットを含むストレージ関連のリソースを作成、削除、管理できます。イメージの削除のみを許可するロールが必要な場合は、カスタムロールを作成する必要があります。作成するカスタムロールに、必要に応じて次の権限を含めます。

  • イメージの削除を許可する compute.images.delete
  • 必要に応じてプロジェクトまたは組織内のイメージの一覧表示を許可する compute.images.list
  • イメージの取得を許可する compute.images.get

Console

特定のイメージを削除する権限を付与するには:

  1. Google Cloud Console で、[イメージ] ページに移動します。

    [イメージ] ページに移動

  2. 権限を付与する対象のイメージを選択します。

  3. 右側の [権限] パネルで、[メンバーを追加] をクリックします。

  4. イメージを共有する ID のメールアドレスを入力します。形式は user|group|serviceAccount:email または domain:domain にする必要があります。例:

    • user:test-user@gmail.com
    • group:admins@example.com
    • serviceAccount:test123@example.domain.com
    • domain:example.domain.com
  5. [ロール] リストで [Compute Engine] をポイントし、[Compute ストレージ管理者] を選択します。または、[カスタム] リストからカスタムロールを選択します。

  6. 変更を保存します。

プロジェクトまたは組織のイメージを削除する権限を付与するには:

  1. プロジェクトまたは組織の [IAM と管理] ページに移動します。

    [IAM と管理] ページに移動

  2. ページ上部にある [追加] ボタンをクリックします。

  3. [新しいメンバー] フィールドに、アクセスを付与する ID のメールアドレスを入力します。形式は user|group|serviceAccount:email または domain:domain にする必要があります。例:

    • user:test-user@gmail.com
    • group:admins@example.com
    • serviceAccount:test123@example.domain.com
    • domain:example.domain.com
  4. [ロール] リストで [Compute Engine] をポイントし、[Compute ストレージ管理者] を選択します。または、[カスタム] リストからカスタムロールを選択します。

  5. 変更を保存します。

gcloud

組織レベルでイメージを削除する権限をユーザーに付与するには:

gcloud organizations add-iam-policy-binding organization-id \
    --member='member' \
    --role='role'

プロジェクト レベルでイメージを削除する権限を付与するには:

gcloud projects add-iam-policy-binding project-id \
    --member='member' \
    --role='role'

特定のイメージを削除する権限を付与するには:

gcloud images add-iam-policy-binding image-name \
    --member='member' \
    --role='role'

以下を置き換えます。

  • organization-idproject-id、または image-name: 12 桁の数値の組織 ID、プロジェクト ID、またはイメージ名。たとえば、123456578920my-project-1my-custom-image です。
  • member: ロールを付与する有効な ID。形式は user|group|serviceAccount:email または domain:domain にする必要があります。例:
    • user:test-user@gmail.com
    • group:admins@example.com
    • serviceAccount:test123@example.domain.com
    • domain:example.domain.com
  • role: この ID に割り当てるロール。たとえば、roles/compute.storageAdmin、または roles/customImageDeletionRole などのカスタムロール。

API

API を使用してイメージを削除する権限を付与するには:

  1. リソースのそれぞれの getIamPolicy メソッドを使用して、既存のポリシーを読み取ります。プロジェクトの場合は、次の URL を使用します。

    POST https://cloudresourcemanager.googleapis.com/v1/projects/project-id:getIamPolicy

    project-id の部分は、プロジェクト ID で置き換えます。

    組織の場合は、次の URL を使用します。

    POST https://cloudresourcemanager.googleapis.com/v1/organizations/organization-id:getIamPolicy

    organization-id の部分は、12 桁の数値の組織 ID で置き換えます。

    特定のイメージの場合は、次の URL を使用します。

    POST https://compute.googleapis.com/compute/v1/projects/project-id/global/images/image-name:getIamPolicy

    project-id の部分はプロジェクト ID で置き換え、image-name の部分はイメージ名で置き換えます。

    Compute Engine からレスポンスとして現在のポリシーが返されます。

  2. テキスト エディタでポリシーを編集して、メンバーおよび関連するロールを追加または削除します。たとえば、roles/compute.storageAdmin ロールを email@example.com に付与するには、次の新しいバインディングをポリシーに追加します。

    {
      "members": [
        "user:email@example.com"
      ],
      "role":"roles/compute.storageAdmin"
    }
    
  3. setIamPolicy() を使用して、更新したポリシーを書き込みます。例:

    POST https://cloudresourcemanager.googleapis.com/v1/projects/project-id:setIamPolicy

    project-id の部分は、プロジェクト ID で置き換えます。リクエストの本文で、前のステップで更新した IAM ポリシーを指定します。

組織内でカスタム イメージを共有する

プロジェクトが組織に属している場合、その組織に他にもプロジェクトがあり、プロジェクトごとに異なるアクセスレベルが設定されている場合があります。カスタム イメージを作成すると、組織内の他のプロジェクトの他のユーザーとイメージを共有できます。

イメージを管理するには、Compute Engine で事前定義している次の IAM のロールを使用できます。

  • roles/compute.imageUser: リクエストで、イメージに対する他の権限がなくても、イメージを一覧表示し、読み取り、使用する権限。
  • roles/compute.storageAdmin: ディスク、イメージ、スナップショットを作成、変更、削除する権限。

または、独自のカスタム IAM ロールを作成することもできます。

ベスト プラクティスとして、Google ではカスタム イメージをホストすることに特化した 1 つのプロジェクトですべてのカスタム イメージを保持することをおすすめしています。これにより、イメージを管理しやすくなるとともに、特定のチームにそのチームに必要なイメージのみへのアクセス権限を付与できます。チームにイメージ プロジェクト全体へのアクセス権限を付与することもできますが、イメージ プロジェクト全体へのチームアクセスは最小権限の原則に反するため、この方法はおすすめしません。

次の例は、グループを追加して、そのグループのユーザーがイメージにアクセスできるようにする方法を示しています。

Console

  1. Google Cloud Console で、[イメージ] ページに移動します。

    [イメージ] ページに移動

  2. 他のユーザーと共有するイメージを選択します。

  3. 右側の [権限] パネルで、[メンバーを追加] をクリックします。

  4. イメージを共有する ID のメールアドレスを入力します。形式は user|group|serviceAccount:email または domain:domain にする必要があります。例:

    • user:test-user@gmail.com
    • group:admins@example.com
    • serviceAccount:test123@example.domain.com
    • domain:example.domain.com
  5. [ロール] リストで [Compute Engine] をポイントし、[イメージ ユーザー] または [ストレージ管理者] を選択します。あるいは、カスタムロールを選択することもできます。

  6. 変更を保存します。

ユーザーが Cloud Console で共有カスタム イメージを起動できるようにするには、そのユーザーをプロジェクト閲覧者としてイメージ プロジェクトに追加する必要もあります。これにより、イメージ選択リストに共有イメージが表示されるようになります。

  1. Google Cloud Console で、[IAM と管理] ページに移動します。

    [IAM と管理] ページに移動

  2. ページ上部にある [追加] ボタンをクリックします。

  3. [新しいメンバー] フィールドに、イメージを共有する ID のメールアドレスを入力します。

  4. [ロール] リストで [プロジェクト] をポイントし、[閲覧者] を選択します。

  5. 変更を保存します。

gcloud

gcloud コマンドライン ツールを使用して、特定のイメージの IAM ポリシーを更新します。

gcloud compute images add-iam-policy-binding image-name \
    --member='member' \
    --role='role'

以下を置き換えます。

  • image-name: イメージの名前。例: custom-centos-8
  • member: ロールを付与する有効な ID。形式は user|group|serviceAccount:email または domain:domain にする必要があります。例:
    • user:test-user@gmail.com
    • group:admins@example.com
    • serviceAccount:test123@example.domain.com
    • domain:example.domain.com
  • role は、この ID に割り当てるロールです。たとえば、roles/compute.imageUserroles/compute.storageAdmin、またはカスタムロールです。

(省略可能)ユーザーをプロジェクト閲覧者としてイメージ プロジェクトに追加し、images.list リクエストでこれらの共有イメージがユーザーに表示されるようにします。ユーザーが共有イメージのリストを表示できるようにする必要がない場合は、この手順を省略できます。

gcloud compute projects add-iam-policy-binding project-id \
    --member='member' \
    --role='roles/viewer'

API

API を使用して IAM ポリシーを直接変更するには、次の手順に従います。

  1. リソースのそれぞれの getIamPolicy メソッドを使用して、既存のポリシーを読み取ります。

    POST https://compute.googleapis.com/compute/v1/projects/project-id/global/images/image-name:getIamPolicy

    以下を置き換えます。

    • project-id: このイメージが属するプロジェクトのプロジェクト ID。
    • image-name: イメージの名前。

    Compute Engine からレスポンスとして現在のポリシーが返されます。

  2. テキスト エディタでポリシーを編集して、ユーザーおよび関連するロールを追加または削除します。user|group|serviceAccount:email または domain:domain の形式でユーザーを追加します。例: user:test-user@gmail.comgroup:admins@example.comserviceAccount:test123@example.domain.com、または domain:example.domain.com。たとえば、roles/compute.imageUser ロールを email@example.com に付与するには、次のコードを追加します。

    {
      "members": [
        "user:email@example.com"
      ],
      "role":"roles/compute.imageUser"
    }
    
  3. setIamPolicy() を使用して、更新したポリシーを書き込みます。

    POST https://compute.googleapis.com/compute/v1/projects/project-id/global/images/image-name:setIamPolicy

    以下を置き換えます。

    • project-id: このイメージが属するプロジェクトのプロジェクト ID。
    • image-name: イメージの名前。

    リクエストの本文で、前のステップで更新した IAM ポリシーを指定します。

(省略可能)ユーザーをプロジェクト閲覧者としてイメージ プロジェクトに追加し、images.list リクエストでこれらの共有イメージがユーザーに表示されるようにします。ユーザーが共有イメージのリストを表示できるようにする必要がない場合は、この手順を省略できます。

POST https://cloudresourcemanager.googleapis.com/v1/projects/project-id:setIamPolicy

組織間でカスタム イメージを共有する

カスタム イメージのカタログを作成すると、組織外部のパートナー、ユーザー、請負業者とイメージを共有するのに役立ちます。組織外部のユーザーとイメージを共有するには、次の手順に従って組織外部のユーザーをイメージ ユーザーとしてプロジェクトに追加します。

Console

  1. Google Cloud Console で、[イメージ] ページに移動します。

    [イメージ] ページに移動

  2. 他のユーザーと共有するイメージを選択します。

  3. 右側の [権限] パネルで、[メンバーを追加] をクリックします。

  4. イメージを共有するグループのメールアドレスを入力します。例: group:admins@example.com

  5. [ロール] リストで [Compute Engine] をポイントし、[イメージ ユーザー] を選択します。

  6. 変更を保存します。

ユーザーが Cloud Console で共有カスタム イメージを起動できるようにするには、そのユーザーをプロジェクト閲覧者としてイメージ プロジェクトに追加する必要もあります。これにより、イメージ選択リストに共有イメージが表示されるようになります。

  1. Google Cloud Console で、[IAM と管理] ページに移動します。

    [IAM と管理] ページに移動

  2. ページ上部にある [追加] ボタンをクリックします。

  3. [新しいメンバー] フィールドに、イメージを共有する ID のメールアドレスを入力します。

  4. [ロール] リストで [プロジェクト] をポイントし、[閲覧者] を選択します。

  5. 変更を保存します。

gcloud

gcloud コマンドライン ツールを使用して、次のコマンドを実行します。

gcloud compute images add-iam-policy-binding image-name \
    --member='member' \
    --role='roles/compute.imageUser'

以下を置き換えます。

  • image-name: イメージの名前。例: custom-centos-8
  • member: ロールを付与する有効な ID。例: group:admins@example.com

(省略可能)ユーザーをプロジェクト閲覧者としてイメージ プロジェクトに追加し、images.list リクエストでこれらの共有イメージがユーザーに表示されるようにします。ユーザーが共有イメージのリストを表示できるようにする必要がない場合は、この手順を省略できます。

gcloud compute projects add-iam-policy-binding project-id \
    --member='member' \
    --role='roles/viewer'

API

API を使用してイメージの IAM ポリシーを直接変更するには:

  1. リソースのそれぞれの getIamPolicy メソッドを使用して、既存のポリシーを読み取ります。

    POST https://compute.googleapis.com/compute/v1/projects/project-id/global/images/image-name:getIamPolicy

    以下を置き換えます。

    • project-id: このイメージが属するプロジェクトのプロジェクト ID。
    • image-name: イメージの名前。

    Compute Engine からレスポンスとして現在のポリシーが返されます。

  2. テキスト エディタでポリシーを編集して、ユーザーおよび関連するロールを追加または削除します。user|group|serviceAccount:email または domain:domain の形式でユーザーを追加します。例: user:test-user@gmail.comgroup:admins@example.comserviceAccount:test123@example.domain.com、または domain:example.domain.com。たとえば、roles/compute.imageUser ロールを email@example.com に付与するには、次のコードを追加します。

    {
      "members": [
        "user:email@example.com"
      ],
      "role":"roles/compute.imageUser"
    }
    
  3. setIamPolicy() を使用して、更新したポリシーを書き込みます。

    POST https://compute.googleapis.com/compute/v1/projects/project-id/global/images/image-name:setIamPolicy

    以下を置き換えます。

    • project-id: このイメージが属するプロジェクトのプロジェクト ID。
    • image-name: イメージの名前。

    リクエストの本文で、前のステップで更新した IAM ポリシーを指定します。

    (省略可能)ユーザーをプロジェクト閲覧者としてイメージ プロジェクトに追加し、images.list リクエストでこれらの共有イメージがユーザーに表示されるようにします。ユーザーが共有イメージのリストを表示できるようにする必要がない場合は、この手順を省略できます。

    POST https://cloudresourcemanager.googleapis.com/v1/projects/project-id:setIamPolicy

カスタム イメージを一般公開する

組織またはプロジェクトに属しているユーザーであるかどうかに関係なく、すべての認証済み Compute Engine ユーザーとカスタム イメージを共有できます。

すべての認証済みユーザーと共有できるのは、イメージなどの共有リソースのみです。プロジェクトまたは組織をすべての認証済みユーザーと共有することはできません。この制限事項(およびリソース階層)は、組織が誤ってプロジェクト全体を認証済み Compute Engine ユーザーと共有しないようにするためのものです。

次の例は、すべての認証済み Compute Engine ユーザーに、カスタム イメージに対する roles/compute.imageUser ロールを付与する方法を示しています。

gcloud

次のコマンドで、image-name の部分をリソースの名前(たとえば、my_image)で置き換えます。

gcloud compute images add-iam-policy-binding image-name \
    --member='allAuthenticatedUsers' \
    --role='roles/compute.imageUser'

API

API を使用して IAM ポリシーを直接変更するには、次の手順に従います。

  1. getIamPolicy メソッドを使用して既存のポリシーを読み取ります。例:

    POST https://compute.googleapis.com/compute/v1/projects/project-id/global/images/image-name:getIamPolicy

    以下を置き換えます。

    • project-id: このイメージが属するプロジェクトのプロジェクト ID。
    • image-name: イメージの名前。

    Compute Engine からレスポンスとして現在のポリシーが返されます。

  2. テキスト エディタでポリシーを編集して、メンバーおよび関連するロールを追加または削除します。

    {
      "members": [
        "allAuthenticatedUsers"
      ],
      "role":"roles/compute.imageUser"
    }
    
  3. setIamPolicy() を使用して、更新したポリシーを書き込みます。

    POST https://compute.googleapis.com/compute/v1/projects/project-id/global/images/image-name:setIamPolicy

    以下を置き換えます。

    • project-id: このイメージが属するプロジェクトのプロジェクト ID。
    • image-name: イメージの名前。

    リクエストの本文で、前のステップで更新した IAM ポリシーを指定します。

マネージド インスタンス グループにイメージへのアクセス権限を付与する

Compute Engine を使用して、マネージドまたは非マネージドのインスタンス グループを作成できます。マネージド インスタンス グループを作成した場合、Compute Engine は Google API サービス アカウントを使用して Compute Engine API を呼び出して、そのグループに関連するアクション(異常なインスタンスの再作成、インスタンスの更新など)を実行します。

他のプロジェクトのイメージを使用してマネージド インスタンス グループを作成する場合は、マネージド インスタンス グループを作成するプロジェクトに属する API サービス アカウントに roles/compute.imageUser ロールを付与します。例:

  1. プロジェクト A で、プロジェクト B が所有するイメージを使用してマネージド インスタンス グループを作成するとします。
  2. プロジェクト B がプロジェクト A のサービス アカウントに roles/compute.imageUser ロールを付与します。
  3. これにより、プロジェクト A でプロジェクト B のイメージを使用してマネージド インスタンス グループを作成できます。

roles/compute.imageUser ロールを付与した後、マネージド グループの インスタンス テンプレートを作成する際は、Console またはイメージの URL を使用して、他のプロジェクトのイメージにアクセスできます。

サービス アカウントのメールアドレスを取得する

サービス アカウントのメールアドレスを取得するには、次の手順に従います。

  1. Cloud Console で、アクセスを付与するサービス アカウントが属するプロジェクトの [IAM] ページに移動します。

    IAM ページに移動

  2. プロンプトが表示されたら、リストからプロジェクトを選択します。
  3. 次の形式のメールアドレスが設定された Google API サービス アカウントを見つけます。

    project-number@cloudservices.gserviceaccount.com
    
  4. 上記のメールアドレスをメモします。

サービス アカウントのメールアドレスを取得した後、次のいずれかのリンクをクリックします。

マネージド インスタンス グループに別のプロジェクト内のすべてのイメージへのアクセス権限を付与する

サービス アカウントのメールアドレスを取得しているので、そのメールアドレスを別のプロジェクトに追加して roles/compute.imageUser ロールを付与します。

Console

  1. Google Cloud Console で、イメージ プロジェクトの [IAM と管理] ページに移動します。

    [IAM と管理] ページに移動

  2. 新しいメンバーを追加するために、[追加] をクリックします。

  3. [新しいメンバー] フィールドに、サービス アカウントのメールアドレスを入力します。

  4. [ロール] リストで [Compute] をポイントし、[Compute イメージ ユーザー] を選択します。

  5. [保存] をクリックします。

  6. サービス アカウントのプロジェクトに切り替えます。

これで、イメージ プロジェクトのイメージをベースにインスタンス テンプレートを作成して、そのインスタンス テンプレートを基にマネージド インスタンス グループを作成できます。

gcloud

イメージ プロジェクトのサービス アカウントを追加します。

gcloud projects add-iam-policy-binding project-id \
  --member 'serviceAccount:service-account-email' --role 'roles/compute.imageUser'

以下を置き換えます。

  • project-id: 共有するイメージが含まれるプロジェクトの ID。
  • service-account-email: サービス アカウントのメールアドレス。

これで、イメージ プロジェクトのイメージをベースにインスタンス テンプレートを作成して、そのインスタンス テンプレートを基にマネージド インスタンス グループを作成できます。

API

  1. イメージ プロジェクトの IAM ポリシーを取得します。project-id の部分は、イメージ プロジェクトのプロジェクト ID で置き換えます。

    POST https://cloudresourcemanager.googleapis.com/v1/projects/project-id:getIamPolicy

  2. テキスト エディタでポリシーを編集し、サービス アカウントに roles/compute.imageUser ロールを付与します。例:

    {
      "bindings": [
         {
          "role": "roles/compute.imageUser",
          "members": [
            "serviceAccount:service-account-email"
          ]
        }
      ]
    }
    

    service-account-email の部分は、サービス アカウントのメールアドレスで置き換えます。

  3. 更新したポリシーを書き込みます。

    POST https://cloudresourcemanager.googleapis.com/v1/projects/project-id:setIamPolicy

    project-id の部分は、イメージ プロジェクトのプロダクト ID で置き換えます。リクエストの本文で、前のステップで更新した IAM ポリシーを指定します。

    これで、イメージ プロジェクトのイメージをベースにインスタンス テンプレートを作成して、そのインスタンス テンプレートを基にマネージド インスタンス グループを作成できます。

マネージド インスタンス グループに別のプロジェクト内の一部のイメージへのアクセス権限を付与する

サービス アカウントのメールアドレスを取得しているので、そのメールアドレスを別のプロジェクトに追加し、特定のイメージに対する roles/compute.imageUser ロールを付与します。

Console

  1. Google Cloud Console で、イメージ プロジェクトの [イメージ] ページに移動します。

    [イメージ] ページに移動

  2. 共有するイメージを選択します。

  3. [権限] パネルで、[メンバーを追加] をクリックします。

  4. サービス アカウントのメールアドレスを入力します。

  5. [ロール] リストで [Compute] を選択し、[Compute イメージ ユーザー] を選択します。

  6. [保存] をクリックします。

  7. サービス アカウントのプロジェクトに切り替えます。

これで、イメージ プロジェクトのイメージをベースにインスタンス テンプレートを作成して、そのインスタンス テンプレートを基にマネージド インスタンス グループを作成できます。

gcloud

サービス アカウントに特定のイメージへのアクセス権を付与するには:

gcloud images add-iam-policy-binding image-name \
  --member 'serviceAccount:service-account-email' \
  --role 'roles/compute.imageUser'

以下を置き換えます。

  • image-name: 共有するイメージの名前。
  • service-account-email: サービス アカウントのメールアドレス。

これで、イメージ プロジェクトのイメージをベースにインスタンス テンプレートを作成して、そのインスタンス テンプレートを基にマネージド インスタンス グループを作成できます。

API

  1. イメージの IAM ポリシーを取得します。

    POST https://compute.googleapis.com/compute/v1/projects/project-id/global/images/image-name:getIamPolicy

    以下を置き換えます。

    • project-id: イメージ プロジェクトのプロジェクト ID。
    • image-name: 共有するイメージの名前。
  2. テキスト エディタでポリシーを編集し、サービス アカウントに roles/compute.imageUser ロールを付与します。例:

    {
      "bindings": [
         {
          "role": "roles/compute.imageUser",
          "members": [
            "serviceAccount:service-account-email"
          ]
        }
      ]
    }
    

    service-account-email の部分は、サービス アカウントのメールアドレスで置き換えます。

  3. 更新したポリシーを書き込みます。

    POST https://compute.googleapis.com/compute/v1/projects/project-id/global/images/image-name:setIamPolicy

    以下を置き換えます。

    • project-id: イメージ プロジェクトのプロジェクト ID。
    • image-name: 共有するイメージの名前。

    リクエストの本文で、前のステップで更新した IAM ポリシーを指定します。

    これで、イメージ プロジェクトのイメージをベースにインスタンス テンプレートを作成して、そのインスタンス テンプレートを基にマネージド インスタンス グループを作成できます。

共有イメージとスナップショットの使用を制限する

イメージを他のユーザーと共有した後、組織内でそのユーザーがそれらのリソースを使用する場所を制御できます。constraints/compute.storageResourceUseRestrictions 制限を設定して、ユーザーがストレージ リソースの使用を許可されているプロジェクトを定義します。

これらの制約を設定するには、組織のポリシーを変更する権限が必要です。たとえば、resourcemanager.organizationAdmin ロールには、これらの制約を設定する権限があります。

  1. 組織の組織 ID を確認します。

    gcloud organizations list
    
  2. 組織の既存のポリシー設定を取得します。organization-id の部分は、12 桁の数値の組織 ID で置き換えます。

    gcloud beta resource-manager org-policies describe \
        compute.storageResourceUseRestrictions \
        --organization organization-id > org-policy.yaml
    
  3. テキスト エディタで org-policy.yaml ファイルを開き、compute.storageResourceUseRestrictions 制約を変更します。必要な制限を追加し、また不要になった制限を削除します。ファイルの編集が終了したら、変更を保存します。たとえば、ポリシー ファイルに次の制約エントリを設定できます。

    constraint: compute.storageResourceUseRestrictions
    listPolicy:
      allowedValues:
        - under:organization/organization-id
    
  4. 組織に policy.yaml ファイルを適用します。organization-id の部分は、12 桁の数値の組織 ID で置き換えます。

    gcloud beta resource-manager org-policies set-policy \
        --organization organization-id org-policy.yaml
    

組織ポリシーで制約の構成が完了したら、それらの制約をテストして、必要な制約が作成されることを確認します。

他のプロジェクトのイメージの使用

別のプロジェクト内にあるイメージへのアクセス権限が付与されている場合、そのプロジェクト内のそれらのイメージにアクセスするには、リクエストで該当するイメージ プロジェクトを指定します。

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

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

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

また、別のプロジェクトのイメージに基づいてブート永続ディスクを作成することもできます。イメージからブートディスクを作成する方法については、スタンドアロン ブート永続ディスクの作成をご覧ください。

共有イメージへのアクセス権限を取り消す

ユーザーが Compute Engine リソースにアクセスする必要がなくなったら、Google Cloud Console、gcloud コマンドライン ツール、または Compute Engine API を使用して、そのユーザーのアクセス権限を取り消すことができます。

Console

  1. Google Cloud Console で、イメージ プロジェクトの [イメージ] ページに移動します。

    [イメージ] ページに移動

  2. 更新するイメージの横にあるチェックボックスをオンにします。

  3. [情報パネルを表示] をクリックして、権限の列を展開します。

  4. ユーザーを削除するロールを展開します。

  5. [削除] をクリックして、そのロールからユーザーを削除します。

gcloud

イメージに対するロールからユーザーを削除するには、--member フラグと --role フラグを指定した remove-iam-policy-binding サブコマンドを使用します。

gcloud compute images remove-iam-policy-binding image-name \
    --member='member' \
    --role='role'

以下を置き換えます。

  • image-name: イメージの名前。例: my_image
  • member: 削除する ID。形式は user|group|serviceAccount:email または domain:domain にする必要があります。例:
    • user:test-user@gmail.com
    • group:admins@example.com
    • serviceAccount:test123@example.domain.com
    • domain:example.domain.com
  • role: ID を削除するロール。

現在ベータ版のリソースへのアクセス権限を取り消すには、代わりに gcloud beta compute コマンドを使用します。

API

API を使用して IAM ポリシーを直接変更するには、次の手順に従います。

  1. リソースのそれぞれの getIamPolicy メソッドを使用して、既存のポリシーを読み取ります。

    POST https://compute.googleapis.com/compute/v1/projects/project-id/global/images/image-name:getIamPolicy

    以下を置き換えます。

    • project-id: このイメージが属するプロジェクト ID。
    • image-name: イメージの名前。

    Compute Engine からレスポンスとして現在のポリシーが返されます。

  2. テキスト エディタでポリシーを編集して、メンバーを関連するロールから削除します。

  3. setIamPolicy() を使用して、更新したポリシーを書き込みます。

    POST https://compute.googleapis.com/compute/v1/projects/project-id/zones/global/images/image-name:setIamPolicy

    以下を置き換えます。

    • project-id: このイメージが属するプロジェクト ID。
    • image-name: イメージの名前。

      リクエストの本文で、前のステップで更新した IAM ポリシーを指定します。

次のステップ