Google Cloud では、Google Cloud サービスを有効にして使用すると、プロジェクト レベル、フォルダレベル、組織レベルのサービス エージェントが自動的に作成されます。これらのサービス エージェントには、ユーザーに代わってリソースを作成してアクセスできるロールが自動的に付与されることもあります。
サービスを利用する前に、必要に応じて、プロジェクト レベル、フォルダレベル、組織レベルのサービス エージェントを作成するように Google Cloud にリクエストすることもできます。サービス エージェントの作成を Google Cloud にリクエストすると、サービスを使用する前にサービス エージェントにロールを付与できます。サービス エージェントがまだ作成されていない場合は、ロールをサービス エージェントに付与できません。
このオプションは、次のいずれかの方法で許可ポリシーを管理する場合に便利です。
- Terraform などの宣言型フレームワーク。Terraform 構成にサービス エージェントのロールが含まれていない場合、構成を適用するときに、これらのロールが取り消されます。サービス エージェントを作成して Terraform 構成でロールを付与することで、それらのロールが取り消されないようにします。
- コードとしてのポリシー。現在の許可ポリシーのコピーをコード リポジトリに格納します。Google Cloud がサービス エージェントに自動的にロールを付与した場合、これらのロールは実際の許可ポリシーには存在しますが、格納された許可ポリシーのコピーには存在しません。この不整合を解決するときに、これらのロールを誤って取り消してしまう可能性があります。サービス エージェントを作成してロールを付与することで、コード リポジトリと実際の許可ポリシーの間の不整合を防ぐことができます。
サービス エージェントの作成をトリガーしたら、サービス エージェントに自動的に付与されるロールをサービス エージェントに付与する必要があります。そうしないと、一部のサービスが正しく機能しない可能性があります。これは、ユーザーのリクエストで作成されたサービス エージェントにはロールが自動的に付与されないためです。
始める前に
Enable the Resource Manager API.
サービス エージェントについて理解する。
必要なロール
サービス エージェントの作成をトリガーするために、IAM 権限は必要ありません。ただし、このページの他のタスクには特定の IAM 権限が必要です。
-
使用可能なサービスとそのエンドポイントを一覧表示するために必要な権限を取得するには、使用可能なサービスを一覧表示するプロジェクト、フォルダ、または組織に対する Service Usage 閲覧者(
roles/serviceusage.serviceUsageViewer
)の IAM ロールを付与するように管理者に依頼します。ロールの付与の詳細については、アクセスの管理をご覧ください。この事前定義ロールには、使用可能なサービスとそのエンドポイントを一覧表示するために必要な
serviceusage.services.list
権限が含まれています。 -
サービス エージェントにアクセス権を付与するために必要な権限を取得するには、アクセス権を付与するプロジェクト、フォルダ、または組織に対する次の IAM ロールを付与するように管理者へ依頼します。
-
サービス エージェントにプロジェクトへのアクセス権を付与する: プロジェクト IAM 管理者(
roles/resourcemanager.projectIamAdmin
) -
サービス エージェントにフォルダへのアクセス権を付与する: フォルダ管理者(
roles/resourcemanager.folderAdmin
) -
サービス エージェントにプロジェクト、フォルダ、組織へのアクセス権を付与する: 組織管理者(
roles/resourcemanager.organizationAdmin
)
ロールの付与の詳細については、アクセスの管理をご覧ください。
これらの事前定義ロールには、サービス エージェントにアクセス権を付与するために必要な権限が含まれています。必要な権限を正確に確認するには、「必要な権限」セクションを開いてください。
必要な権限
サービス エージェントにアクセス権を付与するには、次の権限が必要です。
-
サービス エージェントにプロジェクトへのアクセス権を付与する:
-
resourcemanager.projects.getIamPolicy
-
resourcemanager.projects.setIamPolicy
-
-
サービス エージェントにフォルダへのアクセス権を付与する:
-
resourcemanager.folders.getIamPolicy
-
resourcemanager.folders.setIamPolicy
-
-
サービス エージェントに組織へのアクセス権を付与する:
-
resourcemanager.organizations.getIamPolicy
-
resourcemanager.organizations.setIamPolicy
-
-
サービス エージェントにプロジェクトへのアクセス権を付与する: プロジェクト IAM 管理者(
作成するサービス エージェントを特定する
Google Cloud に作成をリクエストする必要のあるプロジェクト レベル、フォルダレベル、組織レベルのサービス エージェントを確認するには、次の操作を行います。
使用するサービスとそれらの API エンドポイントのリストを作成します。使用可能なサービスとそのエンドポイントを表示するには、次のいずれかの方法を使用します。
コンソール
Google Cloud コンソールで [API ライブラリ] ページに移動します。
API エンドポイントは、[詳細] セクションに記載されているサービス名です。
gcloud
gcloud services list
コマンドは、プロジェクトで使用可能なサービスを一覧表示します。後述のコマンドデータを使用する前に、次のように置き換えます。
-
EXPRESSION
: 省略可。結果をフィルタリングする式。たとえば、次の式は、名前にgoogleapis.com
を含み、sandbox
を含まないすべてのサービスをフィルタリングします。name ~ googleapis.com AND name !~ sandbox
フィルタ式の一覧については、
gcloud topic filters
をご覧ください。 -
LIMIT
: 省略可。リストに表示する結果の最大数。デフォルトはunlimited
です。
次のコマンドを実行します。
Linux、macOS、Cloud Shell
gcloud services list --available --filter='EXPRESSION' --limit=LIMIT
Windows(PowerShell)
gcloud services list --available --filter='EXPRESSION' --limit=LIMIT
Windows(cmd.exe)
gcloud services list --available --filter='EXPRESSION' --limit=LIMIT
レスポンスには、使用可能なすべてのサービスの名前とタイトルが含まれます。API エンドポイントは
NAME
フィールドの値です。REST
Service Usage API の
services.list
メソッドは、プロジェクトで使用可能なすべてのサービスを一覧表示します。リクエストのデータを使用する前に、次のように置き換えます。
-
RESOURCE_TYPE
: 使用可能なサービスを一覧表示するリソースのタイプ。projects
、folders
、またはorganizations
を使用します。 -
RESOURCE_ID
: 使用可能なサービスを一覧表示する Google Cloud プロジェクト、フォルダ、または組織の ID。プロジェクト ID は英数字からなる文字列です(例:my-project
)。フォルダ ID と組織 ID は数値です(例:123456789012
)。 -
PAGE_SIZE
: 省略可。レスポンスに含めるサービスの数。デフォルト値は 50、最大値は 200 です。サービスの数がページサイズより大きい場合、レスポンスには結果の次のページを取得するために使用できるページ設定トークンが含まれます。 -
NEXT_PAGE_TOKEN
: 省略可。以前のレスポンスでこのメソッドから返されたページ設定トークン。指定すると、前のリクエストが終了した時点からサービスの一覧表示が開始します。
HTTP メソッドと URL:
GET https://serviceusage.googleapis.com/v1/RESOURCE_TYPE/RESOURCE_ID/services?pageSize=PAGE_SIZE&pageToken=NEXT_PAGE_TOKEN
リクエストを送信するには、次のいずれかのオプションを展開します。
レスポンスには、リソースで使用可能なすべてのサービスの名前とタイトルが含まれます。使用可能なサービスの数がページサイズを超えた場合、レスポンスにはページネーション トークンも含まれます。API エンドポイントは
name
フィールドの値です。-
サービス エージェントのリファレンス ページで API エンドポイントを検索します。
エンドポイントが表にある場合は、そのエンドポイントのすべてのサービス エージェントを見つけます。メールアドレスに
IDENTIFIER
プレースホルダが含まれているサービス エージェントは無視します。サービス エージェントはプロジェクト固有のリソースであり、プロジェクト、フォルダ、組織のリソースではありません。プロジェクト レベル、フォルダレベル、組織レベルのサービス エージェントごとに、次のことを記録します。
- サービス アカウントのメールアドレスの形式。
- サービス エージェントに付与されているロール(ある場合)。
サービス エージェントの作成をトリガーする
どのサービス エージェントを作成する必要があるかを把握したら、Google Cloud に作成をリクエストします。
Google Cloud にサービス エージェントの作成をリクエストする場合は、サービスとリソースを提供します。Google Cloud は、そのサービスとそのリソース用のすべてのサービス エージェントを作成します。
gcloud
サービス エージェントを作成する必要があるサービスごとに、次の操作を行います。
サービスのサービス エージェントのメールアドレスを確認します。メールアドレスのプレースホルダを使用して、サービス エージェントの作成に必要なリソースを決定します。
プレースホルダ サービス エージェントを作成する場所 PROJECT_NUMBER
サービスを使用する各プロジェクト FOLDER_NUMBER
サービスを使用する各フォルダ ORGANIZATION_NUMBER
サービスを使用する各組織 各リソースにサービス エージェントを作成します。
gcloud beta services identity create
コマンドは、指定した API とリソースのすべてのサービス エージェントを作成します。後述のコマンドデータを使用する前に、次のように置き換えます。
-
ENDPOINT
: サービス エージェントを作成する API のエンドポイント(例:aiplatform.googleapis.com
)。 -
RESOURCE_TYPE
: サービス エージェントを作成するリソースのタイプ。project
、folder
、またはorganization
を使用します。 -
RESOURCE_ID
: サービス エージェントを作成する Google Cloud のプロジェクト、フォルダ、または組織の ID。プロジェクト ID は英数字からなる文字列です(例:my-project
)。フォルダ ID と組織 ID は数値です(例:123456789012
)。サービス エージェントは一度に 1 つのリソースに対して作成できます。複数のリソースにサービス エージェントを作成する必要がある場合は、リソースごとにコマンドを 1 回実行します。
次のコマンドを実行します。
Linux、macOS、Cloud Shell
gcloud beta services identity create --service=ENDPOINT \ --RESOURCE_TYPE=RESOURCE_ID
Windows(PowerShell)
gcloud beta services identity create --service=ENDPOINT ` --RESOURCE_TYPE=RESOURCE_ID
Windows(cmd.exe)
gcloud beta services identity create --service=ENDPOINT ^ --RESOURCE_TYPE=RESOURCE_ID
レスポンスには、サービスのプライマリ サービス エージェントのメールアドレスが含まれます。このメールアドレスには、サービス エージェントを作成したプロジェクト、フォルダ、または組織の数値 ID が含まれます。
サービスにプライマリ サービス エージェントがない場合、レスポンスにメールアドレスは含まれません。
プライマリ サービス エージェントがあるサービスのレスポンスは次のようになります。
Service identity created: service-232332569935@gcp-sa-aiplatform.iam.gserviceaccount.com
-
省略可: レスポンスに含まれているサービス エージェントのメールアドレスを記録します(存在する場合)。このメールアドレスにより、サービスのプライマリ サービス エージェントを識別できます。この ID を使用して、プライマリ サービス エージェントにロールを付与できます。
Terraform
Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。詳細については、Terraform プロバイダのリファレンス ドキュメントをご覧ください。
サービス エージェントを作成する必要があるサービスごとに、次の操作を行います。
サービスのサービス エージェントのメールアドレスを確認します。メールアドレスのプレースホルダを使用して、サービス エージェントの作成に必要なリソースを決定します。
プレースホルダ サービス エージェントを作成する場所 PROJECT_NUMBER
サービスを使用する各プロジェクト FOLDER_NUMBER
サービスを使用する各フォルダ ORGANIZATION_NUMBER
サービスを使用する各組織 各リソースにサービス エージェントを作成します。 たとえば、次のコードは、AI Platform のすべてのプロジェクト レベルのサービス エージェントを作成します。
REST
サービス エージェントを作成する必要があるサービスごとに、次の操作を行います。
サービスのサービス エージェントのメールアドレスを確認します。メールアドレスのプレースホルダを使用して、サービス エージェントの作成に必要なリソースを決定します。
プレースホルダ サービス エージェントを作成する場所 PROJECT_NUMBER
サービスを使用する各プロジェクト FOLDER_NUMBER
サービスを使用する各フォルダ ORGANIZATION_NUMBER
サービスを使用する各組織 各リソースにサービス エージェントを作成します。
Service Usage API の
services.generateServiceIdentity
メソッドは、指定された API とリソースのすべてのサービス エージェントを作成します。リクエストのデータを使用する前に、次のように置き換えます。
-
RESOURCE_TYPE
: サービス エージェントを作成するリソースのタイプ。projects
、folders
、またはorganizations
を使用します。 -
RESOURCE_ID
: サービス エージェントを作成する Google Cloud のプロジェクト、フォルダ、または組織の ID。プロジェクト ID は英数字からなる文字列です(例:my-project
)。フォルダ ID と組織 ID は数値です(例:123456789012
)。サービス エージェントは一度に 1 つのリソースに対して作成できます。複数のリソースにサービス エージェントを作成する必要がある場合は、リソースごとに 1 つのリクエストを送信します。
-
ENDPOINT
: サービス エージェントを作成する API のエンドポイント(例:aiplatform.googleapis.com
)。
HTTP メソッドと URL:
POST https://serviceusage.googleapis.com/v1beta1/RESOURCE_TYPE/RESOURCE_ID/services/ENDPOINT:generateServiceIdentity
リクエストを送信するには、次のいずれかのオプションを展開します。
レスポンスには、リクエストのステータスを示すOperation
が含まれています。オペレーションのステータスを確認するには、operations.get
メソッドを使用します。終了したオペレーションには、サービスのプライマリ サービス エージェントのメールアドレスが含まれます。このメールアドレスには、サービス エージェントを作成したプロジェクト、フォルダ、または組織の数値 ID が含まれます。
サービスにプライマリ サービス エージェントがない場合、レスポンスにメールアドレスは含まれません。
以下に、プライマリ サービス エージェントがあるサービスに対して終了したオペレーションの例を示します。
{ "name": "operations/finished.DONE_OPERATION", "done": true, "response": { "@type": "type.googleapis.com/google.api.serviceusage.v1beta1.ServiceIdentity", "email": "service-232332569935@gcp-sa-aiplatform.iam.gserviceaccount.com", "uniqueId": "112245693826560101651" } }
-
省略可: レスポンスに含まれているサービス エージェントのメールアドレスを記録します(存在する場合)。このメールアドレスにより、サービスのプライマリ サービス エージェントを識別できます。この ID を使用して、プライマリ サービス エージェントにロールを付与できます。
サービス エージェントにロールを付与する
Google Cloud でプロジェクト、フォルダ、組織に必要なサービス エージェントが作成されたら、サービス エージェントのメールアドレスを使用してロールを付与します。
Google Cloud でサービス エージェントの作成をリクエストした場合は、自動的に付与されるロールをそのサービス エージェントに付与する必要があります。そうしないと、一部のサービスが正しく機能しない可能性があります。これは、ユーザーのリクエストで作成されたサービス エージェントにはロールが自動的に付与されないためです。
自動的に付与されるロールを特定する方法については、作成するサービス エージェントを特定するをご覧ください。
サービス エージェントのメールアドレスを確認する
サービス エージェントのメールアドレスを確認するには、次の手順を行います。
gcloud
まだ行なっていない場合、サービス エージェントのメールアドレス形式を確認します。この形式は、サービス エージェントのリファレンスに記載されています。
メールアドレスのプレースホルダは、対応するプロジェクト、フォルダ、または組織番号に置き換えます。
または、サービス エージェントがプライマリ サービス エージェントの場合は、サービスに対してサービス エージェントの作成をトリガーすることで、そのメールアドレスを取得できます。サービス エージェントの作成をトリガーするコマンドは、プライマリ サービス エージェントのメールアドレスを返します。
Terraform
Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。詳細については、Terraform プロバイダのリファレンス ドキュメントをご覧ください。
まだ行なっていない場合、サービス エージェントのメールアドレス形式を確認します。この形式は、サービス エージェントのリファレンスに記載されています。
メールアドレスのプレースホルダは、適切なプロジェクト、フォルダ、または組織番号を参照する式に置き換えます。
次の状況について考えてみましょう。
- メールアドレスの形式が
service-PROJECT_NUMBER@gcp-sa-aiplatform-cc.iam.gserviceaccount.com
- サービス エージェントは
default
という名前のプロジェクト用
この場合、サービス エージェントのメールアドレスは次のようになります。
service-${data.google_project.default.number}@gcp-sa-aiplatform-cc.iam.gserviceaccount.com
- メールアドレスの形式が
また、サービス エージェントがサービスのプライマリ サービス エージェントの場合は、google_project_service_identity
リソースの email
属性からメールアドレスを取得できます。
たとえば、default
というラベルが付いた google_project_service_identity
ブロックがある場合、次の式を使用して、サービスのプライマリ サービス エージェントのメールアドレスを取得できます。
${google_project_service_identity.default.email}
REST
まだ行なっていない場合、サービス エージェントのメールアドレス形式を確認します。この形式は、サービス エージェントのリファレンスに記載されています。
メールアドレスのプレースホルダは、対応するプロジェクト、フォルダ、または組織番号に置き換えます。
または、サービス エージェントがプライマリ サービス エージェントの場合は、サービスに対してサービス エージェントの作成をトリガーすることで、そのメールアドレスを取得できます。サービス エージェントの作成をトリガーするコマンドは、プライマリ サービス エージェントのメールアドレスを返します。
サービス アカウントにロールを付与する
サービス エージェントのメールアドレスを確認したら、他のプリンシパルにロールを付与する場合と同様にロールを付与できます。
コンソール
gcloud
add-iam-policy-binding
コマンドを使用すると、プリンシパルにロールをすばやく付与できます。
後述のコマンドデータを使用する前に、次のように置き換えます。
-
RESOURCE_TYPE
: アクセスを管理するリソースタイプ。projects
、resource-manager folders
、またはorganizations
を使用します。 -
RESOURCE_ID
: Google Cloud プロジェクト、フォルダ、または組織 ID。プロジェクト ID は英数字です(例:my-project
)。フォルダ ID と組織 ID は数値です(例:123456789012
)。 -
PRINCIPAL
: プリンシパルまたはメンバーの識別子。通常、PRINCIPAL_TYPE:ID
の形式で指定します(例:user:my-user@example.com
)。PRINCIPAL
に使用できる値の一覧については、ポリシー バインディングのリファレンスをご覧ください。プリンシパル タイプが
user
の場合、識別子に含まれるドメイン名は Google Workspace ドメインまたは Cloud Identity ドメインである必要があります。Cloud Identity ドメインの設定方法については、Cloud Identity の概要をご覧ください。 -
ROLE_NAME
: 取り消すロールの名前。次のいずれかの形式で指定してください。- 事前定義ロール:
roles/SERVICE.IDENTIFIER
- プロジェクト レベルのカスタムロール:
projects/PROJECT_ID/roles/IDENTIFIER
- 組織レベルのカスタムロール:
organizations/ORG_ID/roles/IDENTIFIER
事前定義ロールのリストについては、ロールについてをご覧ください。
- 事前定義ロール:
-
CONDITION
: ロール バインディングに追加する条件。条件を追加しない場合は、値None
を使用します。条件の詳細については、条件の概要をご覧ください。
次のコマンドを実行します。
Linux、macOS、Cloud Shell
gcloud RESOURCE_TYPE add-iam-policy-binding RESOURCE_ID \ --member=PRINCIPAL --role=ROLE_NAME \ --condition=CONDITION
Windows(PowerShell)
gcloud RESOURCE_TYPE add-iam-policy-binding RESOURCE_ID ` --member=PRINCIPAL --role=ROLE_NAME ` --condition=CONDITION
Windows(cmd.exe)
gcloud RESOURCE_TYPE add-iam-policy-binding RESOURCE_ID ^ --member=PRINCIPAL --role=ROLE_NAME ^ --condition=CONDITION
レスポンスには、更新された IAM ポリシーが含まれます。
Terraform
Terraform 構成を適用または削除する方法については、基本的な Terraform コマンドをご覧ください。詳細については、Terraform プロバイダのリファレンス ドキュメントをご覧ください。
REST
REST API でロールを付与するには、読み取り - 変更 - 書き込みのパターンを使用します。
getIamPolicy()
を呼び出して、現在の許可ポリシーを読み取ります。Resource Manager API の
getIamPolicy
メソッドは、プロジェクト、フォルダ、または組織の許可ポリシーを取得します。リクエストのデータを使用する前に、次のように置き換えます。
API_VERSION
: 使用する API のバージョン。プロジェクトと組織の場合は、v1
を使用します。フォルダの場合は、v2
を使用します。RESOURCE_TYPE
: ポリシーを管理するリソースタイプ。値projects
、folders
、またはorganizations
を使用します。RESOURCE_ID
: Google Cloud プロジェクト、組織、またはフォルダ ID。プロジェクト ID は英数字からなる文字列です(例:my-project
)。フォルダ ID と組織 ID は数値です(例:123456789012
)。POLICY_VERSION
: 返されるポリシー バージョン。リクエストでは、最新のポリシー バージョン(ポリシー バージョン 3)を指定する必要があります。詳細については、ポリシーの取得時にポリシー バージョンを指定するをご覧ください。
HTTP メソッドと URL:
POST https://cloudresourcemanager.googleapis.com/API_VERSION/RESOURCE_TYPE/RESOURCE_ID:getIamPolicy
リクエストの本文(JSON):
{ "options": { "requestedPolicyVersion": POLICY_VERSION } }
リクエストを送信するには、次のいずれかのオプションを展開します。
レスポンスには、リソースの許可ポリシーが含まれます。次に例を示します。
{ "version": 1, "etag": "BwWKmjvelug=", "bindings": [ { "role": "roles/owner", "members": [ "user:owner@example.com" ] } ] }
テキスト エディタまたはプログラムでリソースの許可ポリシーを編集して、プリンシパルまたはロール バインディングの追加や削除を行います。たとえば、新しいロール バインディングの追加、既存のロール バインディングの削除、既存のロール バインディングからのプリンシパルの追加や削除を行うことができます。
setIamPolicy()
を呼び出して、更新された許可ポリシーを作成します。Resource Manager API の
setIamPolicy
メソッドを使用して、プロジェクト、フォルダまたは組織の新しい許可ポリシーとしてリクエストのポリシーを設定します。リクエストのデータを使用する前に、次のように置き換えます。
API_VERSION
: 使用する API のバージョン。プロジェクトと組織の場合は、v1
を使用します。フォルダの場合は、v2
を使用します。RESOURCE_TYPE
: ポリシーを管理するリソースタイプ。値projects
、folders
、またはorganizations
を使用します。RESOURCE_ID
: Google Cloud プロジェクト、組織、またはフォルダ ID。プロジェクト ID は英数字からなる文字列です(例:my-project
)。フォルダ ID と組織 ID は数値です(例:123456789012
)。-
POLICY
: 設定するポリシーの JSON 表現。ポリシーの形式については、ポリシー リファレンスをご覧ください。
HTTP メソッドと URL:
POST https://cloudresourcemanager.googleapis.com/API_VERSION/RESOURCE_TYPE/RESOURCE_ID:setIamPolicy
リクエストの本文(JSON):
{ "policy": POLICY }
リクエストを送信するには、次のいずれかのオプションを展開します。
レスポンスには、更新された許可ポリシーが含まれます。
次のステップ
- すべてのサービス エージェントのリストを表示する。
- プリンシパルにロールを付与する他の方法を確認する。
- ワークロードの ID として機能するユーザー管理のサービス アカウントを作成する方法を学習する。
- Google Cloud で Terraform を使用するためのベスト プラクティスの詳細を学習する。
- すべての Google Cloud Terraform のサンプルを確認する。