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

このページでは、IAM データベース認証を使用するユーザーまたはサービス アカウントをデータベースに追加する方法と、それらのユーザー アカウントとサービス アカウントを管理する方法について説明します。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. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. Google Cloud CLI をインストールします。
  5. gcloud CLI を初期化するには:

    gcloud init
  6. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  7. Google Cloud プロジェクトで課金が有効になっていることを確認します

  8. Google Cloud CLI をインストールします。
  9. gcloud CLI を初期化するには:

    gcloud init
  10. Cloud Key Management Service API を有効にします。

    API を有効にする

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

    IAM ページに移動

  12. Cloud SQL インスタンスで IAM データベース認証を有効にします
  13. ユーザーがアクセスする必要があるデータベースを含むプロジェクトごとに、IAM アクセス権を必要とするユーザーに権限を付与してください。詳しくは、リソースに対するアクセス権の付与、変更、取り消しの手順をご覧ください。
  14. プロジェクト内のデータベースにアクセスする必要があるサービスごとに、サービス アカウントが追加されていることを確認します。
  15. IAM グループ認証を使用している場合は、プロジェクト内のデータベースへのアクセスを必要とする Cloud Identity グループを作成済みであることを確認してください。

IAM ユーザーまたはサービス アカウントをデータベース インスタンスに追加する

