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

ユーザーがカスタム イメージを作成、削除、使用、共有できるようにするには、ユーザーに Identity and Access Management(IAM)の適切なロールを付与する必要があります。このドキュメントでは、カスタム イメージの作成と管理に必要な IAM 権限と、ユーザーにイメージを提供する方法について説明します。

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

始める前に

制限事項

イメージについては、特殊なメンバータイプ allUsers にロールを付与することはできません。

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

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

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

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

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

Console

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

    IAM に移動

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

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

    次に例を示します。

    • Google アカウントのメールアドレス: test-user@gmail.com
    • Google グループ: admins@googlegroups.com
    • サービス アカウント: server@example.gserviceaccount.com
    • Google Workspace ドメイン: example.com
  4. [ロールを選択] リストで、[Compute Engine] > [Compute ストレージ管理者] を選択します。カスタムロールを作成した場合は、そのロールを選択します。

  5. 省略可: 条件付きロール バインディングを追加して、Google Cloud リソースへのユーザーのアクセスをさらに細かく制御します。

  6. 変更を保存します。

gcloud

組織レベルで roles/compute.storageAdmin ロールを付与するには、gcloud organizations add-iam-policy-binding コマンドを使用します。

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

プロジェクト レベルで roles/compute.storageAdmin ロールを付与するには、gcloud projects add-iam-policy-binding コマンドを使用します。

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。

    次に例を示します。

    • Google アカウントのメールアドレス: user:user@gmail.com
    • Google グループ: group:admins@googlegroups.com
    • サービス アカウント: serviceAccount:server@example.gserviceaccount.com
    • Google Workspace ドメイン: domain:example.com

API

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

    POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:getIamPolicy
    

    PROJECT_ID は、プロジェクト ID に置き換えます(例: my-project-1)。

    組織の場合は、organizations.getIamPolicy メソッドを使用します。

    POST https://cloudresourcemanager.googleapis.com/v1/organizations/ORGANIZATION_ID:getIamPolicy
    

    ORGANIZATION_ID は、組織 ID に置き換えます(例: 123456578920)。

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

  2. メンバーとそれに関連するロールを追加または削除するには、テキスト エディタでポリシーを編集します。メンバーを追加するには、次の形式を使用します。

    • user:test-user@gmail.com
    • group:admins@example.com
    • serviceAccount:test123@example.domain.com
    • domain:example.domain.com

    たとえば、roles/compute.storageAdmin ロールを group:admins@example.com に付与するには、次のバインディングをポリシーに追加します。

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

    たとえば、ポリシーをプロジェクト レベルで設定するには、project.setIamPolicy メソッドを使用します。リクエストの本文で、前のステップで更新した IAM ポリシーを指定します。

    POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:setIamPolicy
    

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

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

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

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

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

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

  • イメージの削除を許可する compute.images.delete
  • compute.images.list(ユーザーがプロジェクトまたは組織内のイメージを一覧表示する必要がある場合)
  • イメージの取得を許可する compute.images.get

Console

特定のイメージを削除する権限を付与するには、次の手順を行います。

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

    [イメージ] に移動

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

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

  4. 1 人以上のメンバーを追加するには、[プリンシパルを追加] をクリックします。

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

    次に例を示します。

    • Google アカウントのメールアドレス: test-user@gmail.com
    • Google グループ: admins@googlegroups.com
    • サービス アカウント: server@example.gserviceaccount.com
    • Google Workspace ドメイン: example.com
  6. [ロール] リストで、[Compute Engine] の上にポインタを置いて [ストレージ管理者] を選択します。または、[カスタム] リストからカスタムロールを選択します。

  7. 省略可: 条件付きロール バインディングを追加して、Google Cloud リソースへのユーザーのアクセスをさらに細かく制御します。

  8. 変更を保存します。

