Поделиться через


Интеграция Azure Database для PostgreSQL при помощи Service Connector

В этой статье рассматриваются поддерживаемые методы проверки подлинности, клиенты и пример кода, которые можно использовать для подключения приложений к Базе данных Azure для PostgreSQL с помощью соединителя службы. В этой статье также вы найдете имена переменных среды по умолчанию, значения и конфигурацию, полученные при создании подключений к службе.

Поддерживаемые службы вычислений

Соединитель служб можно использовать для подключения следующих вычислительных служб к Базе данных Azure для PostgreSQL:

  • Служба приложений Azure
  • Приложения контейнеров Azure
  • Функции Azure
  • Служба Azure Kubernetes (AKS)
  • Azure Spring Apps

Поддерживаемые типы проверки подлинности и типы клиентов

В таблице ниже показано, какие сочетания методов проверки подлинности и клиентов поддерживаются для подключения вычислительных служб к Базе данных Azure для PostgreSQL с помощью соединителя служб. Значение "Да" указывает, что сочетание поддерживается, а значение "Нет" указывает, что оно не поддерживается.

Тип клиента Назначаемый системой управляемый идентификатор Управляемая идентификация, назначаемая пользователем Секретный ключ/строка подключения Принципал службы
.СЕТЬ Да Да Да Да
Иди (стр.) Да Да Да Да
Java (JDBC) Да Да Да Да
Java — Spring Boot (JDBC) Да Да Да Да
Node.js (pg) Да Да Да Да
PHP (нативный) Да Да Да Да
Python (psycopg2) Да Да Да Да
Python-Django Да Да Да Да
Ruby (ruby-pg) Да Да Да Да
Отсутствует Да Да Да Да

Замечание

Назначаемое системой управляемое удостоверение, назначаемое пользователем управляемое удостоверение и принципал службы поддерживаются только в Azure CLI.

Имена переменных среды по умолчанию или свойства приложения и пример кода

Ссылайтесь на сведения о подключении и пример кода в следующих таблицах в соответствии с типом проверки подлинности подключения и типом клиента. Для получения дополнительной информации о соглашениях об именовании ознакомьтесь со статьей внутренний механизм соединителя служб.

Назначаемый системой управляемый идентификатор

Имя переменной среды по умолчанию Описание Пример значения
AZURE_POSTGRESQL_CONNECTIONSTRING Строка подключения PostgreSQL для .NET Server=<PostgreSQL-server-name>.postgres.database.azure.com;Database=<database-name>;Port=5432;Ssl Mode=Require;User Id=<username>;

Пример кода

Ознакомьтесь с инструкциями и кодом ниже, чтобы подключиться к базе данных Azure для PostgreSQL с помощью управляемого удостоверения, назначаемого системой.

Для .NET нет плагина или библиотеки для поддержки подключений без пароля. Токен доступа для управляемой идентичности или сервисного принципала можно получить, например, с помощью клиентской библиотеки Azure.Identity. Затем вы можете использовать маркер доступа в качестве пароля для подключения к базе данных. При использовании приведенного ниже кода удалите комментарий с той части фрагмента, которая соответствует типу проверки подлинности, который вы хотите использовать.

using Azure.Identity;
using Azure.Core;
using Npgsql;

// Uncomment the following lines corresponding to the authentication type you want to use.
// For system-assigned identity.
// var sqlServerTokenProvider = new DefaultAzureCredential();

// For user-assigned identity.
// var sqlServerTokenProvider = new DefaultAzureCredential(
//     new DefaultAzureCredentialOptions
//     {
//         ManagedIdentityClientId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTID");
//     }
// );

// For service principal.
// var tenantId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_TENANTID");
// var clientId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTID");
// var clientSecret = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTSECRET");
// var sqlServerTokenProvider = new ClientSecretCredential(tenantId, clientId, clientSecret);

// 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();
}

