プロジェクト、フォルダ、組織へのアクセス権の管理

このページでは、プロジェクト、フォルダ、組織へのアクセス権の付与、変更、取り消しを行う方法について説明します。他のリソースへのアクセスを管理する方法については、次のガイドをご覧ください。

Identity and Access Management(IAM)では、IAM ポリシーによってアクセスを管理します。IAM ポリシーは Google Cloud リソースに接続されます。各ポリシーには、ユーザーやサービス アカウントなどの 1 つ以上のプリンシパルを IAM ロールに関連付けるロール バインディングのコレクションが含まれています。ロール バインディングは、ポリシーが接続されているリソースと、そのリソースのすべての子孫の両方のプリンシパルに、指定されたロールを付与します。IAM ポリシーの詳細については、ポリシーについてをご覧ください。

プロジェクト、フォルダ、組織へのアクセスは、Google Cloud Console、gcloud コマンドライン ツール、REST API、または Resource Manager クライアント ライブラリを使用して管理できます。

始める前に

Cloud Resource Manager API を有効にします。

API を有効にする

必要な権限

プロジェクト、フォルダ、組織へのアクセスを管理するには、次の権限を含むロールが必要です。ここで、RESOURCE_TYPE は、プリンシパルがアクセスを管理するリソースタイプ(projectsfolders、または organizations)です。

  • resourcemanager.RESOURCE_TYPE.get
  • resourcemanager.RESOURCE_TYPE.getIamPolicy
  • resourcemanager.RESOURCE_TYPE.setIamPolicy

これらの権限を最小権限の原則に従って取得するには、管理者に次のロールのいずれかを付与するよう依頼してください。

  • プロジェクトへのアクセスを管理する: プロジェクト IAM 管理者(roles/resourcemanager.projectIamAdmin
  • プロジェクトとフォルダへのアクセスを管理する: フォルダ管理者(roles/resourcemanager.folderAdmin
  • プロジェクト、フォルダ、組織へのアクセスを管理する: 組織管理者(roles/resourcemanager.organizationAdmin
  • ほぼすべての Google Cloud リソースへのアクセスを管理する: セキュリティ管理者(roles/iam.securityAdmin

あるいは、必要な権限を含む別のロールを管理者に付与してもらうこともできます。たとえば、カスタムロールや、許容範囲がより広い事前定義ロールなどです。

現在のアクセス権を表示する

プロジェクト、フォルダ、組織にアクセスできるユーザーを表示するには、Cloud Console、gcloud ツール、REST API、または Resource Manager クライアント ライブラリを使用します。

Console

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

    [IAM] に移動

  2. プロジェクト、フォルダ、または組織を選択します。

    Cloud Console には、プロジェクト、フォルダ、または組織のロールを付与されたすべてのプリンシパルが表示されます。このリストには、リソースに対するロールを親リソースから継承したプリンシパルも含まれています。ポリシー継承の詳細については、ポリシーの継承とリソース階層をご覧ください。

  3. 省略可: Google 管理のサービス アカウントに付与されたロールを表示するには、[Google 提供のロール付与を含みます] チェックボックスをオンにします。

gcloud

プロジェクト、フォルダ、組織にアクセスできるユーザーを確認するには、リソースの IAM ポリシーを取得します。IAM ポリシーの解釈方法については、ポリシーについてをご覧ください。

リソースの IAM ポリシーを取得するには、リソースの get-iam-policy コマンドを実行します。

gcloud RESOURCE_TYPE get-iam-policy RESOURCE_ID --format=FORMAT > PATH

次の値を指定します。

  • RESOURCE_TYPE: アクセス権を表示するリソースのタイプ。projectsresource-manager foldersorganizations のいずれかの値を使用します。
  • RESOURCE_ID: Google Cloud プロジェクト、フォルダ、または組織 ID。プロジェクト ID は英数字です(例: my-project)。フォルダ ID と組織 ID は数値です(例: 123456789012)。
  • FORMAT: ポリシーの形式。json または yaml を使用します。
  • PATH: ポリシーの新しい出力ファイルのパス。

たとえば、次のコマンドはプロジェクト my-project のポリシーを取得し、JSON 形式でホーム ディレクトリに保存します。

gcloud projects get-iam-policy my-project --format=json > ~/policy.json

REST

プロジェクト、フォルダ、組織にアクセスできるユーザーを確認するには、リソースの IAM ポリシーを取得します。IAM ポリシーの解釈方法については、ポリシーについてをご覧ください。

Resource Manager API の getIamPolicy メソッドは、プロジェクト、フォルダ、または組織の IAM ポリシーを取得します。

リクエストのデータを使用する前に、次のように置き換えます。

  • API_VERSION: 使用する API のバージョン。プロジェクトと組織の場合は、v1 を使用します。フォルダの場合は、v2 を使用します。
  • RESOURCE_TYPE: ポリシーを管理するリソースタイプ。値 projectsfolders、または 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
  }
}

リクエストを送信するには、次のいずれかのオプションを展開します。

レスポンスには、リソースの IAM ポリシーが含まれます。次に例を示します。

{
  "version": 1,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:owner@example.com"
      ]
    }
  ]
}