プロジェクトまたは組織のイメージを削除する権限を付与する手順は次のとおりです。

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

    IAM に移動

  2. [追加] をクリックします。

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

    • Google アカウントのメールアドレス: test-user@gmail.com
    • Google グループ: admins@googlegroups.com
    • サービス アカウント: server@example.gserviceaccount.com
    • Google Workspace ドメイン: example.com
  4. [ロール] リストで、[Compute Engine] の上にポインタを置いて [ストレージ管理者] を選択します。または、[カスタム] リストからカスタムロールを選択します。

  5. 省略可: 条件付きロール バインディングを追加して、Google Cloud リソースへのユーザーのアクセスをさらに細かく制御します。

  6. 変更を保存します。

gcloud

組織レベルでイメージを削除する権限を付与するには、gcloud organizations add-iam-policy-binding コマンドを使用します。

gcloud organizations add-iam-policy-binding ORGANIZATION_ID \
    --member='MEMBER' \
    --role='ROLE'

プロジェクト レベルでイメージを削除する権限を付与するには、gcloud projects add-iam-policy-binding コマンドを使用します。

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member='MEMBER' \
    --role='ROLE'

特定のイメージを削除する権限を付与するには、gcloud compute images add-iam-policy-binding コマンドを使用します。

gcloud compute 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。

    次に例を示します。

    • Google アカウントのメールアドレス: user:user@gmail.com
    • Google グループ: group:admins@googlegroups.com
    • サービス アカウント: serviceAccount:server@example.gserviceaccount.com
    • Google Workspace ドメイン: domain:example.com
  • ROLE: この ID に割り当てるロール。たとえば、roles/compute.storageAdmin ロール、または roles/customImageDeletionRole などのカスタムロール。

API

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

    POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:getIamPolicy
    

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

    組織の場合は、organizations.getIamPolicy メソッドを使用します。

    POST https://cloudresourcemanager.googleapis.com/v1/organizations/ORGANIZATION_ID:getIamPolicy
    

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

    特定のイメージの場合は、images.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:test-user@gmail.com
    • group:admins@example.com
    • serviceAccount:test123@example.domain.com
    • domain:example.domain.com

    たとえば、roles/compute.storageAdmin ロールを user:test-email@example.com に付与するには、次のバインディングをポリシーに追加します。

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

    たとえば、ポリシーをプロジェクト レベルで設定するには、project.setIamPolicy メソッドを使用します。リクエストの本文で、前のステップで更新した IAM ポリシーを指定します。

    POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:setIamPolicy
    

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

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

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

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

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

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

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

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

Console

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

    [イメージ] に移動

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

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

  4. 1 人以上のメンバーを追加するには、[プリンシパルを追加] をクリックします。

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

    次に例を示します。

    • Google アカウントのメールアドレス: test-user@gmail.com
    • Google グループ: admins@googlegroups.com
    • サービス アカウント: server@example.gserviceaccount.com
    • Google Workspace ドメイン: example.com
  6. [ロール] リストで、[Compute Engine] の上にポインタを置いて、[イメージ ユーザー] または [ストレージ管理者] を選択するか、カスタムロールを選択します。

  7. 省略可: 条件付きロール バインディングを追加して、Google Cloud リソースへのユーザーのアクセスをさらに細かく制御します。

  8. 変更を保存します。

ユーザーが Cloud Console で共有カスタム イメージを起動できるようにするには、イメージ プロジェクトの閲覧者の IAM ロール(roles/viewer)をユーザーに付与します。このロールを付与することで、共有イメージがイメージ選択リストに表示されます。

  1. Cloud Console で [IAM] ページに移動します。

    IAM に移動

  2. [追加] をクリックします。

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

    • Google アカウントのメールアドレス: test-user@gmail.com
    • Google グループ: admins@googlegroups.com
    • サービス アカウント: server@example.gserviceaccount.com
    • Google Workspace ドメイン: example.com
  4. [ロール] リストで、[プロジェクト] の上にポインタを置いて、[閲覧者] を選択します。

  5. 省略可: 条件付きロール バインディングを追加して、Google Cloud リソースへのユーザーのアクセスをさらに細かく制御します。

  6. 変更を保存します。

