プロジェクトまたは組織に属していないユーザーとでも、イメージとスナップショットを共有できます。イメージやスナップショットの読み取りアクセス権を持つユーザーは、これらのリソースを使用して、他のプロジェクトや組織で操作を完了できます。たとえば、プロジェクト内のイメージやスナップショットの読み取りアクセス権をユーザーに付与すると、そのユーザーはそれらのリソースを使用して自分のプロジェクト内で永続ディスクを作成できます。イメージやスナップショットの読み取りアクセス権を共有するには、IAM 役割を使用します。
状況によっては、許可されたユーザーによるこうしたストレージ リソースへのアクセスを、組織内または特定プロジェクト内のストレージ リソースを使用する場合にのみとしたい場合があります。ユーザーがイメージ、スナップショットを使用してリソースを作成できるプロジェクトを制限するには、組織ポリシーとしてストレージ リソースの使用制限を設定します。
IAM 役割の詳細については、IAM のドキュメントをご覧ください。
プロジェクト全体ではなく、イメージなどの特定のリソースへのアクセス権を付与するためのリソースレベルの IAM ポリシーについては、Compute Engine リソースへのアクセスを許可するをご覧ください。
始める前に
- このガイドのコマンドラインの例を使用する場合、以下を行います。
- gcloud コマンドライン ツールの最新バージョンをインストールするか、最新バージョンに更新します。
- デフォルトのリージョンとゾーンを設定します。
- このガイドの API の例を使用する場合、API アクセスを設定します。
- Identity and Access Management(IAM)のドキュメントをお読みください。
- Compute Engine IAM の役割(特に
roles/compute.imageUser
の役割)をお読みください。
制限事項
ストレージ リソースの共有には次の制限があります。
イメージやスナップショットへのアクセスを許可する役割を
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
- GCP Console の IAM ページに移動します。
- プロンプトが表示されたら、プロジェクトを選択します。
- 新規ユーザーを追加する場合は、次の操作を行います。
- ページの上部にある [追加] をクリックします。
- アクセス権を付与するアカウントのメールアドレスを 1 つ以上指定します。
- メンバーに 1 つ以上の役割を付与します。
- イメージ: 役割セレクタから [Compute Engine] > [Compute イメージ ユーザー] を選択します。
- スナップショット: 役割セレクタから [Compute Engine] > [Compute ストレージ管理者] を選択します。
- 変更を保存します。
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 を指定できます。
サービス アカウントのメールを取得し、そのアカウントにアクセス権限を付与する手順は次のとおりです。
- マネージド インスタンス グループを作成するプロジェクトの GCP Console の IAM ページに移動します。
- プロンプトが表示されたら、リストからプロジェクトを選択します。
次の形式のメールアドレスが設定された Google API サービス アカウントを見つけます。
[PROJECT_NUMBER]@cloudservices.gserviceaccount.com
上記のメールアドレスをメモします。次に、イメージを所有しているプロジェクトへのアクセス権限をアカウントに付与します。
Console
- Google Cloud Platform Console 内で、アクセスするイメージが含まれるプロジェクトの IAM ページに移動します。
- プロジェクト リストからプロジェクトを選択します。
- [追加] ボタンをクリックして新しいメンバーを追加します。
- [メンバー] ボックスに、サービス アカウントのメールアドレスを入力します。
- [役割] プルダウンを展開し、[Compute Engine] > [Compute イメージ ユーザー(ベータ版)] を選択します。
- [追加] をクリックしてアカウントを追加します。
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
役割には、これらの制約を設定する権限があります。
組織の組織 ID を確認します。
gcloud organizations list
組織の既存のポリシー設定を取得します。
gcloud beta resource-manager org-policies describe \ compute.storageResourceUseRestrictions \ --organization [ORGANIZATION_ID] > org-policy.yaml
[ORGANIZATION_ID]
は組織 ID です。テキスト エディタで
org-policy.yaml
ファイルを開き、compute.storageResourceUseRestrictions
制約を変更します。必要な制限を追加し、また不要になった制限を削除します。ファイルの編集が終了したら、変更を保存します。たとえば、ポリシー ファイルに次の制約エントリを設定できます。constraint: compute.storageResourceUseRestrictions listPolicy: allowedValues: - under:organization/[ORGANIZATION_ID]
組織に
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-images
の database-image-a
というイメージを使用してインスタンスを作成します。
gcloud compute instances create test-instance --image database-image-a --image-project database-images
同様に、イメージを使用して永続ディスクを作成できます。イメージからのディスクの作成の詳細については、スタンドアロンのルート永続ディスクを作成するをお読みください。
次のステップ
- IAM について読む。
- Compute Engine IAM の役割の全一覧を見る。
- イメージについて知る。
- 共有イメージを使用して新しいインスタンスを作成する方法について知る。
- スタンドアロンのブート永続ディスクを作成する方法について知る。
- Deployment Manager のデプロイでこの役割を使用する方法について知る。
- プロジェクト全体ではなく、特定の Compute Engine リソースへのアクセスを許可することで、最小権限の原則を適用します。