Compartilhar via


Integrar o Banco de Dados do Azure para PostgreSQL ao Conector de Serviço

Este artigo aborda métodos de autenticação com suporte, clientes e código de exemplo que você pode usar para conectar seus aplicativos ao Banco de Dados do Azure para PostgreSQL usando o Service Connector. Neste artigo, você também encontrará nomes, valores e configuração de variáveis de ambiente padrão obtidos ao criar conexões de serviço.

Serviço de computação com suporte

O Conector de Serviço pode ser usado para conectar os seguintes serviços de computação ao Banco de Dados do Azure para PostgreSQL:

  • Serviço de Aplicativo do Azure
  • Aplicativos de Contêiner do Azure
  • Azure Functions
  • AKS (Serviço de Kubernetes do Azure)
  • Aplicativos Spring do Azure

Tipos de autenticação e tipos de cliente suportados

A tabela a seguir mostra quais combinações de métodos de autenticação e clientes têm suporte para conectar serviços de computação ao Banco de Dados do Azure para PostgreSQL usando o Service Connector. “Sim” indica que a combinação tem suporte e “Não” indica que ela não tem.

Tipo de cliente Identidade gerenciada atribuída pelo sistema Identidade gerenciada atribuída pelo usuário Cadeia de conexão/segredo Entidade de serviço
.NET Sim Sim Sim Sim
Go (pg) Sim Sim Sim Sim
Java (JDBC) Sim Sim Sim Sim
Java – Spring Boot (JDBC) Sim Sim Sim Sim
Node.js (pg) Sim Sim Sim Sim
PHP (nativo) Sim Sim Sim Sim
Python (psycopg2) Sim Sim Sim Sim
Python-Django Sim Sim Sim Sim
Ruby (ruby-pg) Sim Sim Sim Sim
Nenhum Sim Sim Sim Sim

Observação

A identidade gerenciada atribuída pelo sistema, a identidade gerenciada atribuída pelo usuário e a entidade de serviço têm suporte apenas na CLI do Azure.

Nomes de variáveis de ambiente padrão ou propriedades de aplicativo e código de exemplo

Faça referência aos detalhes da conexão e ao código de exemplo nas tabelas a seguir, de acordo com o tipo de autenticação e o tipo de cliente da conexão. Para saber mais sobre as convenções de nomenclatura, confira o artigo Detalhes internos do Conector de Serviço.

Identidade gerenciada atribuída pelo sistema

Nome da variável de ambiente padrão Descrição Valor de exemplo
AZURE_POSTGRESQL_CONNECTIONSTRING Cadeia de conexão do .NET PostgreSQL Server=<PostgreSQL-server-name>.postgres.database.azure.com;Database=<database-name>;Port=5432;Ssl Mode=Require;User Id=<username>;

Código de exemplo

Consulte as etapas e o código abaixo para se conectar ao Banco de Dados do Azure para PostgreSQL usando uma identidade gerenciada atribuída pelo sistema.

Para o .NET, não existe um plug-in ou biblioteca que dê suporte a conexões sem senha. Você pode obter um token de acesso para a identidade gerenciada ou entidade de serviço usando a biblioteca de clientes como Azure.Identity. Em seguida, você pode utilizar o token de acesso como senha para se conectar ao banco de dados. Ao usar o código abaixo, remova a marca de comentário da parte do trecho de código referente ao tipo de autenticação que você quer usar.

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

Em seguida, se você tiver criado tabelas e sequências no servidor flexível PostgreSQL, precisará se conectar como proprietário do banco de dados e conceder permissão a <aad-username> criado pelo Conector do Serviço. O nome de usuário da cadeia de conexão ou da configuração definida pelo Conector de Serviço deve ser semelhante a aad_<connection name>. Se você usar o portal do Azure, selecione o botão expandir ao lado da coluna Service Type e obtenha o valor. Se você usar a CLI do Azure, verifique configurations na saída do comando da CLI.

Em seguida, execute a consulta para conceder permissão

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

O <owner-username> e a <owner-password> são os proprietários da tabela existente que pode conceder permissão a outras pessoas. O <aad-username> é o usuário criado pelo Conector de Serviço. Substitua-os pelo valor real.

Você pode validar o resultado com o comando:

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

Identidade gerenciada atribuída pelo usuário

Nome da variável de ambiente padrão Descrição Valor de exemplo
AZURE_POSTGRESQL_CLIENTID Sua ID de cliente <identity-client-ID>
AZURE_POSTGRESQL_CONNECTIONSTRING Cadeia de conexão do .NET PostgreSQL Server=<PostgreSQL-server-name>.postgres.database.azure.com;Database=<database-name>;Port=5432;Ssl Mode=Require;User Id=<username>;

Código de exemplo

Consulte as etapas e o código abaixo para se conectar ao Banco de Dados do Azure para PostgreSQL usando uma identidade gerenciada atribuída pelo usuário.