C#


using Google.Apis.Auth.OAuth2;
using Google.Apis.CloudResourceManager.v1;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy GetPolicy(string projectId)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(CloudResourceManagerService.Scope.CloudPlatform);
        var service = new CloudResourceManagerService(
            new CloudResourceManagerService.Initializer
            {
                HttpClientInitializer = credential
            });

        var policy = service.Projects.GetIamPolicy(new GetIamPolicyRequest(),
            projectId).Execute();
        return policy;
    }
}

Java

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.cloudresourcemanager.v3.CloudResourceManager;
import com.google.api.services.cloudresourcemanager.v3.model.GetIamPolicyRequest;
import com.google.api.services.cloudresourcemanager.v3.model.Policy;
import com.google.api.services.iam.v1.IamScopes;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

public class GetPolicy {

  // Gets a project's policy.
  public static Policy getPolicy(String projectId) {
    // projectId = "my-project-id"

    Policy policy = null;

    CloudResourceManager service = null;
    try {
      service = createCloudResourceManagerService();
    } catch (IOException | GeneralSecurityException e) {
      System.out.println("Unable to initialize service: \n" + e.toString());
      return policy;
    }

    try {
      GetIamPolicyRequest request = new GetIamPolicyRequest();
      policy = service.projects().getIamPolicy(projectId, request).execute();
      System.out.println("Policy retrieved: " + policy.toString());
      return policy;
    } catch (IOException e) {
      System.out.println("Unable to get policy: \n" + e.toString());
      return policy;
    }
  }