データベース インスタンスへのアクセスを許可する IAM ユーザーごとに、新しいデータベース ユーザーを作成する必要があります。データベース ユーザー名は、IAM ユーザーのメールアドレス(test-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. ユーザーが Cloud SQL インスタンス ユーザーのロールに割り当てられていない場合、ユーザー名の左側に 三角形 アイコンが表示されます。

    ユーザーにログイン権限を付与するには、アイコンをクリックしてから [IAM ロールを追加] を選択します。アイコンが消えます。これで、ユーザーがロールのメンバーになりました。

gcloud

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

メールアドレス(test-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. 次のコマンドを実行します。プロンプトで「yes」と入力して、以前に Terraform 構成で適用されたリソースを削除します。

    terraform destroy

REST v1

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

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

  • project-id: プロジェクト ID
  • instance-id: ユーザーを追加するインスタンスのインスタンス ID
  • username: ユーザーのメールアドレス
  • operation-id: オペレーションの ID

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
  • operation-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: ユーザーのメールアドレス
  • operation-id: オペレーションの ID

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
  • operation-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"
}

グループをデータベース インスタンスに追加する

インスタンスに対して IAM グループ認証を構成する手順は次のとおりです。

  1. Cloud Identity グループをまだ作成していない場合は、Cloud SQL インスタンスを管理するプロジェクトに作成します。詳細については、Cloud Identity の概要をご覧ください。

  2. 次のコマンドを実行して、グループを Cloud SQL インスタンスに追加します。

    コンソール

    グループをインスタンスに追加する機能は、プレビュー中は Google Cloud コンソールでは利用できません。

    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
       

    REST v1

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

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

    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 グループのメールアドレス
    • OPERATION_ID: オペレーションの ID

    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 Identity グループをインスタンスに追加しても、そのグループのメンバーが自動的にユーザーとしてインスタンスに追加されるわけではありません。メンバーがインスタンスに初めてログインしたときに、そのインスタンス上にユーザーまたはサービス アカウントが作成されます。

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

インスタンス上のグループ内のユーザーまたはサービス アカウントを管理する

インスタンスへのアクセスを制御するには、Cloud Identity グループのメンバーを管理します。詳細については、Cloud Identity の概要をご覧ください。

1 人のユーザーが複数の Cloud Identity グループのメンバーになることもあります。1 人のユーザーが 1 つのインスタンス上の複数の Cloud Identity グループに属している場合は、各グループでの IAM 権限とデータベース権限すべてを結合したものがそのユーザーに付与されます。

グループ メンバーの変更(たとえばアカウントの追加)の反映には約 15 分かかります。これは、IAM の変更に必要な時間とは別のものです。

変更が反映された後、変更を有効にするには、ユーザーまたはサービス アカウントがログアウトして再度ログインする必要があります。ただし、MySQL のグループに対するデータベース権限の付与または取り消しは、すぐに反映されます。たとえば、あるテーブルへのアクセス権が取り消されると、その Cloud Identity グループのメンバーは即座にそのテーブルへのアクセス権を失うため、ログアウトと再ログインが求められることはありません。

追加の Cloud Identity がインスタンスに追加されたときに、その新しいグループでの権限を受け取るには、ユーザーはログアウトして再度ログインする必要があります。

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

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

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

コンソール

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

    [IAM] に移動

  2. [追加] をクリックします。
  3. [新しいメンバー] にメールアドレスを入力します。個々のユーザー、サービス アカウント、グループをメンバーとして追加できますが、すべてのプロジェクトに少なくとも 1 つのプリンシパルがメンバーとして含まれている必要があります。
  4. [ロール] で、[Cloud SQL] に移動し、[Cloud SQL インスタンス ユーザー]、[Cloud SQL クライアント] をクリックします。
  5. 個々のユーザーとサービス アカウントに対して、[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
  

--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
  

--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 インスタンス ユーザーのロールが付与され、このプロジェクトのインスタンスにログインできます。

IAM グループ認証はプレビュー中です。

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. 以前に Terraform 構成で適用されたリソースを削除するために、次のコマンドを実行してプロンプトで「yes」と入力します。

    terraform destroy

REST

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

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

IAM ユーザーにデータベース権限を付与する

デフォルトでは、IAM ユーザーがデータベース インスタンスに追加されると、その新しいユーザーにはデータベースに対する権限が付与されません。

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

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

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

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

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

    Cloud Identity グループ内のユーザーにデータベース権限を付与するには、GRANT ステートメントを使用します。

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

    • GROUP_NAME: Cloud Identity グループのメールアドレスの最初の部分。たとえば、メールアドレス example-group@example.com を使用する場合、Cloud Identity グループ名は example-group です。
    • HOSTNAME: メールアドレスの 2 番目の部分は、Cloud Identity グループのホスト名を表します。たとえば、メールアドレス example-group@example.com を使用する場合、ホスト名は example.com です。
    • DATABASE_NAME: テーブルをホストするデータベースの名前。
    • TABLE_NAME: Cloud Identity グループのメンバーにアクセス権を付与するテーブルの名前。

    mysql コマンドラインから GRANT を実行します。

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

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

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

    グループ、IAM ユーザー、サービス アカウントを表示する

    インスタンスに追加された Cloud Identity グループを表示するには、次のコマンドを実行します。

    コンソール

    インスタンス上のグループを表示する機能は、プレビュー中は Google Cloud コンソールでは利用できません。

    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 です。

    データベースから IAM ユーザーまたはサービス アカウントを削除する

    データベースからユーザーまたはサービス アカウントを削除するには、アカウントをインスタンスから削除します。

    コンソール

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

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

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

    gcloud

    ユーザーを取り消す

    メールアドレス(test-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"
    }
    

    IAM グループ認証ユーザー アカウントまたはサービス アカウントを削除する

    gcloud CLI を使用して、IAM グループ認証で作成されたユーザー アカウントまたはサービス アカウントを削除することはできません。これらのアカウントは、ユーザー アカウントまたはサービス アカウントが初めてログインした後に、Cloud SQL によって自動的に作成されます。

    これらのアカウントを削除する方法は、スーパーユーザー権限を持つユーザーで MySQL クライアントを使用することのみです。

    ユーザー アカウントまたはサービス アカウントを削除するクエリを生成するには、MySQL のドキュメントをご覧ください。

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

    インスタンスから Cloud Identity グループを削除すると、その Cloud Identity グループに属するすべてのユーザー アカウントとサービス アカウントは、Cloud Identity グループに付与されているデータベース権限を失います。その Cloud Identity グループに属するユーザーとサービス アカウントがログインすることは、IAM ログイン権限がグループから削除されるまでは可能です。

    コンソール

    グループをインスタンスから削除する機能は、プレビュー中は Google Cloud コンソールでは利用できません。

    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 ログイン権限を削除する

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

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

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

    ユーザーを Cloud Identity グループから削除できます。

    この削除が IAM を通じて反映された後も、そのユーザーに適切な IAM 権限が付与されている場合は、引き続きデータベースにログインできる可能性があります。ただし、Cloud Identity グループから削除されたユーザーが再度ログインしたときは、そのグループに属するデータベース権限を持たない状態になります。

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

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

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

    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.
    

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

    グループがまだ存在しない場合は、グループを作成します。グループの作成の詳細については、Cloud Identity の概要をご覧ください。

    既存の 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 でアカウントが再作成されます。

    次のステップ