IAM 認証のトラブルシューティング

AlloyDB for PostgreSQL で失敗した Identity and Access Management(IAM)認証のログイン試行を診断して解決するには、ログ エクスプローラで認証アラートログを調べます。

IAM ベースの認証試行が失敗した原因を特定する手順は次のとおりです。

  1. Google Cloud コンソールで、[ログ エクスプローラ] ページに移動します。

    [ログ エクスプローラ] に移動

  2. [すべてのリソース] プルダウン リストで、[AlloyDB インスタンス] を選択します。

  3. [重大度] で [アラート] をクリックします。

    [アラート] がオプションとして提示されない場合は、選択した期間内に認証の失敗が記録されていません。ログ エクスプローラのコントロールを使用して、期間を調整する必要がある場合があります。

  4. [クエリ結果] で、次のいずれかのメッセージのログエントリを確認します。

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

    ACCESS_TOKEN を OAuth 2.0 アクセス トークンに置き換えます。

    このエラーは、サービス アカウントの短縮されたプリンシパル(.gserviceaccount.com サフィックスを除いたメールアドレス)が 63 文字を超えている場合にも発生します。

    PostgreSQL では、ロールとユーザーの識別子に 63 文字の上限があります。AlloyDB ではユーザーを作成できますが、PostgreSQL は内部カタログでロール名を 63 バイトに切り捨てます。ログイン時に、AlloyDB の IAM 認証レイヤは、OAuth トークンから取得した切り捨てられていない完全なプリンシパルと、切り捨てられたデータベース ロールを比較します。これにより、文字列の不一致が発生します。

    回避策: サービス アカウントの権限借用を使用する

    サービス アカウント名を短縮できない場合は、サービス アカウントの権限借用を使用することで、この制限を回避できます。これにより、ワークロードを実行する ID と、データベースへのログインに使用される ID が分離されます。

    1. .gserviceaccount.com サフィックスを除く短縮されたプリンシパルが 63 文字以下(db-proxy@PROJECT_ID.iam.gserviceaccount.com など)の名前でプロキシ サービス アカウントを作成します。
    2. ユーザー名 db-proxy@PROJECT_ID.iam を持つ IAM_BASED データベース ユーザーとして、プロキシ サービス アカウントを AlloyDB クラスタに追加します。
    3. IAM で、ワークロードの元のサービス アカウントに、プロキシ サービス アカウントに対するサービス アカウント トークン作成者のロール(roles/iam.serviceAccountTokenCreator)を付与します。
    4. プロキシ 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 スコープが含まれていません。これらのスコープのいずれかが必要です。