  public static CloudResourceManager createCloudResourceManagerService()
      throws IOException, GeneralSecurityException {
    // Use the Application Default Credentials strategy for authentication. For more info, see:
    // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));

    CloudResourceManager service =
        new CloudResourceManager.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

def get_policy(project_id, version=1):
    """Gets IAM policy for a project."""

    credentials = service_account.Credentials.from_service_account_file(
        filename=os.environ["GOOGLE_APPLICATION_CREDENTIALS"],
        scopes=["https://www.googleapis.com/auth/cloud-platform"],
    )
    service = googleapiclient.discovery.build(
        "cloudresourcemanager", "v1", credentials=credentials
    )
    policy = (
        service.projects()
        .getIamPolicy(
            resource=project_id,
            body={"options": {"requestedPolicyVersion": version}},
        )
        .execute()
    )
    print(policy)
    return policy

単一ロールの付与または取り消し

Cloud Console または gcloud ツールでは、リソースの IAM ポリシーを直接編集することなく、1 つのプリンシパルに対して 1 つのロールを付与または取り消すことができます。一般的なタイプのプリンシパルには、Google アカウント、サービス アカウント、Google グループ、ドメインがあります。プリンシパル タイプのリストについては、ID 関連のコンセプトをご覧ください。

単一ロールの付与

プリンシパルに 1 つのロールを付与する方法は次のとおりです。

Console

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

    [IAM] に移動

  2. プロジェクト、フォルダ、または組織を選択します。

  3. ロールを付与するプリンシパルを選択します。

    • リソースに対する他のロールをすでに持っているプリンシパルにロールを付与するには、プリンシパルのメールアドレスを含む行を見つけて、対象の行で [プリンシパルを編集] をクリックし、[別のロールを追加] をクリックします。

      Google が管理するサービス アカウントにロールを付与するには、[Google 提供のロール付与を含みます] チェックボックスをオンにして、そのメールアドレスを表示します。

    • リソースに対して他のロールを持たないプリンシパルにロールを付与するには、[追加] をクリックし、プリンシパルのメールアドレスを入力します。

  4. 付与するロールをプルダウン リストから選択します。最善のセキュリティを得るため、プリンシパルが必要とする権限のみを含むロールを選択してください。

  5. (省略可)ロールに条件を追加します。

  6. [保存] をクリックします。リソースのロールがプリンシパルに付与されます。

複数のプロジェクト、フォルダ、組織のプリンシパルにロールを付与するには、次のようにします。

  1. Cloud Console で [リソースの管理] ページに移動します。

    [リソースの管理] に移動

  2. 権限を付与するプロジェクトをすべて選択します。

  3. 情報パネルが表示されていない場合は、[情報パネルを表示] をクリックします。次に、[権限] をクリックします。

  4. ロールを付与するプリンシパルを選択します。

    • すでに他のロールを持っているプリンシパルにロールを付与するには、プリンシパルのメールアドレスを含む行を見つけて、対象の行で [プリンシパルを編集します] をクリックし、[別のロールを追加] をクリックします。

    • 他のロールを持たないプリンシパルにロールを付与するには、[プリンシパルを追加] をクリックし、プリンシパルのメールアドレスを入力します。

  5. 付与するロールをプルダウン リストから選択します。

  6. (省略可)ロールに条件を追加します。

  7. [保存] をクリックします。選択した各リソースで、選択したロールがプリンシパルに付与されます。

gcloud

プリンシパルにロールをすばやく付与するには、add-iam-policy-binding コマンドを実行します。

gcloud RESOURCE_TYPE add-iam-policy-binding RESOURCE_ID \
    --member=PRINCIPAL --role=ROLE_ID \
    --condition=CONDITION

次の値を指定します。

  • RESOURCE_TYPE: アクセスを管理するリソースタイプ。projectsresource-manager folders、または organizations を使用します。
  • RESOURCE_ID: Google Cloud プロジェクト、フォルダ、または組織 ID。プロジェクト ID は英数字です(例: my-project)。フォルダ ID と組織 ID は数値です(例: 123456789012)。
  • PRINCIPAL: プリンシパルまたはメンバーの識別子。通常、PRINCIPAL_TYPE:ID の形式で指定します。例: user:my-user@example.comPRINCIPAL に使用できる値の一覧については、ポリシー バインディングのリファレンスをご覧ください。

    プリンシパル タイプが user の場合、識別子に含まれるドメイン名は Google Workspace ドメインまたは Cloud Identity ドメインである必要があります。Cloud Identity ドメインの設定方法については、Cloud Identity の概要をご覧ください。

  • ROLE_ID: 付与するロールの名前。例: roles/resourcemanager.projectCreatorロールのリストについては、ロールについてをご覧ください。

  • CONDITION: 省略可。ロール バインディングに追加する条件。条件の詳細については、条件の概要をご覧ください。

たとえば、プロジェクト my-project のユーザー my-user@example.com にプロジェクト作成者ロールを付与するには、次のコマンドを使用します。

gcloud projects add-iam-policy-binding my-project \
    --member=user:my-user@example.com --role=roles/resourcemanager.projectCreator

単一ロールの取り消し

プリンシパルの 1 つのロールを取り消すには、次の手順を行います。

Console

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

    IAM に移動

  2. プロジェクト、フォルダ、または組織を選択します。

  3. アクセス権を取り消すプリンシパルのメールアドレスが含まれる行を探します。その行の [プリンシパルを編集します] をクリックします。

  4. 取り消す役割ごとに [削除]()ボタンをクリックし、[保存] をクリックします。

gcloud

ユーザーのロールをすばやく取り消すには、remove-iam-policy-binding コマンドを実行します。

gcloud RESOURCE_TYPE remove-iam-policy-binding RESOURCE_ID \
    --member=PRINCIPAL --role=ROLE_ID

次の値を指定します。

  • RESOURCE_TYPE: アクセスを管理するリソースタイプ。projectsresource-manager folders、または organizations を使用します。
  • RESOURCE_ID: Google Cloud プロジェクト、フォルダ、または組織 ID。プロジェクト ID は英数字です(例: my-project)。フォルダ ID と組織 ID は数値です(例: 123456789012)。
  • PRINCIPAL: プリンシパルまたはメンバーの識別子。通常、PRINCIPAL_TYPE:ID の形式で指定します。例: user:my-user@example.comPRINCIPAL に使用できる値の一覧については、ポリシー バインディングのリファレンスをご覧ください。

    プリンシパル タイプが user の場合、識別子に含まれるドメイン名は Google Workspace ドメインまたは Cloud Identity ドメインである必要があります。Cloud Identity ドメインの設定方法については、Cloud Identity の概要をご覧ください。

  • ROLE_ID: 取り消すロールの名前。例: roles/resourcemanager.projectCreatorロールのリストについては、ロールについてをご覧ください。

たとえば、プロジェクト my-project のユーザー my-user@example.com のプロジェクト作成者のロールを取り消すには、次のコマンドを使用します。

gcloud projects remove-iam-policy-binding my-project \
    --member=user:my-user@example.com --role=roles/resourcemanager.projectCreator

複数のロールの付与または取り消し

複数のロールの付与と取り消しを伴う大幅なアクセス権の変更を行うには、read-modify-write のパターンを使用して、リソースの IAM ポリシーを更新します。

  1. getIamPolicy() を呼び出して、現在のポリシーを読み取ります。
  2. 返されたポリシーをテキスト エディタまたはプログラムで編集し、プリンシパルまたはロール バインディングの追加や削除を行います。
  3. setIamPolicy() を呼び出して、更新されたポリシーを書き込みます。

ポリシーを更新するには、gcloud ツール、REST API、または Resource Manager クライアント ライブラリを使用します。

現在のポリシーを取得する

gcloud

リソースの IAM ポリシーを取得するには、リソースの get-iam-policy コマンドを実行します。

gcloud RESOURCE_TYPE get-iam-policy RESOURCE_ID --format=FORMAT > PATH

次の値を指定します。

  • RESOURCE_TYPE: ポリシーを取得するリソースのタイプ。projectsresource-manager foldersorganizations のいずれかを使用します。
  • RESOURCE_ID: Google Cloud プロジェクト、フォルダ、または組織 ID。プロジェクト ID は英数字です(例: my-project)。フォルダ ID と組織 ID は数値です(例: 123456789012)。
  • FORMAT: ポリシーの形式。json または yaml を使用します。
  • PATH: ポリシーの新しい出力ファイルのパス。

たとえば、次のコマンドはプロジェクト my-project のポリシーを取得し、JSON 形式でホーム ディレクトリに保存します。

gcloud projects get-iam-policy my-project --format json > ~/policy.json

REST

Resource Manager API の getIamPolicy メソッドは、プロジェクト、フォルダ、または組織の IAM ポリシーを取得します。

リクエストのデータを使用する前に、次のように置き換えます。

  • API_VERSION: 使用する API のバージョン。プロジェクトと組織の場合は、v1 を使用します。フォルダの場合は、v2 を使用します。
  • RESOURCE_TYPE: ポリシーを管理するリソースタイプ。値 projectsfolders、または 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
  }
}

