IAM データベース認証でユーザーを管理する

このページでは、IAM データベース認証を使用する Cloud SQL インスタンスにユーザー、サービス アカウント、グループを追加して管理する方法について説明します。

IAM インテグレーションの詳細については、IAM 認証をご覧ください。

始める前に

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Install the Google Cloud CLI.
  5. To initialize the gcloud CLI, run the following command:

    gcloud init
  6. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  7. Make sure that billing is enabled for your Google Cloud project.

  8. Install the Google Cloud CLI.
  9. To initialize the gcloud CLI, run the following command:

    gcloud init
  10. ユーザー アカウントに Cloud SQL 管理者のロールがあることを確認します。

    IAM ページに移動

  11. Cloud SQL インスタンスで IAM データベース認証を有効にします
  12. IAM ユーザーサービス アカウントグループなどの IAM プリンシパルに必要な cloudsql.instanceUser IAM ロールを割り当てて、Cloud SQL インスタンスにログインします。
  13. サービス アカウントを使用している場合は、プロジェクト内のデータベースにアクセスする必要があるサービスごとに、サービス アカウントが追加されていることを確認します。
  14. サービス アカウントの作成の詳細については、サービス アカウントを作成するをご覧ください。

ユーザー、サービス アカウント、またはグループに IAM ポリシー バインディングを追加する

この手順では、プロジェクト ID とバインディングを指定して、特定のプロジェクトの IAM ポリシーにポリシー バインディングを追加します。バインディング コマンドは、メンバー、ロール、省略可能な条件から構成されます。

データベース ユーザー名は、IAM ユーザーのメールアドレス(example-user@example.com など)にする必要があります。すべて小文字にする必要があります。また、特殊文字(@.)が含まれているため、引用符で囲む必要があります。

コンソール

  1. Google Cloud コンソールの [IAM] ページに移動します。

    [IAM] に移動

  2. [追加] をクリックします。
  3. [新しいメンバー] にメールアドレスを入力します。個々のユーザー、サービス アカウント、グループをメンバーとして追加できますが、すべてのプロジェクトに少なくとも 1 つのプリンシパルがメンバーとして含まれている必要があります。
  4. [ロール] で、[Cloud SQL] に移動し、[Cloud SQL インスタンス ユーザー] を選択します。
  5. 省略可: Cloud SQL Auth Proxy または Cloud SQL 言語コネクタを使用して接続する場合は、[Cloud SQL クライアント] も選択します。
  6. [保存] をクリックします。

gcloud

gcloud projects add-iam-policy-binding--role=roles/cloudsql.instanceUser フラグを指定して実行します。

ユーザー アカウントにポリシー バインディングを追加する

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

  • PROJECT_ID: ユーザーに使用を許可するプロジェクトの ID。
  • USERNAME: ユーザーのメールアドレス。
  gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=user:USERNAME \
    --role=roles/cloudsql.instanceUser
  

Cloud SQL Auth Proxy または Cloud SQL 言語コネクタを使用して接続する場合は、--role=roles/cloudsql.client フラグを付けて gcloud projects add-iam-policy-binding を再度実行します。

サービス アカウントにポリシー バインディングを追加する

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

  • PROJECT_ID: ユーザーに使用を許可するプロジェクトの ID。
  • SERVICE_ACCT: サービス アカウントのメールアドレス。
  gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=serviceAccount:SERVICE_ACCT \
    --role=roles/cloudsql.instanceUser
  

Cloud SQL Auth Proxy または Cloud SQL 言語コネクタを使用して接続する場合は、--role=roles/cloudsql.client フラグを付けて gcloud projects add-iam-policy-binding を再度実行します。

Cloud Identity グループにポリシー バインディングを追加する

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

  • PROJECT_ID: グループのメンバーに使用を許可するプロジェクトの ID。
  • GROUP_EMAIL_ADDRESS: グループのメール アドレス。例: example-group@example.com
  gcloud projects add-iam-policy-binding PROJECT_ID \
    --member=group:GROUP_EMAIL_ADDRESS \
    --role=roles/cloudsql.instanceUser
   

指定したグループのすべてのメンバーに Cloud SQL インスタンス ユーザーのロールが付与され、このプロジェクトのインスタンスにログインできます。

Cloud SQL Auth Proxy または Cloud SQL 言語コネクタを使用して接続する場合は、--role=roles/cloudsql.client フラグを付けて gcloud projects add-iam-policy-binding を再度実行します。

Terraform

必要なポリシー バインディングを IAM ユーザーとサービス アカウントに追加するには、Terraform リソースを使用します。

data "google_project" "project" {
}

resource "google_project_iam_binding" "cloud_sql_user" {
  project = data.google_project.project.project_id
  role    = "roles/cloudsql.instanceUser"
  members = [
    "user:test-user@example.com",
    "serviceAccount:${google_service_account.default.email}"
  ]
}

resource "google_project_iam_binding" "cloud_sql_client" {
  project = data.google_project.project.project_id
  role    = "roles/cloudsql.client"
  members = [
    "user:test-user@example.com",
    "serviceAccount:${google_service_account.default.email}"
  ]
}

変更を適用する

Google Cloud プロジェクトで Terraform 構成を適用するには、次のセクションの手順を完了します。

Cloud Shell を準備する

  1. Cloud Shell を起動します。
  2. Terraform 構成を適用するデフォルトの Google Cloud プロジェクトを設定します。

    このコマンドは、プロジェクトごとに 1 回だけ実行する必要があります。これは任意のディレクトリで実行できます。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Terraform 構成ファイルに明示的な値を設定すると、環境変数がオーバーライドされます。

ディレクトリを準備する

Terraform 構成ファイルには独自のディレクトリ(ルート モジュールとも呼ばれます)が必要です。

  1. Cloud Shell で、ディレクトリを作成し、そのディレクトリ内に新しいファイルを作成します。ファイル名の拡張子は .tf にする必要があります(例: main.tf)。このチュートリアルでは、このファイルを main.tf とします。
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. チュートリアルを使用している場合は、各セクションまたはステップのサンプルコードをコピーできます。

    新しく作成した main.tf にサンプルコードをコピーします。

    必要に応じて、GitHub からコードをコピーします。Terraform スニペットがエンドツーエンドのソリューションの一部である場合は、この方法をおすすめします。

  3. 環境に適用するサンプル パラメータを確認し、変更します。
  4. 変更を保存します。
  5. Terraform を初期化します。これは、ディレクトリごとに 1 回だけ行います。
    terraform init

    最新バージョンの Google プロバイダを使用する場合は、-upgrade オプションを使用します。

    terraform init -upgrade

変更を適用する

  1. 構成を確認して、Terraform が作成または更新するリソースが想定どおりであることを確認します。
    terraform plan

    必要に応じて構成を修正します。

  2. 次のコマンドを実行します。プロンプトで「yes」と入力して、Terraform 構成を適用します。
    terraform apply

    Terraform に「Apply complete!」というメッセージが表示されるまで待ちます。

  3. Google Cloud プロジェクトを開いて結果を表示します。Google Cloud コンソールの UI でリソースに移動して、Terraform によって作成または更新されたことを確認します。

