リソースへのアクセス権の付与、変更、取り消し

このページでは、リソースへのアクセス権を付与、変更、取り消す方法について説明します。IAM の細かなロールを使用することによって、所有しているリソースへの異なるレベルのアクセス権をさまざまなユーザーに付与できます。

このページの例は、プロジェクトに対するアクセス権を変更する方法を示しています。ただし、これらの手順を変更して、IAM ポリシーをサポートする Google Cloud リソースに対するアクセス権を変更することもできます。特定のリソースに対するアクセス権を変更する方法については、リソースのリファレンス ドキュメントをご覧ください。

ユーザーロールは、Cloud Console、gcloud コマンドライン ツール、REST API またはクライアント ライブラリで管理できます。Cloud Console を使用するのが最も簡単な方法ですので、この記事の前半では Cloud Console で管理する方法について説明します。迅速に更新する場合は gcloud コマンドライン ツールを使用します。より複雑なシナリオの場合はプログラムを使用して管理します。これらについては記事の後半で説明します。

Identity-Aware Proxy(IAP)で IAM を使用してアプリケーションへのアクセスを保護する場合は、IAP のドキュメントをご覧ください。

始める前に

Cloud Console の使用

Cloud Console を使用すると、ユーザーロールを簡単に管理できます。

アクセス権の付与

チームメンバーをプロジェクトに追加し、そのメンバーに IAM ロールを付与するには:

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

    [IAM] ページに移動

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

  3. メールアドレスを入力します。個人、サービス アカウント、Google グループをメンバーとして追加することはできますが、すべてのプロジェクトに少なくとも 1 人のメンバーが必要です。

  4. 役割を選択します。役割はメンバーに適切な権限レベルを付与します。最善のセキュリティを得るため、必要最小限の権限をメンバーに付与することを強くおすすめします。オーナーレベルの権限を持つメンバーはプロジェクト オーナーでもあり、プロジェクトのシャットダウンを含めてプロジェクトのすべての側面を管理できます。

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

複数のプロジェクトに関して、1 人のメンバーに 1 つのロールを付与するには:

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

    [リソースの管理] ページを開く

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

  3. [情報パネルを表示]、[権限] タブの順にクリックします。

  4. [新しいメンバー] フィールドにメールアドレスを入力し、プルダウン メニューから目的のロールを選択します。

  5. [保存] をクリックします。選択したプロジェクトごとに、選択したロールがメンバーに付与されます。

アクセス権の取り消し

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

    [IAM] ページに移動

  2. アクセスを取り消すメンバーを見つけて、右側の [編集]()ボタンをクリックします。

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

アクセス権の変更

アクセスを変更するための特別な手順はありません。ユーザーが目的の役割を得られるまで、アクセス権の許可と取り消しの手順に従います。

gcloud による更新

1 つのロールを追加または取り消すには、gcloud コマンドライン ツールadd-iam-policy-binding コマンドと remove-iam-policy-binding コマンドを使用します。

アクセス権の付与

メンバーにロールをすぐに付与するには、gcloud ツールの add-iam-policy-binding コマンドを実行します。

gcloud group add-iam-policy-binding resource \
    --member=member --role=role-id

次の値を指定します。

  • group: 更新するリソースの gcloud ツールグループ。たとえば、projects または organizations を使用できます。
  • resource: リソースの名前。
  • member: メンバーの識別子。通常、member-type:id の形式で指定します。例: user:my-user@example.commember に使用できる値の一覧については、ポリシー バインディングのリファレンスをご覧ください。

  • role-id: ロールの名前。

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

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

アクセス権の取り消し

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

gcloud group remove-iam-policy-binding resource \
    --member=member --role=role-id

次の値を指定します。

  • group: 更新するリソースの gcloud ツールグループ。たとえば、projects または organizations を使用できます。
  • resource: リソースの名前。
  • member: メンバーの識別子。通常、member-type:id の形式で指定します。例: user:my-user@example.commember に使用できる値の一覧については、ポリシー バインディングのリファレンスをご覧ください。

  • role-id: ロールの名前。

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

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

プログラムによるアクセスの制御

プログラムでアクセス制御を管理したほうが簡単な場合もあります。プログラムでアクセスを制御するには、gcloud コマンドライン ツールREST API またはクライアント ライブラリを使用します。Cloud Console で大規模な更新や自動更新を行うと、処理に時間がかかることがあります。また、メンバーごとに gcloud コマンドを実行するのも手間がかかります。このような場合、プログラムを使用すると、効率的に作業を行うことができます。

IAM ポリシーの概要

リソースへのアクセスは、IAM ポリシーによって管理されます。ポリシーは、ユーザー アカウントやサービス アカウントなどのメンバーをロールに関連付けるバインディングのコレクションです。ポリシーは JSON または YAML を使用して表現されます。