リクエストを送信するには、次のいずれかのオプションを展開します。

レスポンスには、リソースの IAM ポリシーが含まれます。次に例を示します。

{
  "version": 1,
  "etag": "BwWKmjvelug=",
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:owner@example.com"
      ]
    }
  ]
}

レスポンスを適切なタイプ(json または yaml)のファイルに保存します。

C#


using Google.Apis.Auth.OAuth2;
using Google.Apis.CloudResourceManager.v1;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy GetPolicy(string projectId)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(CloudResourceManagerService.Scope.CloudPlatform);
        var service = new CloudResourceManagerService(
            new CloudResourceManagerService.Initializer
            {
                HttpClientInitializer = credential
            });

        var policy = service.Projects.GetIamPolicy(new GetIamPolicyRequest(),
            projectId).Execute();
        return policy;
    }
}

Java

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.cloudresourcemanager.v3.CloudResourceManager;
import com.google.api.services.cloudresourcemanager.v3.model.GetIamPolicyRequest;
import com.google.api.services.cloudresourcemanager.v3.model.Policy;
import com.google.api.services.iam.v1.IamScopes;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

public class GetPolicy {

  // Gets a project's policy.
  public static Policy getPolicy(String projectId) {
    // projectId = "my-project-id"

    Policy policy = null;

    CloudResourceManager service = null;
    try {
      service = createCloudResourceManagerService();
    } catch (IOException | GeneralSecurityException e) {
      System.out.println("Unable to initialize service: \n" + e.toString());
      return policy;
    }

    try {
      GetIamPolicyRequest request = new GetIamPolicyRequest();
      policy = service.projects().getIamPolicy(projectId, request).execute();
      System.out.println("Policy retrieved: " + policy.toString());
      return policy;
    } catch (IOException e) {
      System.out.println("Unable to get policy: \n" + e.toString());
      return policy;
    }
  }