Затем, если вы создали таблицы и последовательности на гибком сервере PostgreSQL до использования соединителя служб, необходимо подключиться под учетной записью владельца и предоставить разрешения объекту <aad-username>, созданному соединителем службы. Имя пользователя из строка подключения или конфигурации, заданное соединителем службы, должно выглядеть следующим образомaad_<connection name>. Если вы используете портал Azure, нажмите кнопку развертывания рядом с столбцом Service Type и получите значение. Если вы используете Azure CLI, проверьте configurations в выводе команды CLI.

Затем выполните запрос, чтобы предоставить разрешение

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>\";"

<owner-username> и <owner-password>, являющиеся владельцами существующих таблиц, могут предоставлять разрешения другим пользователям. <aad-username> — это пользователь, созданный с помощью сервисного соединителя. Замените их фактическим значением.

Проверьте результат с помощью команды:

az postgres flexible-server execute -n <postgres-name> -u <owner-username> -p "<owner-password>" -d <database-name> --querytext "SELECT distinct(table_name) FROM information_schema.table_privileges WHERE grantee='<aad-username>' AND table_schema='public';" --output table

Управляемая идентификация, назначаемая пользователем

Имя переменной среды по умолчанию Описание Пример значения
AZURE_POSTGRESQL_CLIENTID Идентификатор клиента <identity-client-ID>
AZURE_POSTGRESQL_CONNECTIONSTRING Строка подключения PostgreSQL для .NET Server=<PostgreSQL-server-name>.postgres.database.azure.com;Database=<database-name>;Port=5432;Ssl Mode=Require;User Id=<username>;

Пример кода

Ознакомьтесь с инструкциями и кодом ниже, чтобы подключиться к Базе данных Azure для PostgreSQL с помощью управляемого удостоверения, назначаемого пользователем.

Для .NET нет плагина или библиотеки для поддержки подключений без пароля. Токен доступа для управляемой идентичности или сервисного принципала можно получить, например, с помощью клиентской библиотеки Azure.Identity. Затем вы можете использовать маркер доступа в качестве пароля для подключения к базе данных. При использовании приведенного ниже кода удалите комментарий с той части фрагмента, которая соответствует типу проверки подлинности, который вы хотите использовать.

using Azure.Identity;
using Azure.Core;
using Npgsql;

// Uncomment the following lines corresponding to the authentication type you want to use.
// For system-assigned identity.
// var sqlServerTokenProvider = new DefaultAzureCredential();

// For user-assigned identity.
// var sqlServerTokenProvider = new DefaultAzureCredential(
//     new DefaultAzureCredentialOptions
//     {
//         ManagedIdentityClientId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTID");
//     }
// );

// For service principal.
// var tenantId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_TENANTID");
// var clientId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTID");
// var clientSecret = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTSECRET");
// var sqlServerTokenProvider = new ClientSecretCredential(tenantId, clientId, clientSecret);

// 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();
}

Затем, если вы создали таблицы и последовательности на гибком сервере PostgreSQL до использования соединителя служб, необходимо подключиться под учетной записью владельца и предоставить разрешения объекту <aad-username>, созданному соединителем службы. Имя пользователя из строка подключения или конфигурации, заданное соединителем службы, должно выглядеть следующим образомaad_<connection name>. Если вы используете портал Azure, нажмите кнопку развертывания рядом с столбцом Service Type и получите значение. Если вы используете Azure CLI, проверьте configurations в выводе команды CLI.

Затем выполните запрос, чтобы предоставить разрешение

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>\";"

<owner-username> и <owner-password>, являющиеся владельцами существующих таблиц, могут предоставлять разрешения другим пользователям. <aad-username> — это пользователь, созданный с помощью сервисного соединителя. Замените их фактическим значением.

Проверьте результат с помощью команды:

az postgres flexible-server execute -n <postgres-name> -u <owner-username> -p "<owner-password>" -d <database-name> --querytext "SELECT distinct(table_name) FROM information_schema.table_privileges WHERE grantee='<aad-username>' AND table_schema='public';" --output table

строка подключения

Предупреждение

Корпорация Майкрософт рекомендует использовать самый безопасный поток проверки подлинности. Поток проверки подлинности, описанный в этой процедуре, требует очень высокого уровня доверия к приложению и несет риски, которые отсутствуют в других потоках. Этот поток следует использовать только в том случае, если другие более безопасные потоки, такие как идентификации с управлением, не являются приемлемыми.

