次の方法で共有


マネージド ID を使用して Azure Database for PostgreSQL に接続する

システム割り当てマネージド ID とユーザー割り当てマネージド ID の両方を使用して、Azure Database for PostgreSQL フレキシブル サーバー インスタンスに対する認証を行うことができます。 この記事では、Azure 仮想マシン (VM) のシステム割り当てマネージド ID を使用して、Azure Database for PostgreSQL フレキシブル サーバー インスタンスにアクセスする方法について説明します。 マネージド ID は Azure によって自動的に管理され、コードに資格情報を挿入しなくても、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 で実行する必要があります。 HOST、USER ( <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: データベース名を 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