  public static CloudResourceManager createCloudResourceManagerService()
      throws IOException, GeneralSecurityException {
    // Use the Application Default Credentials strategy for authentication. For more info, see:
    // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));

    CloudResourceManager service =
        new CloudResourceManager.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

def get_policy(project_id, version=1):
    """Gets IAM policy for a project."""

    credentials = service_account.Credentials.from_service_account_file(
        filename=os.environ["GOOGLE_APPLICATION_CREDENTIALS"],
        scopes=["https://www.googleapis.com/auth/cloud-platform"],
    )
    service = googleapiclient.discovery.build(
        "cloudresourcemanager", "v1", credentials=credentials
    )
    policy = (
        service.projects()
        .getIamPolicy(
            resource=project_id,
            body={"options": {"requestedPolicyVersion": version}},
        )
        .execute()
    )
    print(policy)
    return policy

ポリシーを変更する

特定のユーザーに対するロールの付与または取り消しを反映するには、プログラムまたはテキスト エディタを使用して、リソースのポリシーのローカルコピーを変更します。

他のポリシーの変更を上書きしないため、ポリシーの etag フィールドは編集または削除しないでください。etag フィールドは、現在のポリシーの状態を表します。更新したポリシーを設定すると、IAM ではリクエスト内の etag 値と既存の etag を比較し、値が一致する場合にのみポリシーを書き込みます。

ロールを付与する

プリンシパルにロールを付与するには、ポリシーのロール バインディングを変更します。付与できるロールについては、ロールについてまたはリソースに対して付与可能なロールの表示をご覧ください。

すでにポリシーに含まれているロールを付与するには、既存のロール バインディングにプリンシパルを追加します。

gcloud

プリンシパルを既存のロール バインディングに追加して、返されたポリシーを編集します。このポリシーの変更は、更新したポリシーを設定するまで有効になりません。

たとえば、返されたポリシーに次のロール バインディングが含まれていて、kai@example.com にセキュリティ審査担当者ロール(roles/iam.securityReviewer)が付与されているとします。

{
  "role": "roles/iam.securityReviewer",
  "members": [
    "user:kai@example.com"
  ]
}

同じロールを raha@example.com に付与するには、既存のロール バインディングに raha@example.com を追加します。

{
  "role": "roles/iam.securityReviewer",
  "members": [
    "user:kai@example.com",
    "user:raha@example.com"
  ]
}

REST

プリンシパルを既存のロール バインディングに追加して、返されたポリシーを編集します。このポリシーの変更は、更新したポリシーを設定するまで有効になりません。

たとえば、返されたポリシーに次のロール バインディングが含まれていて、kai@example.com にセキュリティ審査担当者ロール(roles/iam.securityReviewer)が付与されているとします。

{
  "role": "roles/iam.securityReviewer",
  "members": [
    "user:kai@example.com"
  ]
}

同じロールを raha@example.com に付与するには、既存のロール バインディングに raha@example.com を追加します。

{
  "role": "roles/iam.securityReviewer",
  "members": [
    "user:kai@example.com",
    "user:raha@example.com"
  ]
}

C#

Resource Manager 用のクライアント ライブラリをインストールして使用する方法については、Resource Manager クライアント ライブラリをご覧ください。


using System.Linq;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy AddMember(Policy policy, string role, string member)
    {
        var binding = policy.Bindings.First(x => x.Role == role);
        binding.Members.Add(member);
        return policy;
    }
}

Java

Resource Manager 用のクライアント ライブラリをインストールして使用する方法については、Resource Manager クライアント ライブラリをご覧ください。

import com.google.api.services.cloudresourcemanager.v3.model.Binding;
import com.google.api.services.cloudresourcemanager.v3.model.Policy;
import java.util.List;

public class AddMember {

