Azure Database for MySQL - フレキシブル サーバーの場合は、まず Microsoft Entra 認証を手動で設定する必要があります。これには、個別のユーザー割り当てマネージド ID と特定の Microsoft Graph アクセス許可が必要です。 この手順は自動化できません。
az extension add --name rdbms-connect
az postgres flexible-server execute -n <postgres-name> -u <owner-username> -p "<owner-password>" -d <database-name> --querytext "GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO \"<aad-username>\";GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO \"<aad username>\";"
using Microsoft.Data.SqlClient;
// AZURE_SQL_CONNECTIONSTRING should be one of the following:
// For system-assigned managed identity:"Server=tcp:<server-name>.database.windows.net;Database=<database-name>;Authentication=Active Directory Default;TrustServerCertificate=True"
// For user-assigned managed identity: "Server=tcp:<server-name>.database.windows.net;Database=<database-name>;Authentication=Active Directory Default;User Id=<client-id-of-user-assigned-identity>;TrustServerCertificate=True"
string connectionString =
Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING")!;
using var connection = new SqlConnection(connectionString);
connection.Open();
import os;
import pyodbc
server = os.getenv('AZURE_SQL_SERVER')
port = os.getenv('AZURE_SQL_PORT')
database = os.getenv('AZURE_SQL_DATABASE')
authentication = os.getenv('AZURE_SQL_AUTHENTICATION') # The value should be 'ActiveDirectoryMsi'
# Uncomment the following lines according to the authentication type.
# For system-assigned managed identity.
# connString = f'Driver={{ODBC Driver 18 for SQL Server}};Server={server},{port};Database={database};Authentication={authentication};Encrypt=yes;'
# For user-assigned managed identity.
# client_id = os.getenv('AZURE_SQL_USER')
# connString = f'Driver={{ODBC Driver 18 for SQL Server}};Server={server},{port};Database={database};UID={client_id};Authentication={authentication};Encrypt=yes;'
conn = pyodbc.connect(connString)
using Azure.Core;
using Azure.Identity;
using MySqlConnector;
// Uncomment the following lines according to the authentication type.
// For system-assigned managed identity.
// var credential = new DefaultAzureCredential();
// For user-assigned managed identity.
// var credential = new DefaultAzureCredential(
// new DefaultAzureCredentialOptions
// {
// ManagedIdentityClientId = Environment.GetEnvironmentVariable("AZURE_MYSQL_CLIENTID");
// });
var tokenRequestContext = new TokenRequestContext(
new[] { "https://ossrdbms-aad.database.windows.net/.default" });
AccessToken accessToken = await credential.GetTokenAsync(tokenRequestContext);
// Open a connection to the MySQL server using the access token.
string connectionString =
$"{Environment.GetEnvironmentVariable("AZURE_MYSQL_CONNECTIONSTRING")};Password={accessToken.Token}";
using var connection = new MySqlConnection(connectionString);
Console.WriteLine("Opening connection using access token...");
await connection.OpenAsync();
// do something
using Azure.Identity;
using Azure.Core;
using Npgsql;
// Uncomment the following lines according to the authentication type.
// For system-assigned identity.
// var sqlServerTokenProvider = new DefaultAzureCredential();
// For user-assigned identity.
// var sqlServerTokenProvider = new DefaultAzureCredential(
// new DefaultAzureCredentialOptions
// {
// ManagedIdentityClientId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTID");
// }
// );
// Acquire the access token.
AccessToken accessToken = await sqlServerTokenProvider.GetTokenAsync(
new TokenRequestContext(scopes: new string[]
{
"https://ossrdbms-aad.database.windows.net/.default"
}));
// Combine the token with the connection string from the environment variables provided by Service Connector.
string connectionString =
$"{Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CONNECTIONSTRING")};Password={accessToken.Token}";
// Establish the connection.
using (var connection = new NpgsqlConnection(connectionString))
{
Console.WriteLine("Opening connection using access token...");
connection.Open();
}
azure-identity ライブラリから取得したアクセス トークンで認証し、トークンをパスワードとして使います。 Service Connector によって追加された環境変数から接続情報を取得します。 次のコードを使用する場合は、使用する認証型に対応するコード スニペットの一部をコメント解除します。
from azure.identity import DefaultAzureCredential
import psycopg2
# Uncomment the following lines according to the authentication type.
# For system-assigned identity.
# cred = DefaultAzureCredential()
# For user-assigned identity.
# managed_identity_client_id = os.getenv('AZURE_POSTGRESQL_CLIENTID')
# cred = ManagedIdentityCredential(client_id=managed_identity_client_id)
# Acquire the access token
accessToken = cred.get_token('https://ossrdbms-aad.database.windows.net/.default')
# Combine the token with the connection string from the environment variables added by Service Connector to establish the connection.
conn_string = os.getenv('AZURE_POSTGRESQL_CONNECTIONSTRING')
conn = psycopg2.connect(conn_string + ' password=' + accessToken.token)
import { DefaultAzureCredential, ClientSecretCredential } from "@azure/identity";
const { Client } = require('pg');
// Uncomment the following lines according to the authentication type.
// For system-assigned identity.
// const credential = new DefaultAzureCredential();
// For user-assigned identity.
// const clientId = process.env.AZURE_POSTGRESQL_CLIENTID;
// const credential = new DefaultAzureCredential({
// managedIdentityClientId: clientId
// });
// Acquire the access token.
var accessToken = await credential.getToken('https://ossrdbms-aad.database.windows.net/.default');
// Use the token and the connection information from the environment variables added by Service Connector to establish the connection.
(async () => {
const client = new Client({
host: process.env.AZURE_POSTGRESQL_HOST,
user: process.env.AZURE_POSTGRESQL_USER,
password: accesstoken.token,
database: process.env.AZURE_POSTGRESQL_DATABASE,
port: Number(process.env.AZURE_POSTGRESQL_PORT) ,
ssl: process.env.AZURE_POSTGRESQL_SSL
});
await client.connect();
await client.end();
})();
このサンプル コードは DefaultAzureCredential を使用して Azure データベースの使用可能トークンを Microsoft Entra ID から取得して、データベース接続に追加します。 DefaultAzureCredential はカスタマイズ可能ですが、既に既定で万能で使用できます。 トークンをサインインした Microsoft Entra ユーザーから取得するかマネージド ID から取得するかは、開発環境でローカルで実行するか、App Service で実行するかによって異なります。
これ以上変更することなく、あなたのコードは Azure で実行する準備ができました。 ただしコードをローカルでデバッグするには、サインインした Microsoft Entra ユーザーが開発環境に必要です。 この手順では、Microsoft Entra ユーザーでサインインして、お好きな環境を構成します。
Visual Studio for Windows は Microsoft Entra 認証と統合されています。 Visual Studio で開発とデバッグを有効にするには、メニューから [ファイル]>[アカウント設定] を選択し、[サインイン] または [追加] を選択して、Visual Studio で Microsoft Entra ユーザーを追加してください。
Azure サービス認証用に Microsoft Entra ユーザーを設定するには、メニューから [ツール]>[オプション] の順に選択した後、[Azure サービス認証]>[アカウントの選択] の順に選択してください。 追加した Microsoft Entra ユーザーを選択し、[OK] を選択してください。
Visual Studio for Mac は Microsoft Entra 認証と統合されて "いません"。 ただし、後で使用する Azure ID クライアント ライブラリでは、Azure CLI からトークンを取得することもできます。 Visual Studio での開発とデバッグを可能にするには、ご使用のローカル コンピューター上に Azure CLI をインストールします。
ご自分の Microsoft Entra ユーザーを使用して、次のコマンドで Azure CLI にサインインしてください。
az login --allow-no-subscriptions
Visual Studio Code は、Azure 拡張機能を介して Microsoft Entra 認証と統合されています。 Visual Studio Code で Azure Tools 拡張機能をインストールします。
必要に応じて、Microsoft Entra グループに ID を追加し、ID ではなく Microsoft Entra グループにアクセスを許可することができます。 たとえば、次のコマンドは、前の手順のマネージド ID を myAzureSQLDBAccessGroup という名前の新しいグループに追加します。
groupid=$(az ad group create --display-name myAzureSQLDBAccessGroup --mail-nickname myAzureSQLDBAccessGroup --query objectId --output tsv)
msiobjectid=$(az webapp identity show --resource-group <group-name> --name <app-name> --query principalId --output tsv)
az ad group member add --group $groupid --member-id $msiobjectid
az ad group member list -g $groupid
Microsoft Entra グループのデータベース アクセス許可を付与するには、それぞれのデータベースの種類に関するドキュメントを参照してください。
エラー SSL connection is required. Please specify SSL options and retry が発生します。