変更を削除する

変更を削除するには、次の操作を行います。

  1. 削除の保護を無効にするには、Terraform 構成ファイルで deletion_protection 引数を false に設定します。
    deletion_protection =  "false"
  2. 次のコマンドを実行します。プロンプトで「yes」と入力して、更新された Terraform 構成を適用します。
    terraform apply
  1. 次のコマンドを実行しています。プロンプトで「yes」と入力して、以前に Terraform 構成で適用されたリソースを削除します。

    terraform destroy

Terraform

必要なポリシー バインディングを IAM ユーザーとサービス アカウントに追加するには、Terraform リソースを使用します。

data "google_project" "project" {
}

resource "google_project_iam_binding" "cloud_sql_user" {
  project = data.google_project.project.project_id
  role    = "roles/cloudsql.instanceUser"
  members = [
    "group:example-group@example.com"
  ]
}

変更を適用する

Google Cloud プロジェクトで Terraform 構成を適用するには、次のセクションの手順を完了します。

Cloud Shell を準備する

  1. Cloud Shell を起動します。
  2. Terraform 構成を適用するデフォルトの Google Cloud プロジェクトを設定します。

    このコマンドは、プロジェクトごとに 1 回だけ実行する必要があります。これは任意のディレクトリで実行できます。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Terraform 構成ファイルに明示的な値を設定すると、環境変数がオーバーライドされます。

ディレクトリを準備する

Terraform 構成ファイルには独自のディレクトリ(ルート モジュールとも呼ばれます)が必要です。

  1. Cloud Shell で、ディレクトリを作成し、そのディレクトリ内に新しいファイルを作成します。ファイル名の拡張子は .tf にする必要があります(例: main.tf)。このチュートリアルでは、このファイルを main.tf とします。
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. チュートリアルを使用している場合は、各セクションまたはステップのサンプルコードをコピーできます。

    新しく作成した main.tf にサンプルコードをコピーします。

    必要に応じて、GitHub からコードをコピーします。Terraform スニペットがエンドツーエンドのソリューションの一部である場合は、この方法をおすすめします。

  3. 環境に適用するサンプル パラメータを確認し、変更します。
  4. 変更を保存します。
  5. Terraform を初期化します。これは、ディレクトリごとに 1 回だけ行います。
    terraform init

    最新バージョンの Google プロバイダを使用する場合は、-upgrade オプションを使用します。

    terraform init -upgrade

変更を適用する

  1. 構成を確認して、Terraform が作成または更新するリソースが想定どおりであることを確認します。
    terraform plan

    必要に応じて構成を修正します。

  2. 次のコマンドを実行します。プロンプトで「yes」と入力して、Terraform 構成を適用します。
    terraform apply

    Terraform に「Apply complete!」というメッセージが表示されるまで待ちます。

  3. Google Cloud プロジェクトを開いて結果を表示します。Google Cloud コンソールの UI でリソースに移動して、Terraform によって作成または更新されたことを確認します。

変更を削除する

変更を削除するには、次の操作を行います。

  1. 削除の保護を無効にするには、Terraform 構成ファイルで deletion_protection 引数を false に設定します。
    deletion_protection =  "false"
  2. 次のコマンドを実行します。プロンプトで「yes」と入力して、更新された Terraform 構成を適用します。
    terraform apply
  1. 以前に Terraform 構成で適用されたリソースを削除するために、次のコマンドを実行してプロンプトで「yes」と入力します。

    terraform destroy

REST

get-iam-policy コマンドで返された JSON または YAML バインディング ポリシーを編集して、cloudsql.instanceUsercloudsql.client のロールを両方のタイプのアカウントに付与します。このポリシーの変更は、更新したポリシーを設定するまで有効になりません。

    {
      "role": "roles/cloudsql.instanceUser",
      "members": [
                   "user:example-user@example.com"
                   "serviceAccount:service1@sql.iam.gserviceaccount.com"
                   "group:example-group@example.com"
      ]
    }
    {
      "role": "roles/cloudsql.client",
      "members": [
                   "user:example-user@example.com"
                   "serviceAccount:service1@sql.iam.gserviceaccount.com"
      ]
    }

個々の IAM ユーザーまたはサービス アカウントを Cloud SQL インスタンスに追加する

データベースにアクセスするには、Cloud SQL インスタンスに追加する IAM ユーザーまたはサービス アカウントごとに新しいユーザー アカウントを作成する必要があります。IAM グループを追加する場合は、そのグループのメンバーごとにユーザー アカウントを作成する必要はありません。

データベース ユーザー名は、IAM ユーザーのメールアドレスで、すべて小文字にする必要があります。例: example-user@example.com

REST コマンドを使用する場合、ユーザー名には特殊文字(@.)が含まれるため、引用符を使用する必要があります。サービス アカウントの形式は service-account-name@project-id.iam.gserviceaccount.com です。

個々の IAM ユーザーまたはサービス アカウントを追加するには、新しいユーザー アカウントを追加し、認証方法として IAM を選択します。

コンソール

  1. Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。

    Cloud SQL の [インスタンス] に移動

  2. インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
  3. SQL ナビゲーション メニューから [ユーザー] を選択します。
  4. [ユーザー アカウントを追加] をクリックします。[ユーザー アカウントをインスタンス instance_name に追加] タブが開きます。
  5. [Cloud IAM] ラジオボタンをクリックします。
  6. [プリンシパル] フィールドに、追加するユーザーまたはサービス アカウントのメールアドレスを追加します。
  7. [追加] をクリックします。ユーザー アカウントのリストにユーザーまたはサービス アカウントが表示されます。
  8. ユーザー アカウントの作成後にユーザーに cloudsql.instanceUser IAM ロールが割り当てられていない場合、ユーザー名の横に 三角形 アイコンが表示されます。

    ユーザーにログイン権限を付与するには、アイコンをクリックしてから [IAM ロールを追加] を選択します。アイコンが表示されなくなった場合は、ユーザー アカウントにログイン権限を付与する IAM ロールが割り当てられています。

gcloud

ユーザー アカウントを作成する

メールアドレス(example-user@example.com など)を使用してユーザーを識別します。

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

  • USERNAME: ユーザーのメールアドレス。
  • INSTANCE_NAME: ユーザーにアクセスを許可するインスタンスの名前。
gcloud sql users create USERNAME \
--instance=INSTANCE_NAME \
--type=cloud_iam_user

サービス アカウントを作成する

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

  • SERVICE_ACCT: サービス アカウントのメールアドレス。
  • INSTANCE_NAME: サービス アカウントによるアクセスを許可するインスタンスの名前。
