AlloyDB for PostgreSQL で失敗した Identity and Access Management(IAM)認証のログイン試行を診断して解決するには、ログ エクスプローラで認証アラートログを調べます。
IAM ベースの認証試行が失敗した原因を特定する手順は次のとおりです。
Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。
[すべてのリソース] プルダウン リストで、[AlloyDB インスタンス] を選択します。
[重大度] で [アラート] をクリックします。
[アラート] がオプションとして提示されない場合は、選択した期間内に認証の失敗が記録されていません。ログ エクスプローラのコントロールを使用して、期間を調整する必要がある場合があります。
[クエリ結果] で、次のいずれかのメッセージのログエントリを確認します。
Request had invalid authentication credentials.- アクセス トークンが無効です。
Caller does not have required permission to use project.- IAM プリンシパルに必要な IAM ロールまたは権限がありません。完全なエラー メッセージには、不足しているロールまたは権限が指定されています。
IAM principal does not match database user.アクセス トークンで指定された認証済み IAM プリンシパルが、接続するデータベース ユーザーと一致しません。
トークンで指定されたプリンシパルを表示するには、次のコマンドを実行します。
curl -H "Content-Type: application/x-www-form-urlencoded" \ -d "access_token=ACCESS_TOKEN" \ https://www.googleapis.com/oauth2/v1/tokeninfoACCESS_TOKENを OAuth 2.0 アクセス トークンに置き換えます。このエラーは、サービス アカウントの短縮されたプリンシパル(
.gserviceaccount.comサフィックスを除いたメールアドレス)が 63 文字を超えている場合にも発生します。PostgreSQL では、ロールとユーザーの識別子に 63 文字の上限があります。AlloyDB ではユーザーを作成できますが、PostgreSQL は内部カタログでロール名を 63 バイトに切り捨てます。ログイン時に、AlloyDB の IAM 認証レイヤは、OAuth トークンから取得した切り捨てられていない完全なプリンシパルと、切り捨てられたデータベース ロールを比較します。これにより、文字列の不一致が発生します。
回避策: サービス アカウントの権限借用を使用する
サービス アカウント名を短縮できない場合は、サービス アカウントの権限借用を使用することで、この制限を回避できます。これにより、ワークロードを実行する ID と、データベースへのログインに使用される ID が分離されます。
.gserviceaccount.comサフィックスを除く短縮されたプリンシパルが 63 文字以下(db-proxy@PROJECT_ID.iam.gserviceaccount.comなど)の名前でプロキシ サービス アカウントを作成します。- ユーザー名
db-proxy@PROJECT_ID.iamを持つIAM_BASEDデータベース ユーザーとして、プロキシ サービス アカウントを AlloyDB クラスタに追加します。 - IAM で、ワークロードの元のサービス アカウントに、プロキシ サービス アカウントに対するサービス アカウント トークン作成者のロール(
roles/iam.serviceAccountTokenCreator)を付与します。 - プロキシ ID を使用して接続するように、アプリケーション、AlloyDB 言語コネクタ、または AlloyDB Auth Proxy を構成します。
たとえば、
--impersonate-service-accountフラグを指定してgcloud beta alloydb connectコマンドを使用すると、接続できます。gcloud beta alloydb connect INSTANCE_ID \ --cluster=CLUSTER_ID \ --region=REGION_ID \ --impersonate-service-account=PROXY_SERVICE_ACCOUNT_EMAIL \ --auto-iam-authn次のように置き換えます。
INSTANCE_ID: AlloyDB インスタンスの ID。CLUSTER_ID: インスタンスが含まれているクラスタの ID。REGION_ID: クラスタが存在するリージョン。PROXY_SERVICE_ACCOUNT_EMAIL: プロキシ サービス アカウントの完全なメールアドレス。
注: 元のサービス アカウントには、データベースへの直接ログイン アクセスは必要ありません。プロキシ アカウントの権限を借用する権限のみが必要です。プロキシ サービス アカウントがデータベース権限を保持します。
Request had insufficient scopes.- アクセス トークンに
alloydb.loginスコープまたはcloud-platformスコープが含まれていません。これらのスコープのいずれかが必要です。