gcloud

特定のイメージの IAM ポリシーを更新するには、gcloud compute images add-iam-policy-binding コマンドを使用します。

gcloud compute images add-iam-policy-binding IMAGE_NAME \
    --member='MEMBER' \
    --role='ROLE'

次のように置き換えます。

  • IMAGE_NAME: イメージの名前(例: custom-centos-8
  • MEMBER: ロールを付与する有効な ID

    次に例を示します。

    • 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 projects add-iam-policy-binding コマンドを使用して、ユーザーにイメージ プロジェクトの閲覧者の IAM ロール(roles/viewer)を付与します。ユーザーが共有イメージのリストを表示できるようにする必要がない場合は、この手順を省略できます。

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member='MEMBER' \
    --role='roles/viewer'

API

  1. リソースの getIamPolicy メソッドを使用して、既存のポリシーを読み取ります。たとえば、特定のイメージでポリシーを取得するには、images.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:test-user@gmail.com
    • group:admins@example.com
    • serviceAccount:test123@example.domain.com
    • domain:example.domain.com

    たとえば、roles/compute.imageUsertest-email@example.com に付与するには、次のバインディングをポリシーに追加します。

    {
     "members": [
       "user:test-email@example.com"
     ],
     "role":"roles/compute.imageUser"
    }
    
  3. setIamPolicy メソッドを使用して、更新したポリシーを書き込みます。たとえば、特定のイメージにポリシーを設定するには、project.setIamPolicy メソッドを使用します。リクエストの本文で、前のステップで更新した IAM ポリシーを指定します。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/images/IMAGE_NAME:setIamPolicy
    

    次のように置き換えます。

    • PROJECT_ID: このイメージが属するプロジェクトのプロジェクト ID
    • IMAGE_NAME: イメージの名前

(省略可能)ユーザーが images.list リクエストでこれらの共有イメージを表示できるようにするには、projects.setIamPolicy メソッドを使用して、イメージ プロジェクトの閲覧者の IAM ロール(roles/viewer)をユーザーに付与します。ユーザーが共有イメージのリストを表示できるようにする必要がない場合は、この手順を省略できます。

POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:setIamPolicy

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

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

Console

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

    [イメージ] に移動

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

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

  4. 1 人以上のメンバーを追加するには、[プリンシパルを追加] をクリックします。

  5. [新しいプリンシパル] フィールドに、イメージを共有するグループのメールアドレスを入力します。例: admins@example.com

  6. [ロール] リストで、[Compute Engine] の上にポインタを置いて、[Compute イメージ ユーザー] を選択します。

  7. 省略可: 条件付きロール バインディングを追加して、Google Cloud リソースへのユーザーのアクセスをさらに細かく制御します。

  8. 変更を保存します。

ユーザーが Cloud Console で共有カスタム イメージを起動できるようにするには、イメージ プロジェクトの閲覧者の IAM ロール(roles/viewer)をユーザーに付与します。このロールを付与することで、共有イメージがイメージ選択リストに表示されます。

  1. Cloud Console で [IAM] ページに移動します。

    IAM に移動

  2. [追加] をクリックします。

  3. [新しいプリンシパル] フィールドに、イメージを共有する ID のメールアドレスを入力します。例: admins@example.com

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

  5. 省略可: 条件付きロール バインディングを追加して、Google Cloud リソースへのユーザーのアクセスをさらに細かく制御します。

  6. 変更を保存します。

gcloud

ユーザーに roles/compute.imageUser ロールを付与するには、gcloud compute images add-iam-policy-binding コマンドを使用します。

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 projects add-iam-policy-binding コマンドを使用して、ユーザーにイメージ プロジェクトの閲覧者の IAM ロール(roles/viewer)を付与します。ユーザーが共有イメージのリストを表示できるようにする必要がない場合は、この手順を省略できます。

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member='MEMBER' \
    --role='roles/viewer'

API

  1. リソースの getIamPolicy メソッドを使用して、既存のポリシーを読み取ります。たとえば、特定のイメージでポリシーを取得するには、images.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:test-user@gmail.com
    • group:admins@example.com
    • serviceAccount:test123@example.domain.com
    • domain:example.domain.com

    たとえば、roles/compute.imageUsertest-user@example.com に付与するには、次のバインディングをポリシーに追加します。

    {
      "members": [
        "user:test-user@example.com"
      ],
      "role":"roles/compute.imageUser"
    }
    
  3. setIamPolicy メソッドを使用して、更新したポリシーを書き込みます。たとえば、特定のイメージにポリシーを設定するには、images.setIamPolicy メソッドを使用します。リクエストの本文で、前のステップで更新した IAM ポリシーを指定します。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/images/IMAGE_NAME:setIamPolicy
    

    次のように置き換えます。

    • PROJECT_ID: このイメージが属するプロジェクトのプロジェクト ID
    • IMAGE_NAME: イメージの名前

    (省略可能)ユーザーが images.list リクエストでこれらの共有イメージを表示できるようにするには、projects.setIamPolicy メソッドを使用して、イメージ プロジェクトの閲覧者の IAM ロール(roles/viewer)をユーザーに付与します。ユーザーが共有イメージのリストを表示できるようにする必要がない場合は、この手順を省略できます。

    POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:setIamPolicy
    

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

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

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

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

gcloud

イメージを公開するには、gcloud compute images add-iam-policy-binding コマンドを使用します。

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

IMAGE_NAME はリソースの名前(例: my_image)に置き換えます。

API

  1. getIamPolicy メソッドを使用して既存のポリシーを読み取ります。たとえば、特定のイメージでポリシーを取得するには、images.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 メソッドを使用して、更新したポリシーを書き込みます。たとえば、特定のイメージにポリシーを設定するには、images.setIamPolicy メソッドを使用します。リクエストの本文で、前のステップで更新した IAM ポリシーを指定します。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/images/IMAGE_NAME:setIamPolicy
    

    次のように置き換えます。

    • PROJECT_ID: このイメージが属するプロジェクトのプロジェクト ID
    • IMAGE_NAME: イメージの名前

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

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

他のプロジェクトのイメージを使用して MIG を作成する場合は、MIG を作成するプロジェクトに属する API サービス アカウントに Compute イメージ ユーザーのロール(roles/compute.imageUser)を付与します。次に例を示します。

  1. プロジェクト A で、プロジェクト B が所有するイメージを使用して MIG を作成するとします。
  2. プロジェクト B がプロジェクト A のサービス アカウントに Compute イメージ ユーザーのロールを付与します。
  3. これにより、プロジェクト A でプロジェクト B のイメージを使用して MIG を作成できます。

Compute イメージ ユーザーのロールを付与した後、マネージド グループのインスタンス テンプレートの作成時にコンソールまたはイメージの URL を使用して、他のプロジェクトからイメージにアクセスできます。

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

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

    IAM に移動

  2. プロンプトが表示されたら、リストからプロジェクトを選択します。

  3. 次の形式のメールアドレスが設定された Google API サービス アカウントを見つけます。

    PROJECT_NUMBER@cloudservices.gserviceaccount.com
    

サービス アカウントのメールアドレスを取得した後、次のいずれかのセクションに進みます。

MIG に別のプロジェクト内のすべてのイメージへのアクセス権限を付与する

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

Console

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

    IAM に移動

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

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

  4. [ロール] リストで、[Compute] の上にポインタを置いて、[Compute イメージ ユーザー] を選択します。

  5. 省略可: 条件付きロール バインディングを追加して、Google Cloud リソースへのユーザーのアクセスをさらに細かく制御します。

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

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

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

gcloud

gcloud projects add-iam-policy-binding コマンドを使用して、イメージ プロジェクトからサービス アカウントを追加します。

gcloud projects add-iam-policy-binding PROJECT_ID \
    --member='serviceAccount:SERVICE_ACCOUNT_EMAIL' --role='roles/compute.imageUser'

次のように置き換えます。

  • PROJECT_ID: 共有するイメージが含まれるプロジェクトの ID
  • SERVICE_ACCOUNT_EMAIL: サービス アカウントのメールアドレス

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

API

  1. イメージ プロジェクトの IAM ポリシーを取得するには、projects.getIamPolicy メソッドを使用します。

     POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:getIamPolicy
     

    PROJECT_ID は、イメージ プロジェクトのプロジェクト ID に置き換えます。

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

    {
      "bindings": [
         {
          "role": "roles/compute.imageUser",
          "members": [
            "serviceAccount:SERVICE_ACCOUNT_EMAIL"
          ]
        }
      ]
    }
    

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

  3. projects.setIamPolicy を使用して、更新したポリシーを書き込みます。リクエストの本文で、前のステップで更新した IAM ポリシーを指定します。

    POST https://cloudresourcemanager.googleapis.com/v1/projects/PROJECT_ID:setIamPolicy
    

    PROJECT_ID の部分は、イメージ プロジェクトのプロダクト ID で置き換えます。

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

MIG に別のプロジェクト内の一部のイメージへのアクセス権限を付与する

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

コンソール

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

    [イメージ] に移動

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

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

  4. [権限] パネルで、[プリンシパルを追加] をクリックします。

  5. [新しいプリンシパル] フィールドに、イメージを共有するサービス アカウントのメールアドレスを入力します。例: test123@example.domain.com

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

  7. 省略可: 条件付きロール バインディングを追加して、Google Cloud リソースへのユーザーのアクセスをさらに細かく制御します。

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

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

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

gcloud

サービス アカウントに特定のイメージへのアクセス権を付与するには、gcloud compute images add-iam-policy-binding コマンドを使用します。

gcloud compute images add-iam-policy-binding IMAGE_NAME \
    --member='serviceAccount:SERVICE_ACCOUNT_EMAIL' \
    --role='roles/compute.imageUser'

次のように置き換えます。

  • IMAGE_NAME: 共有するイメージの名前
  • SERVICE_ACCOUNT_EMAIL: サービス アカウントのメールアドレス

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

API

  1. イメージの IAM ポリシーを取得するには、images.getIamPolicy メソッドを使用します。

    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. images.setIamPolicy メソッドを使用して、更新したポリシーを書き込みます。リクエストの本文で、前のステップで更新した IAM ポリシーを指定します。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/global/images/IMAGE_NAME:setIamPolicy
    

    次のように置き換えます。

    • PROJECT_ID: イメージ プロジェクトのプロジェクト ID
    • IMAGE_NAME: 共有するイメージの名前

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

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

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

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

  1. gcloud organization list コマンドを使用して、組織の組織 ID を検索します。

    gcloud organizations list
    
  2. gcloud resource-manager org-policies describe コマンドを使用して、組織の既存のポリシー設定を取得します。

    gcloud resource-manager org-policies describe \
        compute.storageResourceUseRestrictions \
        --organization ORGANIZATION_ID > org-policy.yaml
    

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

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

    constraint: compute.storageResourceUseRestrictions
    listPolicy:
      allowedValues:
        - under:organization/organization-id
    
  4. gcloud resource-manager org-policies set-policy コマンドを使用して org-policy.yaml ファイルを組織に適用します。

    gcloud resource-manager org-policies set-policy \
       --organization=ORGANIZATION_ID org-policy.yaml
    

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

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

別のプロジェクトのイメージを使用する

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

たとえば、別のプロジェクトの共有イメージを使用して VM を作成するには、次の手順を行います。

Console

  1. Google Cloud Console で、[インスタンスの作成] ページに移動します。

    [インスタンスの作成] に移動

  2. VM の名前を指定します。詳しくは、リソースの命名規則をご覧ください。
  3. (省略可)この VM のゾーンを変更します。Compute Engine は、複数のゾーンで各リージョンが均等に使用されるように、各リージョン内でゾーンのリストをランダム化します。
  4. VM のマシン構成を選択します。
  5. [ブートディスク] セクションで、[変更] をクリックしてブートディスクを構成し、次の操作を行います。
    1. [カスタム イメージ] タブを選択します。
    2. イメージ プロジェクトを選択するには、[プロジェクトを選択] をクリックし、次の操作を行います。
      1. イメージを含むプロジェクトを選択します。
      2. [開く] をクリックします。
    3. [イメージ] リストで、インポートするイメージをクリックします。
    4. ブートディスクのタイプとサイズを選択します。
    5. ブートディスクのオプションを確認するには、[選択] をクリックします。
  6. VM への HTTP または HTTPS トラフィックを許可するには、[ファイアウォール] セクションで [HTTP トラフィックを許可する] または [HTTPS トラフィックを許可する] を選択します。

    Cloud Console によってネットワーク タグが VM に追加されます。また、対応する上り(内向き)ファイアウォール ルールが作成され、tcp:80(HTTP)または tcp:443(HTTPS)で受信するすべてのトラフィックが許可されます。このネットワーク タグによってファイアウォール ルールが VM に関連付けられます。詳細については、Virtual Private Cloud のドキュメントでファイアウォール ルールの概要をご覧ください。

  7. VM を起動して作成するには、[作成] をクリックします。

gcloud

gcloud compute instances create command を使用して VM を作成し、--image フラグと --image-project フラグを使用してイメージ名とそのイメージが属するプロジェクトを指定します。

 gcloud compute instances create VM_NAME \
        --image=IMAGE \
        --image-project=IMAGE_PROJECT
    

次のように置き換えます。

  • VM_NAME: 新しい VM の名前
  • IMAGE: イメージの名前
  • IMAGE_PROJECT: イメージが属するプロジェクト

コマンドが成功すると、gcloud は新しい VM のプロパティを返します。

    Created [https://compute.googleapis.com/compute/v1/projects/myproject/zones/us-central1-b/instances/example-instance].
    NAME                 ZONE           MACHINE_TYPE   PREEMPTIBLE  INTERNAL_IP  EXTERNAL_IP    STATUS
    example-instance     us-central1-b  e2-standard-2               10.240.0.4   104.198.53.60  RUNNING

API

API の手順に沿って公開イメージから VM を作成し、リクエストの本文で image フィールドを指定します。空のディスクを追加する場合は、イメージソースを指定しないでください。必要に応じて、diskSizeGbdiskTypelabels のプロパティを指定できます。

    [...
    image: "projects/PROJECT_ID/global/images/IMAGE_NAME
    {
     "initializeParams": {
        "diskSizeGb": "SIZE_GB",
        "sourceImage": "IMAGE"
           }
     }
     ...]

次のように置き換えます。

  • PROJECT_ID: イメージを含むプロジェクト
  • IMAGE_NAME: ソースイメージ
  • SIZE_GB: ディスクサイズ
  • IMAGE: 非ブートディスクのソースイメージ
  • 空のディスクの場合は、イメージソースを指定しないでください。

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

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

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

Console

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

    [イメージ] に移動

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

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

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

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

gcloud

イメージに対するロールからユーザーを削除するには、--member フラグと --role フラグを指定して gcloud compute images 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

  1. images.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. images.setIamPolicy メソッドを使用して、更新したポリシーを書き込みます。リクエストの本文で、前のステップで更新した IAM ポリシーを指定します。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/global/images/IMAGE_NAME:setIamPolicy
    

    次のように置き換えます。

    • PROJECT_ID: このイメージが属するプロジェクト ID
    • IMAGE_NAME: イメージの名前

次のステップ