gcloud sql users create SERVICE_ACCT \
--instance=INSTANCE_NAME \
--type=cloud_iam_service_account

Terraform

IAM データベース認証が有効化されているインスタンスに IAM ユーザーとサービス アカウントを追加するには、Terraform リソースを使用します。

resource "google_sql_database_instance" "default" {
  name             = "mysql-db-auth-instance-name-test"
  region           = "us-west4"
  database_version = "MYSQL_8_0"
  settings {
    tier = "db-f1-micro"
    database_flags {
      name  = "cloudsql_iam_authentication"
      value = "on"
    }
  }
  # set `deletion_protection` to true, will ensure that one cannot accidentally
  # delete this instance by use of Terraform whereas
  # `deletion_protection_enabled` flag protects this instance at the GCP level.
  deletion_protection = false
}

# Specify the email address of the IAM user to add to the instance
# This resource does not create a new IAM user account; this account must
# already exist

resource "google_sql_user" "iam_user" {
  name     = "test-user@example.com"
  instance = google_sql_database_instance.default.name
  type     = "CLOUD_IAM_USER"
}

# Create a new IAM service account

resource "google_service_account" "default" {
  account_id   = "cloud-sql-mysql-sa"
  display_name = "Cloud SQL for MySQL Service Account"
}

# Specify the email address of the IAM service account to add to the instance

resource "google_sql_user" "iam_service_account_user" {
  name     = google_service_account.default.email
  instance = google_sql_database_instance.default.name
  type     = "CLOUD_IAM_SERVICE_ACCOUNT"
}

変更を適用する

Google Cloud プロジェクトで Terraform 構成を適用するには、次のセクションの手順を完了します。

Cloud Shell を準備する

  1. Cloud Shell を起動します。
  2. Terraform 構成を適用するデフォルトの Google Cloud プロジェクトを設定します。

    このコマンドは、プロジェクトごとに 1 回だけ実行する必要があります。これは任意のディレクトリで実行できます。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Terraform 構成ファイルに明示的な値を設定すると、環境変数がオーバーライドされます。

ディレクトリを準備する

Terraform 構成ファイルには独自のディレクトリ(ルート モジュールとも呼ばれます)が必要です。

  1. Cloud Shell で、ディレクトリを作成し、そのディレクトリ内に新しいファイルを作成します。ファイル名の拡張子は .tf にする必要があります(例: main.tf)。このチュートリアルでは、このファイルを main.tf とします。
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. チュートリアルを使用している場合は、各セクションまたはステップのサンプルコードをコピーできます。

    新しく作成した main.tf にサンプルコードをコピーします。

    必要に応じて、GitHub からコードをコピーします。Terraform スニペットがエンドツーエンドのソリューションの一部である場合は、この方法をおすすめします。

  3. 環境に適用するサンプル パラメータを確認し、変更します。
  4. 変更を保存します。
  5. Terraform を初期化します。これは、ディレクトリごとに 1 回だけ行います。
    terraform init

    最新バージョンの Google プロバイダを使用する場合は、-upgrade オプションを使用します。

    terraform init -upgrade

変更を適用する

  1. 構成を確認して、Terraform が作成または更新するリソースが想定どおりであることを確認します。
    terraform plan

    必要に応じて構成を修正します。

  2. 次のコマンドを実行します。プロンプトで「yes」と入力して、Terraform 構成を適用します。
    terraform apply

    Terraform に「Apply complete!」というメッセージが表示されるまで待ちます。

  3. Google Cloud プロジェクトを開いて結果を表示します。Google Cloud コンソールの UI でリソースに移動して、Terraform によって作成または更新されたことを確認します。

変更を削除する

変更を削除するには、次の操作を行います。

  1. 削除の保護を無効にするには、Terraform 構成ファイルで deletion_protection 引数を false に設定します。
    deletion_protection =  "false"
  2. 次のコマンドを実行します。プロンプトで「yes」と入力して、更新された Terraform 構成を適用します。
    terraform apply
  1. 以前に Terraform 構成で適用されたリソースを削除するために、次のコマンドを実行してプロンプトで「yes」と入力します。

    terraform destroy

REST v1

ユーザー アカウントを作成する

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

  • PROJECT_ID: プロジェクト ID
  • INSTANCE_ID: ユーザーを追加するインスタンスのインスタンス ID
  • USERNAME: ユーザーのメールアドレス

HTTP メソッドと URL:

POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID/users

リクエストの本文(JSON):

{
  "name": "USERNAME",
  "type": "CLOUD_IAM_USER"
}

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

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

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2020-02-07T22:44:16.656Z",
  "startTime": "2020-02-07T22:44:16.686Z",
  "endTime": "2020-02-07T22:44:20.437Z",
  "operationType": "CREATE_USER",
  "name": "OPERATION_ID",
  "targetId": "INSTANCE_ID",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

サービス アカウントを作成する

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

  • SERVICE_ACCT: サービス アカウントのメールアドレス。
  • PROJECT_ID: プロジェクト ID
  • INSTANCE_ID: サービス アカウントを追加するインスタンスのインスタンス ID

HTTP メソッドと URL:

POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID/users

リクエストの本文(JSON):

{
    "name": "SERVICE_ACCT",
    "type": "CLOUD_IAM_SERVICE_ACCOUNT"
}

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

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