Para o .NET, não existe um plug-in ou biblioteca que dê suporte a conexões sem senha. Você pode obter um token de acesso para a identidade gerenciada ou entidade de serviço usando a biblioteca de clientes como Azure.Identity. Em seguida, você pode utilizar o token de acesso como senha para se conectar ao banco de dados. Ao usar o código abaixo, remova a marca de comentário da parte do trecho de código referente ao tipo de autenticação que você quer usar.

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

Em seguida, se você tiver criado tabelas e sequências no servidor flexível PostgreSQL, precisará se conectar como proprietário do banco de dados e conceder permissão a <aad-username> criado pelo Conector do Serviço. O nome de usuário da cadeia de conexão ou da configuração definida pelo Conector de Serviço deve ser semelhante a aad_<connection name>. Se você usar o portal do Azure, selecione o botão expandir ao lado da coluna Service Type e obtenha o valor. Se você usar a CLI do Azure, verifique configurations na saída do comando da CLI.

Em seguida, execute a consulta para conceder permissão

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

O <owner-username> e a <owner-password> são os proprietários da tabela existente que pode conceder permissão a outras pessoas. O <aad-username> é o usuário criado pelo Conector de Serviço. Substitua-os pelo valor real.

Você pode validar o resultado com o comando:

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

Cadeia de conexão

Aviso

A Microsoft recomenda usar o fluxo de autenticação mais seguro disponível. O fluxo de autenticação descrito neste procedimento exige um grau muito alto de confiança no aplicativo e traz riscos que não estão presentes em outros fluxos. Você só deve usar esse fluxo quando outros fluxos mais seguros, como identidades gerenciadas, não forem viáveis.

Nome da variável de ambiente padrão Descrição Valor de exemplo
AZURE_POSTGRESQL_CONNECTIONSTRING Cadeia de conexão do .NET PostgreSQL Server=<PostgreSQL-server-name>.postgres.database.azure.com;Database=<database-name>;Port=5432;Ssl Mode=Require;User Id=<username>;

Código de exemplo

Consulte as etapas e o código abaixo para se conectar ao Banco de Dados do Azure para PostgreSQL usando uma cadeia de conexão.

  1. Instalar dependências seguindo as diretrizes do Npgsql
  2. No código, obtenha a cadeia de conexão do PostgreSQL das variáveis de ambiente adicionadas pelo Conector de Serviço.
    using System;
    using Npgsql;
    
    string connectionString = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CONNECTIONSTRING");
    using (NpgsqlConnection connection = new NpgsqlConnection(connectionString))
    {
        connection.Open();
    }
    

Entidade de serviço

Nome da variável de ambiente padrão Descrição Valor de exemplo
AZURE_POSTGRESQL_CLIENTID Sua ID de cliente <client-ID>
AZURE_POSTGRESQL_CLIENTSECRET O segredo do cliente <client-secret>
AZURE_POSTGRESQL_TENANTID Sua ID de locatário <tenant-ID>
AZURE_POSTGRESQL_CONNECTIONSTRING Cadeia de conexão do .NET PostgreSQL Server=<PostgreSQL-server-name>.postgres.database.azure.com;Database=<database-name>;Port=5432;Ssl Mode=Require;User Id=<username>;

Código de exemplo

Consulte as etapas e o código abaixo para se conectar ao Banco de Dados do Azure para PostgreSQL usando uma entidade de serviço.

Para o .NET, não existe um plug-in ou biblioteca que dê suporte a conexões sem senha. Você pode obter um token de acesso para a identidade gerenciada ou entidade de serviço usando a biblioteca de clientes como Azure.Identity. Em seguida, você pode utilizar o token de acesso como senha para se conectar ao banco de dados. Ao usar o código abaixo, remova a marca de comentário da parte do trecho de código referente ao tipo de autenticação que você quer usar.

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

Em seguida, se você tiver criado tabelas e sequências no servidor flexível PostgreSQL, precisará se conectar como proprietário do banco de dados e conceder permissão a <aad-username> criado pelo Conector do Serviço. O nome de usuário da cadeia de conexão ou da configuração definida pelo Conector de Serviço deve ser semelhante a aad_<connection name>. Se você usar o portal do Azure, selecione o botão expandir ao lado da coluna Service Type e obtenha o valor. Se você usar a CLI do Azure, verifique configurations na saída do comando da CLI.

Em seguida, execute a consulta para conceder permissão

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

O <owner-username> e a <owner-password> são os proprietários da tabela existente que pode conceder permissão a outras pessoas. O <aad-username> é o usuário criado pelo Conector de Serviço. Substitua-os pelo valor real.

Você pode validar o resultado com o comando:

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

Próximas etapas

Siga os tutoriais listados abaixo para saber mais sobre o conector de serviço.