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

このページでは、IAM データベース認証を使用するユーザーまたはサービス アカウントをデータベースに追加する方法と、それらのユーザー アカウントとサービス アカウントを管理する方法について説明します。IAM インテグレーションの詳細については、IAM 認証をご覧ください。

始める前に

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

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 インスタンスに追加します。

    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 グループのメンバーを管理します。詳細については、Cloud Identity の概要をご覧ください。

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

変更が反映された後、変更を有効にするには、ユーザーまたはサービス アカウントがログアウトして再度ログインする必要があります。ただし、MySQL のグループに対するデータベース権限の付与または取り消しは、すぐに反映されます。たとえば、テーブルへのアクセス権を取り消すと、その 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 グループ認証はプレビューです。

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 グループを表示するには、次のコマンドを実行します。

    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 ログイン権限が削除されるまでログインできます。

    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 グループからロールを取り消すには、単一のロールを取り消すをご覧ください。

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

    監査ログを有効にして、データベースへの 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 でアカウントが再作成されます。

    次のステップ