Azure Database for PostgreSQL フレキシブル サーバーでマネージド ID を使用して接続する

システム割り当てマネージド ID とユーザー割り当てマネージド ID の両方を使用して、Azure Database for PostgreSQLフレキシブル サーバーに対する認証を行うことができます。 この記事では、Azure仮想マシン (VM) のシステム割り当てマネージド ID を使用して、Azure Database for PostgreSQLフレキシブル サーバーにアクセスする方法について説明します。 Azureはマネージド ID を自動的に管理し、コードに資格情報を挿入しなくても、Microsoft Entra認証をサポートするサービスに対して認証できます。

次の方法を学びます:

  • Azure Database for PostgreSQLフレキシブル サーバーへのアクセス権を VM に付与します。
  • VM のシステム割り当て ID を表すユーザーをデータベースに作成します。
  • VM ID を使用してアクセス トークンを取得し、それを使用してAzure Database for PostgreSQLフレキシブル サーバーのクエリを実行します。
  • C# サンプル アプリケーションでトークン取得を実装します。

[前提条件]

VM のシステム割り当てマネージド ID を作成する

コマンドで identity assign を使用して、システム割り当て ID を既存の VM に追加します。

az vm identity assign -g myResourceGroup -n myVm

システム割り当てマネージド ID のアプリケーション ID を取得します。これは、次のいくつかの手順で必要になります。

# Get the client ID (application ID) of the system-assigned managed identity

az ad sp list --display-name vm-name --query [*].appId --out tsv

マネージド ID 用の Azure Database for PostgreSQL ユーザーを作成する

次に、Microsoft Entra管理者ユーザーとして Azure Database for PostgreSQL フレキシブル サーバー データベースに接続し、次の SQL ステートメントを実行します。 <identity_name>を、システム割り当てマネージド ID を作成したリソースの名前に置き換えます。

pgaadauth_create_principal Postgres データベースで実行する必要があることに注意してください。

select * from pgaadauth_create_principal('<identity_name>', false, false);

成功は次のようになります。

    pgaadauth_create_principal
-----------------------------------
 Created role for "<identity_name>"
(1 row)

Microsoft Entra ID 対応データベース ロールの管理の詳細については、「 Azure Database for PostgreSQL での Microsoft Entra ロールの管理」を参照してください。

ID 名をロール名として、Microsoft Entra トークンをパスワードとして認証するときに、マネージド ID にアクセスできるようになりました。

マネージド ID が有効でない場合は、 ERROR: Could not validate AAD user <ObjectId> because its name is not found in the tenant. [...]というエラーが返されます。

"No function matches..." のようなエラーが表示された場合は、作成した別のデータベースではなく、 postgres データベースに接続していることを確認してください。

Azure インスタンス メタデータ サービスからアクセス トークンを取得する

これで、アプリケーションは Azure Instance Metadata サービスからアクセス トークンを取得し、データベースでの認証に使用できるようになりました。

このトークンの取得は、HTTPhttp://169.254.169.254/metadata/identity/oauth2/token要求を行い、次のパラメーターを渡すことによって行われます。

  • api-version = 2018-02-01
  • resource = https://ossrdbms-aad.database.windows.net
  • client_id = CLIENT_ID(以前取得した)

access_token フィールドを含む JSON の結果が返されます。この長いテキスト値は、データベースに接続するときにパスワードとして使用する必要があるマネージド ID アクセス トークンです。

テスト目的で、シェルで次のコマンドを実行できます。

curljq、およびpsql クライアントがインストールされている必要があることに注意してください。

# Retrieve the access token

export PGPASSWORD=`curl -s 'http://169.254.169.254/metadata/identity/oauth2/token?api-version=2018-02-01&resource=https%3A%2F%2Fossrdbms-aad.database.windows.net&client_id=CLIENT_ID' -H Metadata:true | jq -r .access_token`

# Connect to the database

psql -h SERVER --user USER DBNAME

これで、先ほど構成したデータベースに接続されました。

マネージド ID を使用して接続する

このセクションでは、VM のユーザー割り当てマネージド ID を使用してアクセス トークンを取得し、それを使用して Azure Database for PostgreSQL フレキシブル サーバーを呼び出す方法について説明します。 Azure Database for PostgreSQL では Microsoft Entra 認証がネイティブにサポートされているため、Azure リソースのマネージド ID を使用して取得したアクセス トークンを直接受け入れることができます。 Azure Database for PostgreSQL への接続を作成するときは、パスワード フィールドにアクセス トークンを渡します。

Python でマネージド ID を使用して接続する

Python のコード例については、「クイック スタート: Python を使用して Azure Database for PostgreSQL のデータに接続してクエリを実行する」を参照してください。

Java でマネージド ID を使用して接続する

Javaコード例については、「クイック スタート: Azure Database for PostgreSQLで Java と JDBC を使用する」を参照してください。

C でマネージド ID を使用して接続する#

アクセス トークンを使用してAzure Database for PostgreSQLフレキシブル サーバーへの接続を開く.NETコード例を次に示します。 このコードは、システム割り当てマネージド ID を使用して、Microsoft Entra IDからアクセス トークンを取得するために VM 上で実行する必要があります。 HOSTUSER (<identity_name>)、およびDATABASEの値を置き換えます。

using Azure.Identity;
using Npgsql;
using System;

class Program
{
    static void Main(string[] args)
    {
        try
        {
            // Obtain an access token using the system-assigned managed identity
            var tokenCredential = new DefaultAzureCredential();
            var accessToken = tokenCredential.GetToken(
                new Azure.Core.TokenRequestContext(new[] { "https://ossrdbms-aad.database.windows.net/.default" })
            );

            // Build the connection string
            string host = "your-server-name.postgres.database.azure.com"; // Replace with your flexible server's host
            string database = "your-database-name";                      // Replace with your database name
            string user = "<identity_name>";                             // Replace with your identity name (e.g., "myManagedIdentity")

            var connectionString = $"Host={host};Database={database};Username={user};Password={accessToken.Token};SSL Mode=Require;Trust Server Certificate=true";

            // Open a connection to the database
            using var connection = new NpgsqlConnection(connectionString);
            connection.Open();

            Console.WriteLine("Connection successful!");

            // Optional: Perform a simple query
            using var command = new NpgsqlCommand("SELECT version();", connection);
            using var reader = command.ExecuteReader();
            while (reader.Read())
            {
                Console.WriteLine($"PostgreSQL version: {reader.GetString(0)}");
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"An error occurred: {ex.Message}");
        }
    }
}

次のプレースホルダーを入力します。

  • HOST: your-server-name.postgres.database.azure.com をサーバーのホスト名に置き換えます。
  • USER: <identity_name> をマネージド ID の名前に置き換えます。
  • DATABASE: your-database-nameを、Azure Database for PostgreSQL フレキシブル サーバーの名前に置き換えます。
  • Microsoft Entra 認証: このコードでは、VM のシステム割り当てマネージド ID を使用して、Microsoft Entra ID からアクセス トークンをフェッチします。

このコマンドを実行すると、次のような出力が表示されます。

Getting access token from Azure AD...
Opening connection using access token...

Connected!

Postgres version: PostgreSQL 11.11, compiled by Visual C++ build 1800, 64-bit