次の例のポリシーでは、fatima@example.com にオーナー役割が付与され、wei@example.comservice-account-13@appspot.gserviceaccount.com に編集者の役割が付与されています。

{
  "bindings": [
    {
      "role": "roles/owner",
      "members": [
        "user:fatima@example.com"
      ]
    },
    {
      "role": "roles/editor",
      "members": [
        "serviceAccount:service-account-13@appspot.gserviceaccount.com",
        "user:wei@example.com"
      ]
    }
  ],
  "etag": "BwUjMhCsNvY=",
  "version": 1
}

リソースのポリシーを更新するには、read-modify-write パターンを使用します。つまり、ユーザーのアクセス権の作成、変更、取り消しのために専用のメソッドはありません。代わりに、すべての変更は次の手順で行われます。

  1. getIamPolicy() を呼び出して、現在のポリシーを読み取ります。
  2. テキスト エディタを使用するかプログラムを使用して、返されたポリシーを編集し、目的のメンバーとそのメンバーに付与される役割の追加や削除を行います。
  3. setIamPolicy() を呼び出して、更新されたポリシーを書き込みます。

プロジェクト全体、または組織全体に権限を付与することは一般的です。Compute Engine インスタンスCloud Storage バケットなど、より広い範囲の Google Cloud リソースに対して、よりきめ細かくレベルでポリシーを設定することもできます。ロールの全リストと、各ロールを付与できる最も低いリソースレベルについては、ロールについてをご覧ください。

以下のセクションでは、プロジェクトのポリシーを取得、変更、設定する方法について説明します。ただし、これらの手順を変更して、独自の IAM ポリシーをサポートするリソースのポリシーを取得、変更、設定することもできます。プロジェクト以外のリソースのポリシーを変更するには、そのリソースの get-iam-policyset-iam-policy の gcloud コマンドまたは getIamPolicy()setIamPolicy() REST API メソッドを確認し、このページの現在のポリシーの取得ポリシーの設定で、これらのコマンドまたはメソッドを使用します。

現在のポリシーの取得

gcloud コマンド

リソースに対して get-iam-policy コマンドを実行します。次の例は、プロジェクトの get-iam-policy コマンドを示しています。

gcloud projects get-iam-policy project-id --format=format > filepath

次の値を指定します。

  • project-id: 更新するプロジェクト(たとえば my-project)。
  • format: 値 json または yaml
  • filepath: ポリシーの新しい出力ファイルのパス。

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

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

REST API

Resource Manager API の projects.getIamPolicy メソッドは、プロジェクトの IAM ポリシーを取得します。

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

  • project-id: Google Cloud プロジェクト ID
  • policy-version: 返されるポリシー バージョン。リクエストでは、最新のポリシー バージョン(ポリシー バージョン 3)を指定する必要があります。詳細については、ポリシーの取得時にポリシー バージョンを指定するをご覧ください。

HTTP メソッドと URL:

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

JSON 本文のリクエスト:

{
  "options": {
    "requestedPolicyVersion": policy-version
  }
}

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

次のような JSON レスポンスが返されます。

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

C#

このサンプルを試す前に、IAM クイックスタート: クライアント ライブラリの使用の C# の設定手順を実施してください。詳細については、IAM C# API のリファレンス ドキュメントをご覧ください。


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

このサンプルを試す前に、IAM クイックスタート: クライアント ライブラリの使用の Java の設定手順を実施してください。詳細については、IAM Java API のリファレンス ドキュメントをご覧ください。

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.cloudresourcemanager.CloudResourceManager;
import com.google.api.services.cloudresourcemanager.model.GetIamPolicyRequest;
import com.google.api.services.cloudresourcemanager.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

このサンプルを試す前に、IAM クイックスタート: クライアント ライブラリの使用の Python の手順に従って設定を行ってください。詳細については、IAM Python API のリファレンス ドキュメントをご覧ください。

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

ポリシーの変更

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

ロールの付与

メンバーにロールを付与するには、ポリシーのロール バインディングを変更します。付与できるロールについては、ロールについてをご覧ください。

すでにポリシーに含まれているロールを付与するには:

gcloud コマンド

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

次の例では、セキュリティ審査担当者のロール(roles/iam.securityReviewer)を wei@example.com に付与します。このロールを付与するには、バインディングの members 配列にユーザーを追加します。

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

REST API

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

次の例では、セキュリティ審査担当者のロール(roles/iam.securityReviewer)を wei@example.com に付与します。このロールを付与するには、バインディングの members 配列にユーザーを追加します。

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

C#

このサンプルを試す前に、IAM クイックスタート: クライアント ライブラリの使用の C# の設定手順を実施してください。詳細については、IAM C# API のリファレンス ドキュメントをご覧ください。


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

このサンプルを試す前に、IAM クイックスタート: クライアント ライブラリの使用の Java の設定手順を実施してください。詳細については、IAM Java API のリファレンス ドキュメントをご覧ください。