{
"kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2020-11-20T04:08:00.211Z",
  "startTime": "2020-11-20T04:08:00.240Z",
  "endTime": "2020-11-20T04:08:02.003Z",
  "operationType": "CREATE_USER",
  "name": "OPERATION_ID",
  "targetId": "INSTANCE_ID",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

REST v1beta4

ユーザー アカウントを作成する

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

  • PROJECT_ID: プロジェクト ID
  • INSTANCE_ID: ユーザーを追加するインスタンスのインスタンス ID
  • USERNAME: ユーザーのメールアドレス

HTTP メソッドと URL:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID/users

リクエストの本文(JSON):

{
  "name": "USERNAME",
  "type": "CLOUD_IAM_USER"
  }

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

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

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2020-02-07T22:44:16.656Z",
  "startTime": "2020-02-07T22:44:16.686Z",
  "endTime": "2020-02-07T22:44:20.437Z",
  "operationType": "CREATE_USER",
  "name": "OPERATION_ID",
  "targetId": "INSTANCE_ID",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

サービス アカウントを作成する

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

  • SERVICE_ACCT: サービス アカウントのメールアドレス。
  • PROJECT_ID: プロジェクト ID
  • INSTANCE_ID: サービス アカウントを追加するインスタンスのインスタンス ID

HTTP メソッドと URL:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID/users

リクエストの本文(JSON):

{
    "name": "SERVICE_ACCT",
    "type": "CLOUD_IAM_SERVICE_ACCOUNT"
}

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

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

{
"kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID",
  "status": "DONE",
  "user": "user@example.com",
  "insertTime": "2020-11-20T04:08:00.211Z",
  "startTime": "2020-11-20T04:08:00.240Z",
  "endTime": "2020-11-20T04:08:02.003Z",
  "operationType": "CREATE_USER",
  "name": "OPERATION_ID",
  "targetId": "INSTANCE_ID",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

Cloud SQL インスタンスに IAM グループを追加する

IAM グループ認証を使用して Cloud SQL インスタンスに IAM グループを追加するには、このセクションで説明する操作のいずれかを行います。IAM グループを追加した後、個々のグループ メンバーをインスタンスに追加する必要はありません。詳細については、グループのメンバーを Cloud SQL インスタンスに自動的に追加するをご覧ください。

コンソール

  1. Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。

    Cloud SQL の [インスタンス] に移動

  2. インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
  3. SQL ナビゲーション メニューから [ユーザー] を選択します。
  4. [ユーザー アカウントを追加] をクリックします。[ユーザー アカウントをインスタンス instance_name に追加] タブが開きます。
  5. [Cloud IAM] ラジオボタンをクリックします。
  6. [プリンシパル] フィールドに、追加するグループのメールアドレスを追加します。
  7. [追加] をクリックします。グループがユーザーリストに表示されます。
  8. ユーザー アカウントの作成後にグループに cloudsql.instanceUser IAM ロールが割り当てられていない場合、グループの横に 三角形 アイコンが表示されます。

    グループ メンバーにログイン権限を付与するには、アイコンをクリックしてから [IAM ロールを追加] を選択します。アイコンが表示されなくなった場合、グループのすべてのメンバーにログイン権限を付与するロールが割り当てられています。

gcloud

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

  • GROUP_EMAIL_ADDRESS: インスタンスに追加する Cloud Identity グループのメールアドレス。例: example-group@example.com
  • INSTANCE_NAME: グループを追加するインスタンスの名前。

次のコマンドを実行します。

gcloud sql users create GROUP_EMAIL_ADDRESS \
  --instance=INSTANCE_NAME \
  --type=cloud_iam_group

Terraform

IAM データベース認証が有効化されているインスタンスに IAM ユーザーとサービス アカウントを追加するには、Terraform リソースを使用します。

resource "google_sql_database_instance" "default" {
  name             = "mysql-iam-group-auth-instance-name"
  region           = "us-west4"
  database_version = "MYSQL_8_0"
  settings {
    tier = "db-f1-micro"
    database_flags {
      name  = "cloudsql_iam_authentication"
      value = "on"
    }
  }
  # set `deletion_protection` to true, will ensure that one cannot accidentally
  # delete this instance by use of Terraform whereas
  # `deletion_protection_enabled` flag protects this instance at the GCP level.
  deletion_protection = false
}

# Specify the email address of the Cloud Identity group to add to the instance
# This resource does not create a Cloud Identity group; the group must
# already exist

resource "google_sql_user" "iam_group" {
  name     = "example-group@example.com"
  instance = google_sql_database_instance.default.name
  type     = "CLOUD_IAM_GROUP"
}

data "google_project" "project" {
}

resource "google_project_iam_binding" "cloud_sql_user" {
  project = data.google_project.project.project_id
  role    = "roles/cloudsql.instanceUser"
  members = [
    "group:example-group@example.com"
  ]
}

変更を適用する

Google Cloud プロジェクトで Terraform 構成を適用するには、次のセクションの手順を完了します。

Cloud Shell を準備する

  1. Cloud Shell を起動します。
  2. Terraform 構成を適用するデフォルトの Google Cloud プロジェクトを設定します。

    このコマンドは、プロジェクトごとに 1 回だけ実行する必要があります。これは任意のディレクトリで実行できます。

    export GOOGLE_CLOUD_PROJECT=PROJECT_ID

    Terraform 構成ファイルに明示的な値を設定すると、環境変数がオーバーライドされます。

ディレクトリを準備する

Terraform 構成ファイルには独自のディレクトリ(ルート モジュールとも呼ばれます)が必要です。

  1. Cloud Shell で、ディレクトリを作成し、そのディレクトリ内に新しいファイルを作成します。ファイル名の拡張子は .tf にする必要があります(例: main.tf)。このチュートリアルでは、このファイルを main.tf とします。
    mkdir DIRECTORY && cd DIRECTORY && touch main.tf
  2. チュートリアルを使用している場合は、各セクションまたはステップのサンプルコードをコピーできます。

    新しく作成した main.tf にサンプルコードをコピーします。

    必要に応じて、GitHub からコードをコピーします。Terraform スニペットがエンドツーエンドのソリューションの一部である場合は、この方法をおすすめします。

  3. 環境に適用するサンプル パラメータを確認し、変更します。
  4. 変更を保存します。
  5. Terraform を初期化します。これは、ディレクトリごとに 1 回だけ行います。
    terraform init

    最新バージョンの Google プロバイダを使用する場合は、-upgrade オプションを使用します。

    terraform init -upgrade

変更を適用する

  1. 構成を確認して、Terraform が作成または更新するリソースが想定どおりであることを確認します。
    terraform plan

    必要に応じて構成を修正します。

  2. 次のコマンドを実行します。プロンプトで「yes」と入力して、Terraform 構成を適用します。
    terraform apply

    Terraform に「Apply complete!」というメッセージが表示されるまで待ちます。

  3. Google Cloud プロジェクトを開いて結果を表示します。Google Cloud コンソールの UI でリソースに移動して、Terraform によって作成または更新されたことを確認します。

変更を削除する

変更を削除するには、次の操作を行います。

  1. 削除の保護を無効にするには、Terraform 構成ファイルで deletion_protection 引数を false に設定します。
    deletion_protection =  "false"
  2. 次のコマンドを実行します。プロンプトで「yes」と入力して、更新された Terraform 構成を適用します。
    terraform apply
  1. 以前に Terraform 構成で適用されたリソースを削除するために、次のコマンドを実行してプロンプトで「yes」と入力します。

    terraform destroy

REST v1

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

  • PROJECT_ID: プロジェクト ID
  • INSTANCE_ID: Cloud Identity グループを追加するインスタンスのインスタンス ID
  • GROUP_EMAIL: Cloud Identity グループのメールアドレス

HTTP メソッドと URL:

POST https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID/users

リクエストの本文(JSON):

{
  "name": "GROUP_EMAIL",
  "type": "CLOUD_IAM_GROUP"
}

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

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

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID",
  "status": "DONE",
  "user": "example-group@example.com",
  "insertTime": "2023-12-07T22:44:16.656Z",
  "startTime": "2023-12-07T22:44:16.686Z",
  "endTime": "2023-12-07T22:44:20.437Z",
  "operationType": "CREATE_USER",
  "name": "OPERATION_ID",
  "targetId": "INSTANCE_ID",
  "selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

REST v1beta4

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

  • PROJECT_ID: プロジェクト ID
  • INSTANCE_ID: Cloud Identity グループを追加するインスタンスのインスタンス ID
  • GROUP_EMAIL: Cloud Identity グループのメールアドレス

HTTP メソッドと URL:

POST https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID/users

リクエストの本文(JSON):

{
  "name": "GROUP_EMAIL",
  "type": "CLOUD_IAM_GROUP"
}

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

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

{
  "kind": "sql#operation",
  "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID",
  "status": "DONE",
  "user": "example-group@example.com",
  "insertTime": "2023-12-07T22:44:16.656Z",
  "startTime": "2023-12-07T22:44:16.686Z",
  "endTime": "2023-12-07T22:44:20.437Z",
  "operationType": "CREATE_USER",
  "name": "OPERATION_ID",
  "targetId": "INSTANCE_ID",
  "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/operations/OPERATION_ID",
  "targetProject": "PROJECT_ID"
}

グループのメンバーを Cloud SQL インスタンスに自動的に追加する

Cloud SQL インスタンスに IAM グループを追加すると、そのグループのすべてのメンバー(ユーザーとサービス アカウント)が、インスタンスの認証に必要な IAM 権限を継承します。グループ メンバーを Cloud SQL インスタンスに個別に追加する必要はありません。グループ メンバーが初めてログインしてインスタンスの認証に成功すると、Cloud SQL はそのグループ メンバーのグループ ユーザー アカウントまたはグループ サービス アカウントを作成します。グループ メンバーは、インスタンスに初めてログインしたときに、インスタンスに表示されます。

ログインの詳細については、IAM データベース認証を使用してログインするをご覧ください。

Cloud SQL インスタンスのグループ メンバーを管理する

IAM グループを Cloud SQL インスタンスに追加すると、そのグループのすべてのメンバー(ユーザーまたはサービス アカウント)は、インスタンスの認証を行う IAM 権限を継承します。インスタンスへのアクセスを制御するには、Cloud Identity でグループを管理します。たとえば、新しいユーザーにインスタンスへのアクセス権を付与する場合は、Cloud Identity でそのユーザーをグループ メンバーとして追加します。グループ メンバーシップの変更は Cloud SQL インスタンスに自動的に反映されるため、Cloud SQL インスタンス レベルでグループ メンバーを個別に削除または追加する必要はありません。グループ メンバーシップの変更(メンバーの追加や削除など)が反映されるまでに約 15 分かかります。これは、IAM の変更に必要な時間とは別のものです。

MySQL の IAM グループに対するデータベース権限の付与または取り消しは、すぐに反映されます。たとえば、あるテーブルへのアクセス権が取り消されると、その IAM グループのメンバーは即座にそのテーブルへのアクセス権を失います。

ユーザーまたはサービス アカウントが複数の IAM グループのメンバーになることができます。ユーザーまたはサービス アカウントがインスタンス上の複数の IAM グループに属している場合、各 IAM グループの IAM 権限とデータベース権限がすべて結合されます。

Cloud Identity の IAM グループに新しいメンバー(ユーザーまたはサービス アカウント)を追加し、そのメンバーが初めてインスタンスに正常にログインすると、グループに付与されたデータベース権限が自動的に継承されます。新しく取得したデータベース権限を同じログイン セッション内で使用するには、次のステートメントを使用します。

SET ROLE ALL;

詳細については、MySQL ドキュメントの SET ROLE をご覧ください。

個々の IAM ユーザーまたはサービス アカウントにデータベース権限を付与する

個々の IAM ユーザーまたはサービスを Cloud SQL インスタンスに追加すると、デフォルトでは、その新しいアカウントにデータベースに対する権限は付与されません。

アカウントにデータベース権限を付与するには、GRANT ステートメントを使用します。ユーザーとサービス アカウントに付与できる権限の一覧については、GRANT リファレンス ページをご覧ください。mysql コマンドラインから GRANT を実行します。

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

  • USERNAME: ユーザー アカウントの場合、これは IAM ユーザーのメールアドレス(@ とドメイン文字列は除く)です。たとえば、IAM ユーザーのメールアドレスが example-user@example.com の場合、ユーザー名は example-user になります。サービス アカウントの場合、これは @project-id.iam.gserviceaccount.com ドメインのないサービス アカウントのメールアドレスです。
  • DATABASE_NAME: テーブルをホストするデータベースの名前。
  • TABLE_NAME: ユーザーにアクセス権を付与するテーブルの名前。
  • grant select on DATABASE_NAME.TABLE_NAME to "USERNAME";
    

    IAM グループにデータベース権限を付与する

    IAM グループ認証を使用する場合は、個々のユーザーまたはサービス アカウントに権限を付与するのではなく、IAM グループにデータベース権限を付与します。デフォルトでは、IAM グループを Cloud SQL インスタンスに追加しても、そのグループにはデータベース権限が付与されません。

    IAM グループにデータベース権限を付与するには、GRANT ステートメントを使用します。各グループ メンバー(ユーザーとサービス アカウントを含む)は、Cloud SQL インスタンスに初めてログインした後に、グループに付与されているデータベース権限を自動的に継承します。

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

  • GROUP_NAME: Cloud Identity グループのメールアドレスの最初の部分。@ とドメイン名は切り捨てられます。たとえば、IAM グループのメールアドレスが example-group@example.com の場合、グループ名は example-group になります。
  • DATABASE_NAME: テーブルをホストするデータベースの名前。
  • TABLE_NAME: ユーザーにアクセス権を付与するテーブルの名前。
  • mysql コマンドラインから GRANT を実行します。

    grant select on DATABASE_NAME.TABLE_NAME to "GROUP_NAME"@"HOSTNAME";
    

    HOSTNAME は、IAM グループのメールアドレスのドメイン名に置き換えます。

    権限の付与の詳細については、MySQL ドキュメントの GRANT リファレンス ページをご覧ください。

    IAM グループに付与したデータベース権限はすぐに有効になります。

    Cloud SQL インスタンスに追加された IAM ユーザー、サービス アカウント、グループを表示する

    Cloud SQL インスタンスに追加された IAM ユーザー、サービス アカウント、グループを表示するには、次のコマンドを実行します。

    コンソール

    1. Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。

      Cloud SQL の [インスタンス] に移動

    2. インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
    3. SQL ナビゲーション メニューから [ユーザー] を選択します。インスタンスに追加された IAM ユーザー、サービス アカウント、Cloud Identity グループのリストが表示されます。
    4. 省略可: インスタンスにすでにログインしている IAM ユーザーまたはサービス アカウントのリストを表示するには、[認証された IAM グループ メンバー] をクリックします。

    gcloud

    INSTANCE_NAME は、表示するグループを含むインスタンスの名前に置き換えます。

      gcloud sql users list --instance=INSTANCE_NAME
      

    グループのユーザータイプは CLOUD_IAM_GROUP です。

    出力には、Cloud SQL インスタンスのユーザー アカウントとサービス アカウントも表示されます。

    • グループのメンバーであるユーザー アカウントのタイプは、CLOUD_IAM_GROUP_USER です。
    • グループのメンバーであるサービス アカウントのタイプは CLOUD_IAM_GROUP_SERVICE_ACCOUNT です。
    • 個別の IAM データベース認証ユーザー アカウントであるユーザー アカウントのタイプは、CLOUD_IAM_USER です。
    • 個別の IAM データベース認証サービス アカウントであるサービス アカウントのタイプは、CLOUD_IAM_SERVICE_ACCOUNT です。

    REST v1

    次のリクエストでは、users.list メソッドを使用して、Cloud SQL インスタンスにアカウントを持つユーザーを一覧表示します。

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

    • PROJECT_ID: プロジェクト ID
    • INSTANCE_ID: インスタンス ID

    HTTP メソッドと URL:

    GET https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID/users/list

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

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

    
    {
      "kind": "sql#usersList",
      "items": [
        {
          "kind": "sql#user",
          "etag": "--redacted--",
          "name": "example-service-acct",
          "host": "%",
          "instance": "INSTANCE_ID",
          "project": "PROJECT_ID",
          "type": "CLOUD_IAM_SERVICE_ACCOUNT"
        },
        {
          "kind": "sql#user",
          "etag": "--redacted--",
          "name": "another-example-service-acct",
          "host": "%",
          "instance": "INSTANCE_ID",
          "project": "PROJECT_ID",
          "type": "CLOUD_IAM_GROUP_SERVICE_ACCOUNT"
        },
        {
          "kind": "sql#user",
          "etag": "--redacted--",
          "name": "root",
          "host": "%",
          "instance": "INSTANCE_ID",
          "project": "PROJECT_ID",
          "passwordPolicy": {
            "status": {}
          }
        },
        {
          "kind": "sql#user",
          "etag": "--redacted--",
          "name": "example-user",
          "host": "%",
          "instance": "INSTANCE_ID",
          "project": "PROJECT_ID",
          "type": "CLOUD_IAM_USER"
        },
        {
          "kind": "sql#user",
          "etag": "--redacted--",
          "name": "another-example-user",
          "host": "%",
          "instance": "INSTANCE_ID",
          "project": "PROJECT_ID",
          "type": "CLOUD_IAM_GROUP_USER"
        },
        {
          "kind": "sql#user",
          "etag": "--redacted--",
          "name": "example-group",
          "host": "%",
          "instance": "INSTANCE_ID",
          "project": "PROJECT_ID",
          "type": "CLOUD_IAM_GROUP"
        }
      ]
    }
    
    

    グループのユーザータイプは CLOUD_IAM_GROUP です。

    出力には、Cloud SQL インスタンスのユーザー アカウントとサービス アカウントも表示されます。

    • グループのメンバーであるユーザー アカウントのタイプは、CLOUD_IAM_GROUP_USER です。
    • グループのメンバーであるサービス アカウントのタイプは CLOUD_IAM_GROUP_SERVICE_ACCOUNT です。
    • 個別の IAM データベース認証ユーザー アカウントであるユーザー アカウントのタイプは、CLOUD_IAM_USER です。
    • 個別の IAM データベース認証サービス アカウントであるサービス アカウントのタイプは、CLOUD_IAM_SERVICE_ACCOUNT です。

    REST v1beta4

    次のリクエストでは、users.list メソッドを使用して、Cloud SQL インスタンスにアカウントを持つユーザーを一覧表示します。

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

    • project-id: プロジェクト ID
    • instance-id: 目的のインスタンス ID

    HTTP メソッドと URL:

    GET https://sqladmin.googleapis.com/sql/v1beta4/projects/project-id/instances/instance-id/users

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

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

    {
      "kind": "sql#usersList",
      "items": [
        {
          "kind": "sql#user",
          "etag": "--redacted--",
          "name": "sqlserver",
          "host": "",
          "instance": "instance-id",
          "project": "project-id",
          "sqlserverUserDetails": {
            "serverRoles": [
              "CustomerDbRootRole"
            ]
          }
        },
        {
          "kind": "sql#user",
          "etag": "--redacted--",
          "name": "user-id-1",
          "host": "",
          "instance": "instance-id",
          "project": "project-id",
          "sqlserverUserDetails": {
            "serverRoles": [
              "CustomerDbRootRole"
            ]
          }
        },
        {
          "kind": "sql#user",
          "etag": "--redacted--",
          "name": "user-id-2",
          "host": "",
          "instance": "instance-id",
          "project": "project-id",
          "sqlserverUserDetails": {
            "serverRoles": [
              "CustomerDbRootRole"
            ]
          }
        },
        {
          ...
        },
        {
          ...
        }
      ]
    }
    

    グループのユーザータイプは CLOUD_IAM_GROUP です。

    出力には、Cloud SQL インスタンスのユーザー アカウントとサービス アカウントも表示されます。

    • グループのメンバーであるユーザー アカウントのタイプは、CLOUD_IAM_GROUP_USER です。
    • グループのメンバーであるサービス アカウントのタイプは CLOUD_IAM_GROUP_SERVICE_ACCOUNT です。
    • 個別の IAM データベース認証ユーザー アカウントであるユーザー アカウントのタイプは、CLOUD_IAM_USER です。
    • 個別の IAM データベース認証サービス アカウントであるサービス アカウントのタイプは、CLOUD_IAM_SERVICE_ACCOUNT です。

    Cloud SQL インスタンスから個々の IAM ユーザーまたはサービス アカウントを削除する

    グループのメンバーではない個々のユーザー アカウントまたはサービス アカウントを Cloud SQL インスタンスから削除するには、次のコマンドを使用してアカウントを削除します。

    コンソール

    1. Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。

      Cloud SQL の [インスタンス] に移動

    2. インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
    3. SQL ナビゲーション メニューから [ユーザー] を選択します。
    4. 削除するユーザーの をクリックします。
    5. [削除] を選択します。これにより、このインスタンスへのアクセス権のみが取り消されます。

    gcloud

    ユーザーを取り消す

    メールアドレス(example-user@example.com など)を使用してユーザーを識別します。

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

    • USERNAME: @ 以下のドメイン名を含まないメールアドレス。
    • INSTANCE_NAME: ユーザーを削除するインスタンスの名前。
    gcloud sql users delete USERNAME \
    --instance=INSTANCE_NAME
    

    個々のサービス アカウントを削除する

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

    • SERVICE_ACCT: サービス アカウントのメールアドレス。
    • INSTANCE_NAME: ユーザーを削除するインスタンスの名前。
    gcloud sql users delete SERVICE_ACCT \
    --instance=INSTANCE_NAME
    

    REST v1

    以下のリクエストでは、users.delete メソッドを使用して、指定されたユーザー アカウントを削除します。

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

    • PROJECT_ID: プロジェクト ID
    • INSTANCE_ID: 目的のインスタンス ID
    • USERNAME: ユーザーまたはサービス アカウントのメールアドレス

    HTTP メソッドと URL:

    DELETE https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID/users?host=&name=USERNAME

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

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

    {
      "kind": "sql#operation",
      "targetLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/instances/INSTANCE_ID",
      "status": "DONE",
      "user": "user@example.com",
      "insertTime": "2020-02-07T22:38:41.217Z",
      "startTime": "2020-02-07T22:38:41.217Z",
      "endTime": "2020-02-07T22:38:44.801Z",
      "operationType": "DELETE_USER",
      "name": "OPERATION_ID",
      "targetId": "INSTANCE_ID",
      "selfLink": "https://sqladmin.googleapis.com/v1/projects/PROJECT_ID/operations/OPERATION_ID",
      "targetProject": "PROJECT_ID"
    }
    

    REST v1beta4

    以下のリクエストでは、users.delete メソッドを使用して、指定されたユーザー アカウントを削除します。

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

    • PROJECT_ID: プロジェクト ID
    • INSTANCE_ID: 目的のインスタンス ID
    • USERNAME: ユーザーまたはサービス アカウントのメールアドレス

    HTTP メソッドと URL:

    DELETE https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID/users?host=&name=USERNAME

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

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

    {
      "kind": "sql#operation",
      "targetLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/instances/INSTANCE_ID",
      "status": "DONE",
      "user": "user@example.com",
      "insertTime": "2020-02-07T22:38:41.217Z",
      "startTime": "2020-02-07T22:38:41.217Z",
      "endTime": "2020-02-07T22:38:44.801Z",
      "operationType": "DELETE_USER",
      "name": "OPERATION_ID",
      "targetId": "INSTANCE_ID",
      "selfLink": "https://sqladmin.googleapis.com/sql/v1beta4/projects/PROJECT_ID/operations/OPERATION_ID",
      "targetProject": "PROJECT_ID"
    }
    

    Cloud SQL インスタンスから IAM グループ メンバーを削除する

    Cloud SQL インスタンスから IAM グループ メンバーを削除する方法は 2 つあります。

    • 自動削除
    • 手動による削除

    自動削除

    IAM グループ メンバーを削除するには、Cloud Identity の該当する IAM グループからメンバーシップを削除する必要があります。IAM グループのユーザーが Cloud Identity の該当するすべてのグループのメンバーシップを失うと、Cloud SQL はこれらのグループ ユーザーをインスタンスから自動的に削除します。

    グループ メンバーシップの変更(メンバーの追加や削除など)が反映されるまでに約 15 分かかります。これは、IAM の変更に必要な時間とは別のものです。

    手動による削除

    IAM グループ ユーザーが自動的に削除されない場合は、手動で削除できます。gcloud CLI、Google Cloud コンソール、Terraform、Cloud SQL Admin API を使用して、Cloud SQL インスタンスから IAM グループのユーザーを手動で削除することはできません。スーパーユーザー権限を持つデータベース ユーザーは、MySQL クライアントの DROP USER ステートメントを使用して、Cloud SQL インスタンスから IAM グループ ユーザーを手動で削除できます。

    Cloud SQL インスタンスから IAM グループ ユーザーを手動で削除したら、Cloud SQL インスタンスへのログインを防ぐため、そのユーザーを Cloud Identity の IAM グループからも削除してください。

    Cloud SQL インスタンスから IAM グループを削除する

    追加した IAM グループは、Cloud SQL インスタンスから削除できます。インスタンスから IAM グループを削除すると、IAM グループに属するすべてのユーザーとサービス アカウントは、IAM グループに付与されているデータベース権限を失います。また、次の条件が適用されます。

    • IAM グループに属するユーザーとサービス アカウントは、cloudsql.instances.login IAM 権限がグループから削除されるまではログインできます。
    • グループを削除した結果、インスタンス上の他のグループに属していない IAM グループのユーザーまたはサービス アカウントが存在する場合、Cloud SQL はインスタンスから IAM グループのユーザーまたはサービス アカウントを削除します。

    Cloud SQL インスタンスからすべての IAM グループを削除すると、すべての IAM グループのユーザーとサービス アカウントがすべてのデータベース権限を失います。また、次の条件が適用されます。

    • すべての IAM グループ ユーザーとサービス アカウントがインスタンスにログインできなくなります。
    • Cloud SQL は、すべての IAM グループ ユーザーとサービス アカウントをインスタンスから自動的に削除します。

    コンソール

    1. Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。

      Cloud SQL の [インスタンス] に移動

    2. インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
    3. SQL ナビゲーション メニューから [ユーザー] を選択します。
    4. 削除するグループの をクリックします。
    5. [削除] を選択します。これにより、このインスタンスへのアクセス権のみが取り消されます。

    gcloud

    Cloud Identity グループをインスタンスから削除するには、gcloud sql users delete コマンドを使用します。

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

    • GROUP_NAME: Cloud Identity グループのメールアドレスの最初の部分。たとえば、メールアドレス example-group@example.com を使用する場合、Cloud Identity グループ名は example-group です。
    • HOSTNAME: メールアドレスの 2 番目の部分は、Cloud Identity グループのホスト名を表します。たとえば、メールアドレス example-group@example.com を使用する場合、ホスト名は example.com です。
    • INSTANCE_NAME: 削除する Cloud Identity グループを持つ Cloud SQL インスタンスの名前。
    gcloud sql users delete GROUP_NAME \
       --host=HOSTNAME \
       --instance=INSTANCE_NAME
    

    IAM グループから IAM ログイン権限を削除する

    IAM グループから cloudsql.instanceUser ロールを取り消すと、グループのすべてのメンバーがプロジェクト内の Cloud SQL インスタンスにログインできなくなります。ユーザー アカウントまたはサービス アカウントは、ログイン権限がある別の IAM グループのメンバーである場合にのみ、インスタンスにログインできます。

    Cloud Identity グループからロールを取り消すには、単一のロールを取り消すをご覧ください。

    IAM グループからユーザーを削除する

    ユーザーやサービス アカウントなどの IAM グループ メンバーは、Cloud Identity の IAM グループから削除できます。

    この削除が IAM を介して反映された後、ユーザーは別のグループからログイン権限を受け取るか、ログイン権限を直接付与されない限り、データベースにログインできなくなります。また、グループから削除されたユーザーは、グループのデータベース権限を失います。

    IAM グループ ユーザーがインスタンスのグループに属していない場合、Cloud SQL は自動的にそのユーザーをインスタンスから削除します。

    監査ログのログイン情報を表示する

    監査ログを有効にして、データベースへの IAM ログインをキャプチャできます。ログインで問題が発生した場合は、監査ログを使用して問題を診断できます。

    構成が完了すると、ログ エクスプローラを使用して、成功したログインのデータアクセス監査ログを表示できます。

    IAM グループ認証の場合、監査ログには個々のユーザー アカウントとサービス アカウントのアクティビティとログインが表示されます。

    たとえば、ログに次のような情報が含まれる場合があります。

    {
     insertId: "..."
     logName: "projects/.../logs/cloudaudit.googleapis.com%2Fdata_access"
     protoPayload: {
      @type: "type.googleapis.com/google.cloud.audit.AuditLog"
      authenticationInfo: {
       principalEmail: "..."
      }
      authorizationInfo: [
       0: {
        granted: true
        permission: "cloudsql.instances.login"
        resource: "instances/..."
        resourceAttributes: {
        }
       }
      ]
      methodName: "cloudsql.instances.login"
      request: {
       @type: "type.googleapis.com/google.cloud.sql.authorization.v1.InstancesLoginRequest"
       clientIpAddress: "..."
       database: "..."
       databaseSessionId: ...
       instance: "projects/.../locations/us-central1/instances/..."
       user: "..."
      }
      requestMetadata: {
       callerIp: "..."
       destinationAttributes: {
       }
       requestAttributes: {
        auth: {
        }
        time: "..."
       }
      }
      resourceName: "instances/..."
      serviceName: "cloudsql.googleapis.com"
      status: {
      }
     }
     receiveTimestamp: "..."
     resource: {
      labels: {
       database_id: "...:..."
       project_id: "..."
       region: "us-central"
      }
      type: "cloudsql_database"
     }
     severity: "INFO"
     timestamp: "..."
    }
    

    ログイン失敗のトラブルシューティング

    ログインの試行が失敗すると、MySQL はセキュリティ上の理由から、最小限のエラー メッセージを返します。次に例を示します。

    $MYSQL_PWD=`gcloud-access-token mysql` --enable-cleartext-plugin --ssl-ca=server-ca.pem
    --ssl-cert=client-cert.pem --ssl-key=client-key.pem   --host=ip_address --user=testuser
    Access denied for user 'testuser'@'...' (using password: NO)
    

    エラーの詳細については、MySQL のエラーログを確認してください。詳細については、ログの表示をご覧ください。

    たとえば、前述のエラーについて、次のログエントリで問題解決のアクションについて説明されています。

    F ... [152172]: [1-1] db=...,user=... FATAL:  Cloud SQL IAM user authentication failed for user "..."
    I ... [152172]: [2-1] db=...,user=... DETAIL:  Request is missing required authentication credential. Expected OAuth 2 access token, log in cookie or other valid authentication credential. See https://developers.google.com/identity/sign-in/web/devconsole-project.
    

    表示されたエラー メッセージを確認します。メッセージに「Cloud SQL IAM ユーザー認証」または「Cloud SQL IAM サービス アカウント認証」を使用したことが示されていない場合は、ログインに使用したデータベース ユーザータイプが CLOUD_IAM_USER または CLOUD_IAM_SERVICE_ACCOUNT のいずれかかどうか確認します。IAM ユーザーのデータベース ユーザー名が、@ とドメインを含まない IAM ユーザーのメールアドレスであることを確認します。サービス アカウントの場合、@project-id.iam.gserviceaccount.com のないサービス アカウントのメールアドレスであることを確認します。

    IAM データベース認証を使用した場合は、エラー メッセージの詳細を確認します。エラー メッセージはデータベースのエラーログで確認できます。パスワードとして送信したアクセス トークン(OAuth 2.0)が無効であることが示されている場合は、gcloud auth application-default print-access-token gcloud コマンドで詳細を確認できます。

    curl -H "Content-Type: application/x-www-form-urlencoded" \
    -d "access_token=$(gcloud auth application-default print-access-token)" \
    https://www.googleapis.com/oauth2/v1/tokeninfo
    

    トークンが目的の IAM ユーザーまたはサービス アカウントのものであり、有効期限が切れていないことを確認します。

    詳細に権限の欠如が示されている場合は、インスタンスのプロジェクトの IAM ポリシーで事前定義 Cloud SQL Instance User ロールまたはカスタムロールを使用して、IAM ユーザーまたはサービス アカウントに cloudsql.instances.login 権限が付与されていることを確認します。サポートが必要な場合は、IAM Policy Troubleshooter をご覧ください。

    IAM データベース認証が利用できないためにログインに失敗した場合は、デフォルトの MySQL のユーザー名とパスワードを使用してログインできます。このログイン方法でもデータベース全体にアクセスできます。接続がセキュリティ保護されていることを確認します。

    IAM グループ認証を使用するユーザー アカウントのトラブルシューティング

    このセクションでは、IAM グループ認証のトラブルシューティング シナリオを示します。

    データベースにグループを追加できない

    インスタンスにグループを追加しようとすると、次のエラーが発生することがあります。

    (gcloud.sql.users.create) HTTPError 400: Invalid request: Provided CLOUD_IAM_GROUP: EMAIL, does not exist.
    

    入力したメールアドレスが有効なグループであることを確認してください。

    グループがまだ存在しない場合は、グループを作成します。グループの作成の詳細については、Google Cloud コンソールで Google グループを作成、管理するをご覧ください。

    次のエラーが表示された場合:

    (gcloud.sql.users.create) HTTPError 400: Invalid request: IAM Group Authentication is disabled.
    

    IAM グループ認証を使用する前に、Cloud SQL インスタンスに次のメンテナンス更新が必要です。

    R20240514.00_04 以降

    セルフサービス メンテナンスを使用して、メンテナンス更新をインスタンスに適用できます。詳細については、セルフサービス メンテナンスをご覧ください。

    既存の IAM ユーザーまたはサービス アカウントが、その IAM グループに付与されているデータベース権限を継承しない

    既存の IAM ユーザーまたはサービス アカウントがグループの正しいデータベース権限を継承していない場合は、次の手順を完了します。

    1. Google Cloud コンソールの [IAM] ページに移動します。

      [IAM] に移動

      アカウントが、Cloud SQL インスタンスに追加されたグループのメンバーであることを確認します。

    2. インスタンスのユーザー アカウントとサービス アカウントを一覧表示します。

      gcloud sql users list --instance=INSTANCE_NAME
      

      出力で、ユーザー アカウントまたはサービス アカウントが CLOUD_IAM_USER または CLOUD_IAM_SERVICE_ACCOUNT として一覧表示されているかどうかを確認します。

    3. ユーザー アカウントまたはサービス アカウントが CLOUD_IAM_USER または CLOUD_IAM_SERVICE_ACCOUNT として一覧表示されている場合は、アカウントをインスタンスから削除します。削除しようとしているアカウントは、グループのデータベース権限を継承しない個別の IAM アカウントです。

    4. ユーザー アカウントまたはサービス アカウントでインスタンスに再度ログインします。

      インスタンスに再度ログインすると、正しいアカウント タイプ CLOUD_IAM_GROUP_USER または CLOUD_IAM_GROUP_SERVICE_ACCOUNT でアカウントが再作成されます。

    次のステップ