システム割り当てマネージド 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# サンプル アプリケーションでトークン取得を実装します。
[前提条件]
- Azure リソースのマネージド ID 機能に慣れていない場合は、この 概要を参照してください。 Azure アカウントをお持ちでない場合は、続行する前に 無料アカウントにサインアップ してください。
- 必要なリソースの作成とロール管理を行うには、アカウントに適切なスコープ (サブスクリプションまたはリソース グループ) での "所有者" アクセス許可が必要です。 ロールの割り当てについてサポートが必要な場合は、「 Azure ロールを割り当てて Azure サブスクリプション リソースへのアクセスを管理する」を参照してください。
- マネージド ID を使用してデータベースにアクセスするために使用する Azure VM (Ubuntu Linux の実行など) が必要です
- Microsoft Entra 認証が構成されている Azure Database for PostgreSQL フレキシブル サーバー インスタンスが必要です
- C# の例に従う場合は、まず、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 サービスからアクセス トークンを取得し、データベースでの認証に使用できるようになりました。
このトークンの取得は、HTTPにhttp://169.254.169.254/metadata/identity/oauth2/token要求を行い、次のパラメーターを渡すことによって行われます。
api-version=2018-02-01resource=https://ossrdbms-aad.database.windows.net-
client_id=CLIENT_ID(前に取得した)
access_token フィールドを含む JSON の結果が返されます。この長いテキスト値は、データベースに接続するときにパスワードとして使用する必要があるマネージド ID アクセス トークンです。
テスト目的で、シェルで次のコマンドを実行できます。
注
curl、jq、および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