このページでは、IAM データベース認証を使用する Cloud SQL インスタンスにユーザー、サービス アカウント、グループを追加して管理する方法について説明します。
IAM インテグレーションの詳細については、IAM 認証をご覧ください。
始める前に
- 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.
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
-
In the Google Cloud console, on the project selector page, select or create a Google Cloud project.
-
Make sure that billing is enabled for your Google Cloud project.
- Install the Google Cloud CLI.
-
To initialize the gcloud CLI, run the following command:
gcloud init
- ユーザー アカウントに Cloud SQL 管理者のロールがあることを確認します。
- Cloud SQL インスタンスで IAM データベース認証を有効にします。
- IAM ユーザー、サービス アカウント、グループなどの IAM プリンシパルに必要な
cloudsql.instanceUser
IAM ロールを割り当てて、Cloud SQL インスタンスにログインします。 - 個々のユーザーまたは個々のサービス アカウントを Cloud SQL インスタンスに追加する場合は、各ユーザーとサービス アカウントに IAM ロールを個別に割り当てる必要があります。
- グループを追加する場合は、グループのメンバーが IAM ロールに関連付けられた IAM 権限を自動的に継承するように、グループに IAM ロールを割り当てる必要があります。Cloud Identity でグループを作成する方法については、Google Cloud コンソールで Google グループを作成、管理するをご覧ください。
- Cloud SQL インスタンスを含むプロジェクトにロールを付与するには、Google Cloud コンソールの IAM ページ、gcloud CLI、Terraform、または Cloud SQL Admin API を使用します。詳細については、ユーザー、サービス アカウント、またはグループに IAM ポリシー バインディングを追加するをご覧ください。
- サービス アカウントを使用している場合は、プロジェクト内のデータベースにアクセスする必要があるサービスごとに、サービス アカウントが追加されていることを確認します。
サービス アカウントの作成の詳細については、サービス アカウントを作成するをご覧ください。
ユーザー、サービス アカウント、またはグループに IAM ポリシー バインディングを追加する
この手順では、プロジェクト ID とバインディングを指定して、特定のプロジェクトの IAM ポリシーにポリシー バインディングを追加します。バインディング コマンドは、メンバー、ロール、省略可能な条件から構成されます。
データベース ユーザー名は、IAM ユーザーのメールアドレス(example-user@example.com
など)にする必要があります。すべて小文字にする必要があります。また、特殊文字(@
と .
)が含まれているため、引用符で囲む必要があります。
コンソール
-
Google Cloud コンソールの [IAM] ページに移動します。
- [追加] をクリックします。
- [新しいメンバー] にメールアドレスを入力します。個々のユーザー、サービス アカウント、グループをメンバーとして追加できますが、すべてのプロジェクトに少なくとも 1 つのプリンシパルがメンバーとして含まれている必要があります。
- [ロール] で、[Cloud SQL] に移動し、[Cloud SQL インスタンス ユーザー] を選択します。
- 省略可: Cloud SQL Auth Proxy または Cloud SQL 言語コネクタを使用して接続する場合は、[Cloud SQL クライアント] も選択します。
- [保存] をクリックします。
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 リソースを使用します。
変更を適用する
Google Cloud プロジェクトで Terraform 構成を適用するには、次のセクションの手順を完了します。
Cloud Shell を準備する
- Cloud Shell を起動します。
-
Terraform 構成を適用するデフォルトの Google Cloud プロジェクトを設定します。
このコマンドは、プロジェクトごとに 1 回だけ実行する必要があります。これは任意のディレクトリで実行できます。
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Terraform 構成ファイルに明示的な値を設定すると、環境変数がオーバーライドされます。
ディレクトリを準備する
Terraform 構成ファイルには独自のディレクトリ(ルート モジュールとも呼ばれます)が必要です。
-
Cloud Shell で、ディレクトリを作成し、そのディレクトリ内に新しいファイルを作成します。ファイルの拡張子は
.tf
にする必要があります(例:main.tf
)。このチュートリアルでは、このファイルをmain.tf
とします。mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
チュートリアルを使用している場合は、各セクションまたはステップのサンプルコードをコピーできます。
新しく作成した
main.tf
にサンプルコードをコピーします。必要に応じて、GitHub からコードをコピーします。Terraform スニペットがエンドツーエンドのソリューションの一部である場合は、この方法をおすすめします。
- 環境に適用するサンプル パラメータを確認し、変更します。
- 変更を保存します。
-
Terraform を初期化します。これは、ディレクトリごとに 1 回だけ行います。
terraform init
最新バージョンの Google プロバイダを使用する場合は、
-upgrade
オプションを使用します。terraform init -upgrade
変更を適用する
-
構成を確認して、Terraform が作成または更新するリソースが想定どおりであることを確認します。
terraform plan
必要に応じて構成を修正します。
-
次のコマンドを実行します。プロンプトで「
yes
」と入力して、Terraform 構成を適用します。terraform apply
Terraform に「Apply complete!」というメッセージが表示されるまで待ちます。
- Google Cloud プロジェクトを開いて結果を表示します。Google Cloud コンソールの UI でリソースに移動して、Terraform によって作成または更新されたことを確認します。
変更を削除する
変更を削除するには、次の手順を行います。
- 削除の保護を無効にするには、Terraform 構成ファイルで
deletion_protection
引数をfalse
に設定します。deletion_protection = "false"
- 次のコマンドを実行します。プロンプトで「
yes
」と入力して、更新された Terraform 構成を適用します。terraform apply
-
以前に Terraform 構成で適用されたリソースを削除するために、次のコマンドを実行してプロンプトで「
yes
」と入力します。terraform destroy
Terraform
必要なポリシー バインディングを IAM ユーザーとサービス アカウントに追加するには、Terraform リソースを使用します。
変更を適用する
Google Cloud プロジェクトで Terraform 構成を適用するには、次のセクションの手順を完了します。
Cloud Shell を準備する
- Cloud Shell を起動します。
-
Terraform 構成を適用するデフォルトの Google Cloud プロジェクトを設定します。
このコマンドは、プロジェクトごとに 1 回だけ実行する必要があります。これは任意のディレクトリで実行できます。
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Terraform 構成ファイルに明示的な値を設定すると、環境変数がオーバーライドされます。
ディレクトリを準備する
Terraform 構成ファイルには独自のディレクトリ(ルート モジュールとも呼ばれます)が必要です。
-
Cloud Shell で、ディレクトリを作成し、そのディレクトリ内に新しいファイルを作成します。ファイルの拡張子は
.tf
にする必要があります(例:main.tf
)。このチュートリアルでは、このファイルをmain.tf
とします。mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
チュートリアルを使用している場合は、各セクションまたはステップのサンプルコードをコピーできます。
新しく作成した
main.tf
にサンプルコードをコピーします。必要に応じて、GitHub からコードをコピーします。Terraform スニペットがエンドツーエンドのソリューションの一部である場合は、この方法をおすすめします。
- 環境に適用するサンプル パラメータを確認し、変更します。
- 変更を保存します。
-
Terraform を初期化します。これは、ディレクトリごとに 1 回だけ行います。
terraform init
最新バージョンの Google プロバイダを使用する場合は、
-upgrade
オプションを使用します。terraform init -upgrade
変更を適用する
-
構成を確認して、Terraform が作成または更新するリソースが想定どおりであることを確認します。
terraform plan
必要に応じて構成を修正します。
-
次のコマンドを実行します。プロンプトで「
yes
」と入力して、Terraform 構成を適用します。terraform apply
Terraform に「Apply complete!」というメッセージが表示されるまで待ちます。
- Google Cloud プロジェクトを開いて結果を表示します。Google Cloud コンソールの UI でリソースに移動して、Terraform によって作成または更新されたことを確認します。
変更を削除する
変更を削除するには、次の手順を行います。
- 削除の保護を無効にするには、Terraform 構成ファイルで
deletion_protection
引数をfalse
に設定します。deletion_protection = "false"
- 次のコマンドを実行します。プロンプトで「
yes
」と入力して、更新された Terraform 構成を適用します。terraform apply
-
以前に Terraform 構成で適用されたリソースを削除するために、次のコマンドを実行してプロンプトで「
yes
」と入力します。terraform destroy
REST
get-iam-policy
コマンドで返された JSON または YAML バインディング ポリシーを編集して、cloudsql.instanceUser
と cloudsql.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 を選択します。
コンソール
-
Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。
- インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
- SQL ナビゲーション メニューから [ユーザー] を選択します。
- [ユーザー アカウントを追加] をクリックします。[ユーザー アカウントをインスタンス instance_name に追加] タブが開きます。
- [Cloud IAM] ラジオボタンをクリックします。
- [プリンシパル] フィールドに、追加するユーザーまたはサービス アカウントのメールアドレスを追加します。
- [追加] をクリックします。ユーザー アカウントのリストにユーザーまたはサービス アカウントが表示されます。
ユーザー アカウントの作成後にユーザーに
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 リソースを使用します。
変更を適用する
Google Cloud プロジェクトで Terraform 構成を適用するには、次のセクションの手順を完了します。
Cloud Shell を準備する
- Cloud Shell を起動します。
-
Terraform 構成を適用するデフォルトの Google Cloud プロジェクトを設定します。
このコマンドは、プロジェクトごとに 1 回だけ実行する必要があります。これは任意のディレクトリで実行できます。
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Terraform 構成ファイルに明示的な値を設定すると、環境変数がオーバーライドされます。
ディレクトリを準備する
Terraform 構成ファイルには独自のディレクトリ(ルート モジュールとも呼ばれます)が必要です。
-
Cloud Shell で、ディレクトリを作成し、そのディレクトリ内に新しいファイルを作成します。ファイルの拡張子は
.tf
にする必要があります(例:main.tf
)。このチュートリアルでは、このファイルをmain.tf
とします。mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
チュートリアルを使用している場合は、各セクションまたはステップのサンプルコードをコピーできます。
新しく作成した
main.tf
にサンプルコードをコピーします。必要に応じて、GitHub からコードをコピーします。Terraform スニペットがエンドツーエンドのソリューションの一部である場合は、この方法をおすすめします。
- 環境に適用するサンプル パラメータを確認し、変更します。
- 変更を保存します。
-
Terraform を初期化します。これは、ディレクトリごとに 1 回だけ行います。
terraform init
最新バージョンの Google プロバイダを使用する場合は、
-upgrade
オプションを使用します。terraform init -upgrade
変更を適用する
-
構成を確認して、Terraform が作成または更新するリソースが想定どおりであることを確認します。
terraform plan
必要に応じて構成を修正します。
-
次のコマンドを実行します。プロンプトで「
yes
」と入力して、Terraform 構成を適用します。terraform apply
Terraform に「Apply complete!」というメッセージが表示されるまで待ちます。
- Google Cloud プロジェクトを開いて結果を表示します。Google Cloud コンソールの UI でリソースに移動して、Terraform によって作成または更新されたことを確認します。
変更を削除する
変更を削除するには、次の手順を行います。
- 削除の保護を無効にするには、Terraform 構成ファイルで
deletion_protection
引数をfalse
に設定します。deletion_protection = "false"
- 次のコマンドを実行します。プロンプトで「
yes
」と入力して、更新された Terraform 構成を適用します。terraform apply
-
次のコマンドを実行します。プロンプトで「
yes
」と入力して、以前に Terraform 構成で適用されたリソースを削除します。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 インスタンスに自動的に追加するをご覧ください。
コンソール
-
Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。
- インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
- SQL ナビゲーション メニューから [ユーザー] を選択します。
- [ユーザー アカウントを追加] をクリックします。[ユーザー アカウントをインスタンス instance_name に追加] タブが開きます。
- [Cloud IAM] ラジオボタンをクリックします。
- [プリンシパル] フィールドに、追加するグループのメールアドレスを追加します。
- [追加] をクリックします。グループがユーザーリストに表示されます。
ユーザー アカウントの作成後にグループに
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 リソースを使用します。
変更を適用する
Google Cloud プロジェクトで Terraform 構成を適用するには、次のセクションの手順を完了します。
Cloud Shell を準備する
- Cloud Shell を起動します。
-
Terraform 構成を適用するデフォルトの Google Cloud プロジェクトを設定します。
このコマンドは、プロジェクトごとに 1 回だけ実行する必要があります。これは任意のディレクトリで実行できます。
export GOOGLE_CLOUD_PROJECT=PROJECT_ID
Terraform 構成ファイルに明示的な値を設定すると、環境変数がオーバーライドされます。
ディレクトリを準備する
Terraform 構成ファイルには独自のディレクトリ(ルート モジュールとも呼ばれます)が必要です。
-
Cloud Shell で、ディレクトリを作成し、そのディレクトリ内に新しいファイルを作成します。ファイルの拡張子は
.tf
にする必要があります(例:main.tf
)。このチュートリアルでは、このファイルをmain.tf
とします。mkdir DIRECTORY && cd DIRECTORY && touch main.tf
-
チュートリアルを使用している場合は、各セクションまたはステップのサンプルコードをコピーできます。
新しく作成した
main.tf
にサンプルコードをコピーします。必要に応じて、GitHub からコードをコピーします。Terraform スニペットがエンドツーエンドのソリューションの一部である場合は、この方法をおすすめします。
- 環境に適用するサンプル パラメータを確認し、変更します。
- 変更を保存します。
-
Terraform を初期化します。これは、ディレクトリごとに 1 回だけ行います。
terraform init
最新バージョンの Google プロバイダを使用する場合は、
-upgrade
オプションを使用します。terraform init -upgrade
変更を適用する
-
構成を確認して、Terraform が作成または更新するリソースが想定どおりであることを確認します。
terraform plan
必要に応じて構成を修正します。
-
次のコマンドを実行します。プロンプトで「
yes
」と入力して、Terraform 構成を適用します。terraform apply
Terraform に「Apply complete!」というメッセージが表示されるまで待ちます。
- Google Cloud プロジェクトを開いて結果を表示します。Google Cloud コンソールの UI でリソースに移動して、Terraform によって作成または更新されたことを確認します。
変更を削除する
変更を削除するには、次の手順を行います。
- 削除の保護を無効にするには、Terraform 構成ファイルで
deletion_protection
引数をfalse
に設定します。deletion_protection = "false"
- 次のコマンドを実行します。プロンプトで「
yes
」と入力して、更新された Terraform 構成を適用します。terraform apply
-
次のコマンドを実行します。プロンプトで「
yes
」と入力して、以前に Terraform 構成で適用されたリソースを削除します。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 を実行します。
次のように置き換えます。
@
とドメイン文字列は除く)です。たとえば、IAM ユーザーのメールアドレスが example-user@example.com
の場合、ユーザー名は example-user
になります。サービス アカウントの場合、これは @project-id.iam.gserviceaccount.com
ドメインのないサービス アカウントのメールアドレスです。grant select on DATABASE_NAME.TABLE_NAME to "USERNAME";
IAM グループにデータベース権限を付与する
IAM グループ認証を使用する場合は、個々のユーザーまたはサービス アカウントに権限を付与するのではなく、IAM グループにデータベース権限を付与します。デフォルトでは、IAM グループを Cloud SQL インスタンスに追加しても、そのグループにはデータベース権限が付与されません。
IAM グループにデータベース権限を付与するには、GRANT ステートメントを使用します。各グループ メンバー(ユーザーとサービス アカウントを含む)は、Cloud SQL インスタンスに初めてログインした後に、グループに付与されているデータベース権限を自動的に継承します。
次のように置き換えます。
@
とドメイン名は切り捨てられます。たとえば、IAM グループのメールアドレスが example-group@example.com
の場合、グループ名は example-group
になります。mysql
コマンドラインから GRANT を実行します。
grant select on DATABASE_NAME.TABLE_NAME to "GROUP_NAME"@"HOSTNAME";
HOSTNAME は、IAM グループのメールアドレスのドメイン名に置き換えます。
権限の付与の詳細については、MySQL ドキュメントの GRANT リファレンス ページをご覧ください。
IAM グループに付与したデータベース権限はすぐに有効になります。
Cloud SQL インスタンスに追加された IAM ユーザー、サービス アカウント、グループを表示する
Cloud SQL インスタンスに追加された IAM ユーザー、サービス アカウント、グループを表示するには、次のコマンドを実行します。
コンソール
-
Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。
- インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
- SQL ナビゲーション メニューから [ユーザー] を選択します。インスタンスに追加された IAM ユーザー、サービス アカウント、Cloud Identity グループのリストが表示されます。
- 省略可: インスタンスにすでにログインしている 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 インスタンスから削除するには、次のコマンドを使用してアカウントを削除します。
コンソール
-
Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。
- インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
- SQL ナビゲーション メニューから [ユーザー] を選択します。
- 削除するユーザーの をクリックします。
- [削除] を選択します。これにより、このインスタンスへのアクセス権のみが取り消されます。
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 グループ ユーザーとサービス アカウントをインスタンスから自動的に削除します。
コンソール
-
Google Cloud コンソールで Cloud SQL の [インスタンス] ページに移動します。
- インスタンスの [概要] ページを開くには、インスタンス名をクリックします。
- SQL ナビゲーション メニューから [ユーザー] を選択します。
- 削除するグループの をクリックします。
- [削除] を選択します。これにより、このインスタンスへのアクセス権のみが取り消されます。
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 ユーザーまたはサービス アカウントがグループの正しいデータベース権限を継承していない場合は、次の手順を完了します。
Google Cloud コンソールの [IAM] ページに移動します。
アカウントが、Cloud SQL インスタンスに追加されたグループのメンバーであることを確認します。
インスタンスのユーザー アカウントとサービス アカウントを一覧表示します。
gcloud sql users list --instance=INSTANCE_NAME
出力で、ユーザー アカウントまたはサービス アカウントが
CLOUD_IAM_USER
またはCLOUD_IAM_SERVICE_ACCOUNT
として一覧表示されているかどうかを確認します。ユーザー アカウントまたはサービス アカウントが
CLOUD_IAM_USER
またはCLOUD_IAM_SERVICE_ACCOUNT
として一覧表示されている場合は、アカウントをインスタンスから削除します。削除しようとしているアカウントは、グループのデータベース権限を継承しない個別の IAM アカウントです。ユーザー アカウントまたはサービス アカウントでインスタンスに再度ログインします。
インスタンスに再度ログインすると、正しいアカウント タイプ
CLOUD_IAM_GROUP_USER
またはCLOUD_IAM_GROUP_SERVICE_ACCOUNT
でアカウントが再作成されます。
次のステップ
- IAM データベース認証について学習する。
- Cloud SQL データベースにログインする方法を確認する。
- IAM データベース認証用にインスタンスを構成する方法を確認する。