import com.google.api.services.cloudresourcemanager.model.Binding;
import com.google.api.services.cloudresourcemanager.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

このサンプルを試す前に、IAM クイックスタート: クライアント ライブラリの使用の Python の手順に従って設定を行ってください。詳細については、IAM Python API のリファレンス ドキュメントをご覧ください。

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

まだポリシーに含まれていないロールを付与するには、新しい binding を追加します。

gcloud コマンド

get-iam-policy コマンドで返された JSON または YAML ポリシーを編集して、新しいバインディングを追加します。このポリシーの変更は、更新されたポリシーを設定するまで有効になりません。

次の例では、読み取りのロールを fatima@example.com に付与しています。このロールを付与するには、新しいバインディングを bindings ポリシーの配列に追加します。

{
  "role": "roles/reader",
  "members": [
    "user:fatima@example.com"
  ]
}

REST API

get-iam-policy コマンドで返された JSON または YAML ポリシーを編集して、新しいバインディングを追加します。このポリシーの変更は、更新されたポリシーを設定するまで有効になりません。

次の例では、読み取りのロールを fatima@example.com に付与しています。このロールを付与するには、新しいバインディングを bindings ポリシーの配列に追加します。

{
  "role": "roles/reader",
  "members": [
    "user:fatima@example.com"
  ]
}

C#

このサンプルを試す前に、IAM クイックスタート: クライアント ライブラリの使用の C# の設定手順を実施してください。詳細については、IAM C# API のリファレンス ドキュメントをご覧ください。


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

このサンプルを試す前に、IAM クイックスタート: クライアント ライブラリの使用の Java の設定手順を実施してください。詳細については、IAM Java API のリファレンス ドキュメントをご覧ください。

import com.google.api.services.cloudresourcemanager.model.Binding;
import com.google.api.services.cloudresourcemanager.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

このサンプルを試す前に、IAM クイックスタート: クライアント ライブラリの使用の Python の手順に従って設定を行ってください。詳細については、IAM Python API のリファレンス ドキュメントをご覧ください。

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 を有効または無効にするをご覧ください。

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

ロールの取り消し

役割を取り消すには、次のコマンドを実行します。

gcloud コマンド

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

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

REST API

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

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

C#

このサンプルを試す前に、IAM クイックスタート: クライアント ライブラリの使用の C# の設定手順を実施してください。詳細については、IAM C# API のリファレンス ドキュメントをご覧ください。


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

このサンプルを試す前に、IAM クイックスタート: クライアント ライブラリの使用の Java の設定手順を実施してください。詳細については、IAM Java API のリファレンス ドキュメントをご覧ください。

import com.google.api.services.cloudresourcemanager.model.Binding;
import com.google.api.services.cloudresourcemanager.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

このサンプルを試す前に、IAM クイックスタート: クライアント ライブラリの使用の Python の手順に従って設定を行ってください。詳細については、IAM Python API のリファレンス ドキュメントをご覧ください。

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 コマンド

set-iam-policy コマンドを使用して、更新されたポリシーを含む JSON ファイルのパスを指定します。次の例は、プロジェクトの set-iam-policy コマンドを示しています。

gcloud projects set-iam-policy project-id filepath

次の値を指定します。

  • project-id: 更新するプロジェクト(たとえば my-project)。
  • filepath: 新しいポリシーを含むファイルのパス。

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

REST API

Resource Manager API の projects.setIamPolicy メソッドは、プロジェクトの新しい IAM ポリシーをリクエストのポリシーとして設定します。

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

  • project-id: Google Cloud プロジェクト ID
  • policy: 設定するポリシーの JSON 表現。ポリシーの形式については、ポリシー リファレンスをご覧ください。

HTTP メソッドと URL:

POST https://cloudresourcemanager.googleapis.com/v1/projects/project-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

このサンプルを試す前に、IAM クイックスタート: クライアント ライブラリの使用の Java の設定手順を実施してください。詳細については、IAM Java API のリファレンス ドキュメントをご覧ください。

import com.google.api.client.googleapis.javanet.GoogleNetHttpTransport;
import com.google.api.client.json.jackson2.JacksonFactory;
import com.google.api.services.cloudresourcemanager.CloudResourceManager;
import com.google.api.services.cloudresourcemanager.model.Policy;
import com.google.api.services.cloudresourcemanager.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

このサンプルを試す前に、IAM クイックスタート: クライアント ライブラリの使用の Python の手順に従って設定を行ってください。詳細については、IAM Python API のリファレンス ドキュメントをご覧ください。

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

複数のソースで同時にポリシーの更新が試行される場合の衝突を防ぐために、ポリシーには etag 値が含まれています。setIamPolicy() を呼び出すと、IAM はリクエスト内の etag 値と既存の etag を比較し、値が一致する場合にのみポリシーを書き込みます。

次のステップ