  // Adds a member to a preexisting role.
  public static void addMember(Policy policy) {
    // policy = service.Projects.GetIAmPolicy(new GetIamPolicyRequest(), your-project-id).Execute();

    String role = "roles/existing-role";
    String member = "user:member-to-add@example.com";

    List<Binding> bindings = policy.getBindings();

    for (Binding b : bindings) {
      if (b.getRole().equals(role)) {
        b.getMembers().add(member);
        System.out.println("Member " + member + " added to role " + role);
        return;
      }
    }

    System.out.println("Role not found in policy; member not added");
  }
}

Python

Resource Manager 用のクライアント ライブラリをインストールして使用する方法については、Resource Manager クライアント ライブラリをご覧ください。

def modify_policy_add_member(policy, role, member):
    """Adds a new member to a role binding."""

    binding = next(b for b in policy["bindings"] if b["role"] == role)
    binding["members"].append(member)
    print(binding)
    return policy

まだポリシーに含まれていないロールを付与するには、新しいロール バインディングを追加します。

gcloud

プリンシパルにロールを付与する新しいロール バインディングを追加して、返されたポリシーを編集します。このポリシーの変更は、更新されたポリシーを設定するまで有効になりません。

たとえば、Compute ストレージ管理者ロール(roles/compute.storageAdmin)を raha@example.com に付与するには、ポリシーの bindings 配列に次のロール バインディングを追加します。

{
  "role": "roles/compute.storageAdmin",
  "members": [
    "user:raha@example.com"
  ]
}

REST

プリンシパルにロールを付与する新しいロール バインディングを追加して、返されたポリシーを編集します。このポリシーの変更は、更新されたポリシーを設定するまで有効になりません。

たとえば、Compute ストレージ管理者ロール(roles/compute.storageAdmin)を raha@example.com に付与するには、ポリシーの bindings 配列に次のロール バインディングを追加します。

{
  "role": "roles/compute.storageAdmin",
  "members": [
    "user:raha@example.com"
  ]
}

C#

Resource Manager 用のクライアント ライブラリをインストールして使用する方法については、Resource Manager クライアント ライブラリをご覧ください。


using System.Collections.Generic;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy AddBinding(Policy policy, string role, string member)
    {
        var binding = new Binding
        {
            Role = role,
            Members = new List<string> { member }
        };
        policy.Bindings.Add(binding);
        return policy;
    }
}

Java

Resource Manager 用のクライアント ライブラリをインストールして使用する方法については、Resource Manager クライアント ライブラリをご覧ください。

import com.google.api.services.cloudresourcemanager.v3.model.Binding;
import com.google.api.services.cloudresourcemanager.v3.model.Policy;
import java.util.ArrayList;
import java.util.List;

public class AddBinding {

  // Adds a member to a role with no previous members.
  public static void addBinding(Policy policy) {
    // policy = service.Projects.GetIAmPolicy(new GetIamPolicyRequest(), your-project-id).Execute();

    String role = "roles/role-to-add";
    List<String> members = new ArrayList<String>();
    members.add("user:member-to-add@example.com");

    Binding binding = new Binding();
    binding.setRole(role);
    binding.setMembers(members);

    policy.getBindings().add(binding);
    System.out.println("Added binding: " + binding.toString());
  }
}

Python

Resource Manager 用のクライアント ライブラリをインストールして使用する方法については、Resource Manager クライアント ライブラリをご覧ください。

def modify_policy_add_role(policy, role, member):
    """Adds a new role binding to a policy."""

    binding = {"role": role, "members": [member]}
    policy["bindings"].append(binding)
    print(policy)
    return policy

アクティブ化された API サービスに関連するロールのみを付与できます。Compute Engine などのサービスが有効でない場合は、Compute Engine のみに関連する役割を付与することはできません。詳細については、API を有効または無効にするをご覧ください。

プロジェクトに権限を付与する場合、特にオーナーロール(roles/owner)を付与するときには、いくつかの制約があります。詳細については、projects.setIamPolicy() リファレンス ドキュメントをご覧ください。

ロールを取り消す

ロールを取り消すには、ロール バインディングからプリンシパルを削除します。ロール バインディングに他のプリンシパルがない場合は、ロール バインディング全体を削除します。

gcloud

get-iam-policy コマンドで返された JSON または YAML ポリシーを編集して、ロールを取り消します。このポリシーの変更は、更新されたポリシーを設定するまで有効になりません。

プリンシパルのロールを取り消すには、ポリシーの bindings 配列から目的のプリンシパルまたはバインディングを削除します。