Имя переменной среды по умолчанию Описание Пример значения
AZURE_POSTGRESQL_CONNECTIONSTRING Строка подключения PostgreSQL для .NET Server=<PostgreSQL-server-name>.postgres.database.azure.com;Database=<database-name>;Port=5432;Ssl Mode=Require;User Id=<username>;

Пример кода

Чтобы подключиться к Базе данных Azure для PostgreSQL с помощью строки подключения, см. приведенные ниже действия и код.

  1. Установите зависимости в соответствии с руководством Npgsql
  2. В коде получите строку подключения к PostgreSQL из переменных окружения, добавленных Service Connector.
    using System;
    using Npgsql;
    
    string connectionString = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CONNECTIONSTRING");
    using (NpgsqlConnection connection = new NpgsqlConnection(connectionString))
    {
        connection.Open();
    }
    

Принципал службы

Имя переменной среды по умолчанию Описание Пример значения
AZURE_POSTGRESQL_CLIENTID Идентификатор клиента <client-ID>
AZURE_POSTGRESQL_CLIENTSECRET Секрет клиента <client-secret>
AZURE_POSTGRESQL_TENANTID Идентификатор клиента <tenant-ID>
AZURE_POSTGRESQL_CONNECTIONSTRING Строка подключения PostgreSQL для .NET Server=<PostgreSQL-server-name>.postgres.database.azure.com;Database=<database-name>;Port=5432;Ssl Mode=Require;User Id=<username>;

Пример кода

Ознакомьтесь с инструкциями и кодом ниже, чтобы подключиться к базе данных Azure для PostgreSQL с помощью служебного принципала.

Для .NET нет плагина или библиотеки для поддержки подключений без пароля. Токен доступа для управляемой идентичности или сервисного принципала можно получить, например, с помощью клиентской библиотеки Azure.Identity. Затем вы можете использовать маркер доступа в качестве пароля для подключения к базе данных. При использовании приведенного ниже кода удалите комментарий с той части фрагмента, которая соответствует типу проверки подлинности, который вы хотите использовать.

using Azure.Identity;
using Azure.Core;
using Npgsql;

// Uncomment the following lines corresponding to the authentication type you want to use.
// For system-assigned identity.
// var sqlServerTokenProvider = new DefaultAzureCredential();

// For user-assigned identity.
// var sqlServerTokenProvider = new DefaultAzureCredential(
//     new DefaultAzureCredentialOptions
//     {
//         ManagedIdentityClientId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTID");
//     }
// );

// For service principal.
// var tenantId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_TENANTID");
// var clientId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTID");
// var clientSecret = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTSECRET");
// var sqlServerTokenProvider = new ClientSecretCredential(tenantId, clientId, clientSecret);

// 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();
}

Затем, если вы создали таблицы и последовательности на гибком сервере PostgreSQL до использования соединителя служб, необходимо подключиться под учетной записью владельца и предоставить разрешения объекту <aad-username>, созданному соединителем службы. Имя пользователя из строка подключения или конфигурации, заданное соединителем службы, должно выглядеть следующим образомaad_<connection name>. Если вы используете портал Azure, нажмите кнопку развертывания рядом с столбцом Service Type и получите значение. Если вы используете Azure CLI, проверьте configurations в выводе команды CLI.

Затем выполните запрос, чтобы предоставить разрешение

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>\";"

<owner-username> и <owner-password>, являющиеся владельцами существующих таблиц, могут предоставлять разрешения другим пользователям. <aad-username> — это пользователь, созданный с помощью сервисного соединителя. Замените их фактическим значением.

Проверьте результат с помощью команды:

az postgres flexible-server execute -n <postgres-name> -u <owner-username> -p "<owner-password>" -d <database-name> --querytext "SELECT distinct(table_name) FROM information_schema.table_privileges WHERE grantee='<aad-username>' AND table_schema='public';" --output table

Дальнейшие шаги

Чтобы узнать больше о Service Connector, ознакомьтесь с учебными материалами ниже.