PostgresデータベースをAzure関数のAzureAD認証に接続する場合は、Azure ManagedIdentityでAzureAD認証を実行してから、AzureADアクセストークンを取得してデータベースに接続できます。
詳細な手順は次のとおりです
-
Azure関数アプリからAzureMSIを有効にします
-
MSIのクライアントIDを取得する
az login
az ad sp show --id <the object id of the msi> --query appId --output tsv
-
AzureAD管理者を使用してデータベースに接続します。 (私はPgAdminを使用して接続します)
SET aad_validate_oids_in_tenant = off;
CREATE ROLE <userName> WITH LOGIN PASSWORD '<the appid of the MSI>' IN ROLE azure_ad_user;
-
Postgresサーバーファイアウォールを構成します。 AzureFunctionアプリのアウトバウンドIPアドレスをファイアウォールに追加してください。 Azure関数アプリのアウトバウンドIPアドレスを取得し、Postgresサーバーファイアウォールを構成する方法については、ここ および
こちら -
SSLを有効にする場合は、SSL証明書をダウンロードしてください。 a> リンク 経由
-
関数。 (サンプルの作成には.netコアを使用しています)
a。 sdk
<PackageReference Include="Microsoft.Azure.Services.AppAuthentication" Version="1.5.0" />
<PackageReference Include="Microsoft.NET.Sdk.Functions" Version="3.0.8" />
<PackageReference Include="Npgsql" Version="4.1.3.1" />
b。上記のSSL証明書をプロジェクトに追加します。たとえば、フォルダcert
を作成します 私のプロジェクトで証明書をフォルダに保存します
c。コード
[FunctionName("Http")]
public static async Task<IActionResult> Run(
[HttpTrigger(AuthorizationLevel.Anonymous, "get", "post", Route = null)] HttpRequest req,
ILogger log, ExecutionContext context)
{
var azureServiceTokenProvider = new AzureServiceTokenProvider();
string accessToken = await azureServiceTokenProvider.GetAccessTokenAsync("https://ossrdbms-aad.database.windows.net");
string Host = "test05.postgres.database.azure.com";
string User = "[email protected]";
string Database = "postgres";
string connString =
String.Format(
"Server={0}; User Id={1}; Database={2}; Port={3}; Password={4};SSLMode=Require",
Host,
User,
Database,
5432,
accessToken);
string result = string.Empty;
using (var conn = new NpgsqlConnection(connString))
{
ProvideClientCertificatesCallback provideClientCertificates = clientCerts =>
{
string clientCertPath = context.FunctionAppDirectory + "\\cert\\BaltimoreCyberTrustRoot.crt.pem";
var cert = new X509Certificate2(clientCertPath);
clientCerts.Add(cert);
};
conn.ProvideClientCertificatesCallback += provideClientCertificates;
Console.Out.WriteLine("Opening connection using access token...");
conn.Open();
using (var command = new NpgsqlCommand("SELECT version()", conn))
{
var reader = command.ExecuteReader();
while (reader.Read())
{
Console.WriteLine("\nConnected!\n\nPostgres version: {0}", reader.GetString(0));
result = reader.GetString(0);
}
}
}
return new OkObjectResult(result);
}
詳細については、こちら<を参照してください。 / a>