REST

get-iam-policy コマンドで返された JSON または YAML ポリシーを編集して、ロールを取り消します。このポリシーの変更は、更新されたポリシーを設定するまで有効になりません。

プリンシパルのロールを取り消すには、ポリシーの bindings 配列から目的のプリンシパルまたはバインディングを削除します。

C#

Resource Manager 用のクライアント ライブラリをインストールして使用する方法については、Resource Manager クライアント ライブラリをご覧ください。


using System.Linq;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy RemoveMember(Policy policy, string role, string member)
    {
        try
        {
            var binding = policy.Bindings.First(x => x.Role == role);
            if (binding.Members.Count != 0 && binding.Members.Contains(member))
            {
                binding.Members.Remove(member);
            }
            if (binding.Members.Count == 0)
            {
                policy.Bindings.Remove(binding);
            }
            return policy;
        }
        catch (System.InvalidOperationException e)
        {
            System.Diagnostics.Debug.WriteLine("Role does not exist in policy: \n" + e.ToString());
            return policy;
        }
    }
}

Java

Resource Manager 用のクライアント ライブラリをインストールして使用する方法については、Resource Manager クライアント ライブラリをご覧ください。

import com.google.api.services.cloudresourcemanager.v3.model.Binding;
import com.google.api.services.cloudresourcemanager.v3.model.Policy;
import java.util.List;

public class RemoveMember {

  // Removes member from a role; removes binding if binding contains 0 members.
  public static void removeMember(Policy policy) {
    // policy = service.Projects.GetIAmPolicy(new GetIamPolicyRequest(), your-project-id).Execute();

    String role = "roles/existing-role";
    String member = "user:member-to-remove@example.com";

    List<Binding> bindings = policy.getBindings();
    Binding binding = null;
    for (Binding b : bindings) {
      if (b.getRole().equals(role)) {
        binding = b;
      }
    }
    if (binding.getMembers().contains(member)) {
      binding.getMembers().remove(member);
      System.out.println("Member " + member + " removed from " + role);
      if (binding.getMembers().isEmpty()) {
        policy.getBindings().remove(binding);
      }
      return;
    }

    System.out.println("Role not found in policy; member not removed");
    return;
  }
}

Python

Resource Manager 用のクライアント ライブラリをインストールして使用する方法については、Resource Manager クライアント ライブラリをご覧ください。

def modify_policy_remove_member(policy, role, member):
    """Removes a  member from a role binding."""
    binding = next(b for b in policy["bindings"] if b["role"] == role)
    if "members" in binding and member in binding["members"]:
        binding["members"].remove(member)
    print(binding)
    return policy

ポリシーを設定する

必要なロールを付与または取り消すようにポリシーを変更した後、setIamPolicy() を呼び出して更新します。

gcloud

リソースの IAM ポリシーを設定するには、リソースの set-iam-policy コマンドを実行します。

gcloud RESOURCE_TYPE set-iam-policy RESOURCE_ID PATH

次の値を指定します。

  • RESOURCE_TYPE: ポリシーを設定するリソースのタイプ。projectsresource-manager foldersorganizations のいずれかを使用します。
  • RESOURCE_ID: Google Cloud プロジェクト、フォルダ、または組織 ID。プロジェクト ID は英数字です(例: my-project)。フォルダ ID と組織 ID は数値です(例: 123456789012)。
  • PATH: 新しいポリシーを含むファイルのパス。

レスポンスには、更新されたポリシーが含まれます。

たとえば、次のコマンドは、policy.json に保存されているポリシーをプロジェクト my-project のポリシーとして設定します。

gcloud projects set-iam-policy my-project ~/policy.json

REST

Resource Manager API の setIamPolicy メソッドを使用して、プロジェクト、フォルダまたは組織の新しい IAM ポリシーとしてリクエストのポリシーを設定します。

リクエストのデータを使用する前に、次のように置き換えます。

  • API_VERSION: 使用する API のバージョン。プロジェクトと組織の場合は、v1 を使用します。フォルダの場合は、v2 を使用します。
  • RESOURCE_TYPE: ポリシーを管理するリソースタイプ。値 projectsfolders、または organizations を使用します。
  • RESOURCE_ID: Google Cloud プロジェクト、組織、またはフォルダ ID。プロジェクト ID は英数字からなる文字列です(例: my-project)。フォルダ ID と組織 ID は数値です(例: 123456789012)。
  • POLICY: 設定するポリシーの JSON 表現。ポリシーの形式については、ポリシー リファレンスをご覧ください。

    たとえば、前の手順で示したポリシーを設定するには、POLICY を次のコードに置き換えます。

    {
      "version": 1,
      "etag": "BwUqLaVeua8=",
      "bindings": [
        {
          "role": "roles/iam.serviceAccountUser",
          "members": [
            "user:robin@example.com"
          ]
        },
        {
          "role": "roles/owner",
          "members": [
            "user:owner@example.com"
          ]
        }
      ]
    }
    

HTTP メソッドと URL:

POST https://iam.googleapis.com/API_VERSION/RESOURCE_TYPE/RESOURCE_ID:setIamPolicy

JSON 本文のリクエスト:

{
  "policy": POLICY
}

リクエストを送信するには、次のいずれかのオプションを展開します。

レスポンスには、更新されたポリシーが含まれます。

C#


using Google.Apis.Auth.OAuth2;
using Google.Apis.CloudResourceManager.v1;
using Google.Apis.CloudResourceManager.v1.Data;

public partial class AccessManager
{
    public static Policy SetPolicy(string projectId, Policy policy)
    {
        var credential = GoogleCredential.GetApplicationDefault()
            .CreateScoped(CloudResourceManagerService.Scope.CloudPlatform);
        var service = new CloudResourceManagerService(
            new CloudResourceManagerService.Initializer
            {
                HttpClientInitializer = credential
            });

        return service.Projects.SetIamPolicy(new SetIamPolicyRequest
        {
            Policy = policy
        }, projectId).Execute();
    }
}

Java

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.cloudresourcemanager.v3.CloudResourceManager;
import com.google.api.services.cloudresourcemanager.v3.model.Policy;
import com.google.api.services.cloudresourcemanager.v3.model.SetIamPolicyRequest;
import com.google.api.services.iam.v1.IamScopes;
import com.google.auth.http.HttpCredentialsAdapter;
import com.google.auth.oauth2.GoogleCredentials;
import java.io.IOException;
import java.security.GeneralSecurityException;
import java.util.Collections;

public class SetPolicy {

  // Sets a project's policy.
  public static void setPolicy(Policy policy, String projectId) {
    // policy = service.Projects.GetIAmPolicy(new GetIamPolicyRequest(), your-project-id).Execute();
    // projectId = "my-project-id"

    CloudResourceManager service = null;
    try {
      service = createCloudResourceManagerService();
    } catch (IOException | GeneralSecurityException e) {
      System.out.println("Unable to initialize service: \n" + e.toString());
      return;
    }

    try {
      SetIamPolicyRequest request = new SetIamPolicyRequest();
      request.setPolicy(policy);
      Policy response = service.projects().setIamPolicy(projectId, request).execute();
      System.out.println("Policy set: " + response.toString());
    } catch (IOException e) {
      System.out.println("Unable to set policy: \n" + e.toString());
    }
  }

  public static CloudResourceManager createCloudResourceManagerService()
      throws IOException, GeneralSecurityException {
    // Use the Application Default Credentials strategy for authentication. For more info, see:
    // https://cloud.google.com/docs/authentication/production#finding_credentials_automatically
    GoogleCredentials credential =
        GoogleCredentials.getApplicationDefault()
            .createScoped(Collections.singleton(IamScopes.CLOUD_PLATFORM));

    CloudResourceManager service =
        new CloudResourceManager.Builder(
                GoogleNetHttpTransport.newTrustedTransport(),
                JacksonFactory.getDefaultInstance(),
                new HttpCredentialsAdapter(credential))
            .setApplicationName("service-accounts")
            .build();
    return service;
  }
}

Python

def set_policy(project_id, policy):
    """Sets IAM policy for a project."""

    credentials = service_account.Credentials.from_service_account_file(
        filename=os.environ["GOOGLE_APPLICATION_CREDENTIALS"],
        scopes=["https://www.googleapis.com/auth/cloud-platform"],
    )
    service = googleapiclient.discovery.build(
        "cloudresourcemanager", "v1", credentials=credentials
    )

    policy = (
        service.projects()
        .setIamPolicy(resource=project_id, body={"policy": policy})
        .execute()
    )
    print(policy)
    return policy

次のステップ

使ってみる

Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。

無料で開始