Integrar o Banco de Dados do Azure para PostgreSQL ao conector de serviço
Artigo
Esta página mostra os métodos de autenticação e clientes com suporte e mostra um código de exemplo que você pode usar para conectar o Banco de Dados do Azure para PostgreSQL a outros serviços de nuvem usando o Conector de Serviço. Você ainda poderá se conectar ao Banco de Dados do Azure para PostgreSQL em outras linguagens de programação sem usar o Conector de Serviço. Esta página também mostra nomes e valores da variável de ambiente padrão (ou configuração do Spring Boot) que você obtém ao criar a conexão 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)
Azure Spring Apps
Tipos de autenticação e tipos de cliente com suporte
A tabela abaixo mostra quais combinações de métodos de autenticação e clientes têm suporte para conectar seu serviço de computação ao Banco de Dados do Azure para PostgreSQL usando o Conector de Serviço. “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
Yes
Go (pg)
Sim
Sim
Sim
Yes
Java (JDBC)
Sim
Sim
Sim
Yes
Java – Spring Boot (JDBC)
Sim
Sim
Sim
Yes
Node.js (pg)
Sim
Sim
Sim
Yes
PHP (nativo)
Sim
Sim
Sim
Yes
Python (psycopg2)
Sim
Sim
Sim
Yes
Python-Django
Sim
Sim
Sim
Yes
Ruby (ruby-pg)
Sim
Sim
Sim
Yes
Nenhum
Sim
Sim
Sim
Yes
Essa tabela indica que todas as combinações de tipos de clientes e métodos de autenticação na tabela têm suporte. Todos os tipos de clientes podem usar qualquer um dos métodos de autenticação para se conectar ao Banco de Dados do Azure para PostgreSQL usando o Conector de Serviço.
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
Consulte os detalhes da conexão e o código de exemplo nas tabelas a seguir, de acordo com o tipo de autenticação e o tipo de cliente da sua conexão, para conectar os serviços de computação ao Banco de Dados do Azure para PostgreSQL. Para saber mais sobre as convenções de nomenclatura, confira o artigo Detalhes internos no conector de serviço.
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 utilizando 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, descompacte a parte do snippet de código para o tipo de autenticação que você deseja 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();
}
Adicione as dependências a seguir no seu arquivo pom.xml:
Para um aplicativo Spring, se você criar uma conexão com a opção --client-type springboot, o Conector de Serviço definirá as propriedades spring.datasource.azure.passwordless-enabled, spring.datasource.url e spring.datasource.username para os Aplicativos Spring do Azure.
pip install azure-identity
pip install psycopg2-binary
pip freeze > requirements.txt # Save the dependencies to a file
Obtenha o token de acesso usando a biblioteca azure-identity e use o token como senha. Obtenha informações de conexão das variáveis de ambiente adicionadas pelo Conector de Serviço. Ao usar o código abaixo, descompacte a parte do snippet de código para o tipo de autenticação que você deseja usar.
from azure.identity import DefaultAzureCredential
import psycopg2
# Uncomment the following lines corresponding to the authentication type you want to use.
# 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)
# For service principal.
# tenant_id = os.getenv('AZURE_POSTGRESQL_TENANTID')
# client_id = os.getenv('AZURE_POSTGRESQL_CLIENTID')
# client_secret = os.getenv('AZURE_POSTGRESQL_CLIENTSECRET')
# cred = ClientSecretCredential(tenant_id=tenant_id, client_id=client_id, client_secret=client_secret)
# 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)
Instale as dependências.
pip install azure-identity
Obtenha o token de acesso usando a biblioteca azure-identity usando variáveis de ambiente adicionadas pelo conector de serviço. Ao usar o código abaixo, descompacte a parte do snippet de código para o tipo de autenticação que você deseja usar.
from azure.identity import DefaultAzureCredential
import psycopg2
# Uncomment the following lines corresponding to the authentication type you want to use.
# For system-assigned identity.
# credential = DefaultAzureCredential()
# For user-assigned identity.
# managed_identity_client_id = os.getenv('AZURE_POSTGRESQL_CLIENTID')
# cred = ManagedIdentityCredential(client_id=managed_identity_client_id)
# For service principal.
# tenant_id = os.getenv('AZURE_POSTGRESQL_TENANTID')
# client_id = os.getenv('AZURE_POSTGRESQL_CLIENTID')
# client_secret = os.getenv('AZURE_POSTGRESQL_CLIENTSECRET')
# cred = ClientSecretCredential(tenant_id=tenant_id, client_id=client_id, client_secret=client_secret)
# Acquire the access token.
accessToken = cred.get_token('https://ossrdbms-aad.database.windows.net/.default')
No arquivo de configuração, obtenha as informações do banco de dados PostgreSQL do Azure das variáveis de ambiente adicionadas pelo serviço Conector de Serviço. Use accessToken adquirido na etapa anterior para acessar o banco de dados.
# In your setting file, eg. settings.py
host = os.getenv('AZURE_POSTGRESQL_HOST')
user = os.getenv('AZURE_POSTGRESQL_USER')
password = accessToken.token # this is accessToken acquired from above step.
database = os.getenv('AZURE_POSTGRESQL_NAME')
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': database,
'USER': user,
'PASSWORD': password,
'HOST': host,
'PORT': '5432', # Port is 5432 by default
'OPTIONS': {'sslmode': 'require'},
}
}
Instale as dependências.
go get github.com/lib/pq
go get "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
go get "github.com/Azure/azure-sdk-for-go/sdk/azcore"
No código, obtenha o token de acesso usando azidentity e use-o como senha para se conectar ao PostgreSQL do Azure, juntamente com as informações de conexão fornecidas pelo conector de serviço. Ao usar o código abaixo, descompacte a parte do snippet de código para o tipo de autenticação que você deseja usar.
import (
"database/sql"
"fmt"
"os"
"context"
"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy"
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
_ "github.com/lib/pq"
)
// Uncomment the following lines corresponding to the authentication type you want to use.
// For system-assigned identity.
// cred, err := azidentity.NewDefaultAzureCredential(nil)
// For user-assigned identity.
// clientid := os.Getenv("AZURE_POSTGRESQL_CLIENTID")
// azidentity.ManagedIdentityCredentialOptions.ID := clientid
// options := &azidentity.ManagedIdentityCredentialOptions{ID: clientid}
// cred, err := azidentity.NewManagedIdentityCredential(options)
// For service principal.
// clientid := os.Getenv("AZURE_POSTGRESQL_CLIENTID")
// tenantid := os.Getenv("AZURE_POSTGRESQL_TENANTID")
// clientsecret := os.Getenv("AZURE_POSTGRESQL_CLIENTSECRET")
// cred, err := azidentity.NewClientSecretCredential(tenantid, clientid, clientsecret, &azidentity.ClientSecretCredentialOptions{})
if err != nil {
// error handling
}
// Acquire the access token
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
token, err := cred.GetToken(ctx, policy.TokenRequestOptions{
Scopes: []string("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.
connectionString := os.Getenv("AZURE_POSTGRESQL_CONNECTIONSTRING") + " password=" + token.Token
conn, err := sql.Open("postgres", connectionString)
if err != nil {
panic(err)
}
conn.Close()
No código, obtenha o token de acesso usando @azure/identity e informações de conexão PostgreSQL de variáveis de ambiente adicionadas pelo serviço do conector de serviço. Conectar-se a eles para estabelecer a conexão. Ao usar o código abaixo, descompacte a parte do snippet de código para o tipo de autenticação que você deseja usar.
import { DefaultAzureCredential, ClientSecretCredential } from "@azure/identity";
const { Client } = require('pg');
// Uncomment the following lines corresponding to the authentication type you want to use.
// 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
// });
// For service principal.
// const tenantId = process.env.AZURE_POSTGRESQL_TENANTID;
// const clientId = process.env.AZURE_POSTGRESQL_CLIENTID;
// const clientSecret = process.env.AZURE_POSTGRESQL_CLIENTSECRET;
// 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();
})();
Para o PHP, não existe um plug-in ou uma biblioteca para conexões sem senha. Você pode obter um token de acesso para a identidade gerenciada ou a entidade de serviço e usá-lo como senha para se conectar ao banco de dados. O token de acesso pode ser adquirido utilizando a API REST do Azure.
No código, obtenha o token de acesso usando a API REST com sua biblioteca favorita.
Para identidade atribuída pelo usuário e identidade atribuída pelo sistema, o Serviço de Aplicativo e os Aplicativos de Contêiner fornecem um ponto de extremidade REST acessível internamente para recuperar tokens para identidades gerenciadas, definindo duas variáveis de ambiente: IDENTITY_ENDPOINT e IDENTITY_HEADER. Para obter mais informações, consulte a referência do ponto de extremidade REST.
Obtenha o token de acesso fazendo uma solicitação HTTP GET para o ponto de extremidade de identidade e utilize https://ossrdbms-aad.database.windows.net como resource na consulta. Para a identidade atribuída pelo usuário, inclua também na consulta a ID do cliente das variáveis de ambiente adicionadas pelo Conector de Serviço.
Para entidades de serviço, consulte a solicitação de token de acesso de serviço para o serviço do Microsoft Azure AD para ver os detalhes de como adquirir o token de acesso. Faça a solicitação POST no escopo de https://ossrdbms-aad.database.windows.net/.default e com a ID de Locatário, a ID de Cliente e o segredo do cliente da entidade de serviço das variáveis de ambiente adicionadas pelo Conector de Serviço.
Combine o token de acesso e a cadeia de conexão PostgreSQL das variáveis de ambiente adicionadas pelo serviço Conector de Serviço para estabelecer a conexão.
Para o Ruby, não existe um plug-in ou uma biblioteca para conexões sem senha. Você pode obter um token de acesso para a identidade gerenciada ou a entidade de serviço e usá-lo como senha para se conectar ao banco de dados. O token de acesso pode ser adquirido utilizando a API REST do Azure.
Instale as dependências.
gem install pg
No código, obtenha o token de acesso usando a API REST e as informações de conexão do PostgreSQL de variáveis de ambiente adicionadas pelo serviço do conector de serviço. Conectar-se a eles para estabelecer a conexão. Ao usar o código abaixo, descompacte a parte do snippet de código para o tipo de autenticação que você deseja usar.
O serviço de aplicativo e os Aplicativos de contêiner fornecem um ponto de extremidade REST acessível internamente para recuperar tokens para identidades gerenciadas. Para obter mais informações, consulte a referência do ponto de extremidade REST.
require 'pg'
require 'dotenv/load'
require 'net/http'
require 'json'
# Uncomment the following lines corresponding to the authentication type you want to use.
# For system-assigned identity.
# uri = URI(ENV['IDENTITY_ENDPOINT'] + '?resource=https://ossrdbms-aad.database.windows.net&api-version=2019-08-01')
# res = Net::HTTP.get_response(uri, {'X-IDENTITY-HEADER' => ENV['IDENTITY_HEADER'], 'Metadata' => 'true'})
# For user-assigned identity.
# uri = URI(ENV[IDENTITY_ENDPOINT] + '?resource=https://ossrdbms-aad.database.windows.net&api-version=2019-08-01&client-id=' + ENV['AZURE_POSTGRESQL_CLIENTID'])
# res = Net::HTTP.get_response(uri, {'X-IDENTITY-HEADER' => ENV['IDENTITY_HEADER'], 'Metadata' => 'true'})
# For service principal
# uri = URI('https://login.microsoftonline.com/' + ENV['AZURE_POSTGRESQL_TENANTID'] + '/oauth2/v2.0/token')
# params = {
# :grant_type => 'client_credentials',
# :client_id: => ENV['AZURE_POSTGRESQL_CLIENTID'],
# :client_secret => ENV['AZURE_POSTGRESQL_CLIENTSECRET'],
# :scope => 'https://ossrdbms-aad.database.windows.net/.default'
# }
# req = Net::HTTP::POST.new(uri)
# req.set_form_data(params)
# req['Content-Type'] = 'application/x-www-form-urlencoded'
# res = Net::HTTP.start(uri.hostname, uri.port, :use_ssl => true) do |http|
# http.request(req)
parsed = JSON.parse(res.body)
access_token = parsed["access_token"]
# Use the token and the connection string from the environment variables added by Service Connector to establish the connection.
conn = PG::Connection.new(
connection_string: ENV['AZURE_POSTGRESQL_CONNECTIONSTRING'] + " password=" + access_token,
)
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
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 utilizando 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, descompacte a parte do snippet de código para o tipo de autenticação que você deseja 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();
}
Adicione as dependências a seguir no seu arquivo pom.xml:
Para um aplicativo Spring, se você criar uma conexão com a opção --client-type springboot, o Conector de Serviço definirá as propriedades spring.datasource.azure.passwordless-enabled, spring.datasource.url e spring.datasource.username para os Aplicativos Spring do Azure.
pip install azure-identity
pip install psycopg2-binary
pip freeze > requirements.txt # Save the dependencies to a file
Obtenha o token de acesso usando a biblioteca azure-identity e use o token como senha. Obtenha informações de conexão das variáveis de ambiente adicionadas pelo Conector de Serviço. Ao usar o código abaixo, descompacte a parte do snippet de código para o tipo de autenticação que você deseja usar.
from azure.identity import DefaultAzureCredential
import psycopg2
# Uncomment the following lines corresponding to the authentication type you want to use.
# 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)
# For service principal.
# tenant_id = os.getenv('AZURE_POSTGRESQL_TENANTID')
# client_id = os.getenv('AZURE_POSTGRESQL_CLIENTID')
# client_secret = os.getenv('AZURE_POSTGRESQL_CLIENTSECRET')
# cred = ClientSecretCredential(tenant_id=tenant_id, client_id=client_id, client_secret=client_secret)
# 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)
Instale as dependências.
pip install azure-identity
Obtenha o token de acesso usando a biblioteca azure-identity usando variáveis de ambiente adicionadas pelo conector de serviço. Ao usar o código abaixo, descompacte a parte do snippet de código para o tipo de autenticação que você deseja usar.
from azure.identity import DefaultAzureCredential
import psycopg2
# Uncomment the following lines corresponding to the authentication type you want to use.
# For system-assigned identity.
# credential = DefaultAzureCredential()
# For user-assigned identity.
# managed_identity_client_id = os.getenv('AZURE_POSTGRESQL_CLIENTID')
# cred = ManagedIdentityCredential(client_id=managed_identity_client_id)
# For service principal.
# tenant_id = os.getenv('AZURE_POSTGRESQL_TENANTID')
# client_id = os.getenv('AZURE_POSTGRESQL_CLIENTID')
# client_secret = os.getenv('AZURE_POSTGRESQL_CLIENTSECRET')
# cred = ClientSecretCredential(tenant_id=tenant_id, client_id=client_id, client_secret=client_secret)
# Acquire the access token.
accessToken = cred.get_token('https://ossrdbms-aad.database.windows.net/.default')
No arquivo de configuração, obtenha as informações do banco de dados PostgreSQL do Azure das variáveis de ambiente adicionadas pelo serviço Conector de Serviço. Use accessToken adquirido na etapa anterior para acessar o banco de dados.
# In your setting file, eg. settings.py
host = os.getenv('AZURE_POSTGRESQL_HOST')
user = os.getenv('AZURE_POSTGRESQL_USER')
password = accessToken.token # this is accessToken acquired from above step.
database = os.getenv('AZURE_POSTGRESQL_NAME')
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': database,
'USER': user,
'PASSWORD': password,
'HOST': host,
'PORT': '5432', # Port is 5432 by default
'OPTIONS': {'sslmode': 'require'},
}
}
Instale as dependências.
go get github.com/lib/pq
go get "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
go get "github.com/Azure/azure-sdk-for-go/sdk/azcore"
No código, obtenha o token de acesso usando azidentity e use-o como senha para se conectar ao PostgreSQL do Azure, juntamente com as informações de conexão fornecidas pelo conector de serviço. Ao usar o código abaixo, descompacte a parte do snippet de código para o tipo de autenticação que você deseja usar.
import (
"database/sql"
"fmt"
"os"
"context"
"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy"
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
_ "github.com/lib/pq"
)
// Uncomment the following lines corresponding to the authentication type you want to use.
// For system-assigned identity.
// cred, err := azidentity.NewDefaultAzureCredential(nil)
// For user-assigned identity.
// clientid := os.Getenv("AZURE_POSTGRESQL_CLIENTID")
// azidentity.ManagedIdentityCredentialOptions.ID := clientid
// options := &azidentity.ManagedIdentityCredentialOptions{ID: clientid}
// cred, err := azidentity.NewManagedIdentityCredential(options)
// For service principal.
// clientid := os.Getenv("AZURE_POSTGRESQL_CLIENTID")
// tenantid := os.Getenv("AZURE_POSTGRESQL_TENANTID")
// clientsecret := os.Getenv("AZURE_POSTGRESQL_CLIENTSECRET")
// cred, err := azidentity.NewClientSecretCredential(tenantid, clientid, clientsecret, &azidentity.ClientSecretCredentialOptions{})
if err != nil {
// error handling
}
// Acquire the access token
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
token, err := cred.GetToken(ctx, policy.TokenRequestOptions{
Scopes: []string("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.
connectionString := os.Getenv("AZURE_POSTGRESQL_CONNECTIONSTRING") + " password=" + token.Token
conn, err := sql.Open("postgres", connectionString)
if err != nil {
panic(err)
}
conn.Close()
No código, obtenha o token de acesso usando @azure/identity e informações de conexão PostgreSQL de variáveis de ambiente adicionadas pelo serviço do conector de serviço. Conectar-se a eles para estabelecer a conexão. Ao usar o código abaixo, descompacte a parte do snippet de código para o tipo de autenticação que você deseja usar.
import { DefaultAzureCredential, ClientSecretCredential } from "@azure/identity";
const { Client } = require('pg');
// Uncomment the following lines corresponding to the authentication type you want to use.
// 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
// });
// For service principal.
// const tenantId = process.env.AZURE_POSTGRESQL_TENANTID;
// const clientId = process.env.AZURE_POSTGRESQL_CLIENTID;
// const clientSecret = process.env.AZURE_POSTGRESQL_CLIENTSECRET;
// 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();
})();
Para o PHP, não existe um plug-in ou uma biblioteca para conexões sem senha. Você pode obter um token de acesso para a identidade gerenciada ou a entidade de serviço e usá-lo como senha para se conectar ao banco de dados. O token de acesso pode ser adquirido utilizando a API REST do Azure.
No código, obtenha o token de acesso usando a API REST com sua biblioteca favorita.
Para identidade atribuída pelo usuário e identidade atribuída pelo sistema, o Serviço de Aplicativo e os Aplicativos de Contêiner fornecem um ponto de extremidade REST acessível internamente para recuperar tokens para identidades gerenciadas, definindo duas variáveis de ambiente: IDENTITY_ENDPOINT e IDENTITY_HEADER. Para obter mais informações, consulte a referência do ponto de extremidade REST.
Obtenha o token de acesso fazendo uma solicitação HTTP GET para o ponto de extremidade de identidade e utilize https://ossrdbms-aad.database.windows.net como resource na consulta. Para a identidade atribuída pelo usuário, inclua também na consulta a ID do cliente das variáveis de ambiente adicionadas pelo Conector de Serviço.
Para entidades de serviço, consulte a solicitação de token de acesso de serviço para o serviço do Microsoft Azure AD para ver os detalhes de como adquirir o token de acesso. Faça a solicitação POST no escopo de https://ossrdbms-aad.database.windows.net/.default e com a ID de Locatário, a ID de Cliente e o segredo do cliente da entidade de serviço das variáveis de ambiente adicionadas pelo Conector de Serviço.
Combine o token de acesso e a cadeia de conexão PostgreSQL das variáveis de ambiente adicionadas pelo serviço Conector de Serviço para estabelecer a conexão.
Para o Ruby, não existe um plug-in ou uma biblioteca para conexões sem senha. Você pode obter um token de acesso para a identidade gerenciada ou a entidade de serviço e usá-lo como senha para se conectar ao banco de dados. O token de acesso pode ser adquirido utilizando a API REST do Azure.
Instale as dependências.
gem install pg
No código, obtenha o token de acesso usando a API REST e as informações de conexão do PostgreSQL de variáveis de ambiente adicionadas pelo serviço do conector de serviço. Conectar-se a eles para estabelecer a conexão. Ao usar o código abaixo, descompacte a parte do snippet de código para o tipo de autenticação que você deseja usar.
O serviço de aplicativo e os Aplicativos de contêiner fornecem um ponto de extremidade REST acessível internamente para recuperar tokens para identidades gerenciadas. Para obter mais informações, consulte a referência do ponto de extremidade REST.
require 'pg'
require 'dotenv/load'
require 'net/http'
require 'json'
# Uncomment the following lines corresponding to the authentication type you want to use.
# For system-assigned identity.
# uri = URI(ENV['IDENTITY_ENDPOINT'] + '?resource=https://ossrdbms-aad.database.windows.net&api-version=2019-08-01')
# res = Net::HTTP.get_response(uri, {'X-IDENTITY-HEADER' => ENV['IDENTITY_HEADER'], 'Metadata' => 'true'})
# For user-assigned identity.
# uri = URI(ENV[IDENTITY_ENDPOINT] + '?resource=https://ossrdbms-aad.database.windows.net&api-version=2019-08-01&client-id=' + ENV['AZURE_POSTGRESQL_CLIENTID'])
# res = Net::HTTP.get_response(uri, {'X-IDENTITY-HEADER' => ENV['IDENTITY_HEADER'], 'Metadata' => 'true'})
# For service principal
# uri = URI('https://login.microsoftonline.com/' + ENV['AZURE_POSTGRESQL_TENANTID'] + '/oauth2/v2.0/token')
# params = {
# :grant_type => 'client_credentials',
# :client_id: => ENV['AZURE_POSTGRESQL_CLIENTID'],
# :client_secret => ENV['AZURE_POSTGRESQL_CLIENTSECRET'],
# :scope => 'https://ossrdbms-aad.database.windows.net/.default'
# }
# req = Net::HTTP::POST.new(uri)
# req.set_form_data(params)
# req['Content-Type'] = 'application/x-www-form-urlencoded'
# res = Net::HTTP.start(uri.hostname, uri.port, :use_ssl => true) do |http|
# http.request(req)
parsed = JSON.parse(res.body)
access_token = parsed["access_token"]
# Use the token and the connection string from the environment variables added by Service Connector to establish the connection.
conn = PG::Connection.new(
connection_string: ENV['AZURE_POSTGRESQL_CONNECTIONSTRING'] + " password=" + access_token,
)
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.
No código, obtenha a cadeia de conexão PostgreSQL das variáveis de ambiente adicionadas pelo serviço Conector de Serviço. Para definir as configurações TSL para o servidor PostgreSQL, consulte estas etapas.
using System;
using Npgsql;
string connectionString = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CONNECTIONSTRING");
using (NpgsqlConnection connection = new NpgsqlConnection(connectionString))
{
connection.Open();
}
No código, obtenha a cadeia de conexão PostgreSQL das variáveis de ambiente adicionadas pelo serviço Conector de Serviço. Para definir as configurações TSL para o servidor PostgreSQL, consulte estas etapas.
Instale o módulo Spring Cloud Azure Starter JDBC PostgreSQL adicionando as seguintes dependências ao seu arquivo pom.xml. Encontre a versão do Spring Cloud Azure aqui.
No código, obtenha as informações de conexão do PostgreSQL das variáveis de ambiente adicionadas pelo serviço Conector de Serviço. Para definir as configurações TSL para o servidor PostgreSQL, consulte estas etapas.
No arquivo de configuração, obtenha as informações do banco de dados PostgreSQL das variáveis de ambiente adicionadas pelo serviço Conector de Serviço. Para definir as configurações TSL para o servidor PostgreSQL, consulte estas etapas.
# in your setting file, eg. settings.py
host = os.getenv('AZURE_POSTGRESQL_HOST')
user = os.getenv('AZURE_POSTGRESQL_USER')
password = os.getenv('AZURE_POSTGRESQL_PASSWORD')
database = os.getenv('AZURE_POSTGRESQL_NAME')
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': database,
'USER': user,
'PASSWORD': password,
'HOST': host,
'PORT': '5432', # Port is 5432 by default
'OPTIONS': {'sslmode': 'require'},
}
}
Instale as dependências.
go get github.com/lib/pq
No código, obtenha a cadeia de conexão PostgreSQL das variáveis de ambiente adicionadas pelo serviço Conector de Serviço. Para definir as configurações TSL para o servidor PostgreSQL, consulte estas etapas.
No código, obtenha as informações de conexão do PostgreSQL das variáveis de ambiente adicionadas pelo serviço Conector de Serviço. Para definir as configurações TSL para o servidor PostgreSQL, consulte estas etapas.
No código, obtenha as informações de conexão do PostgreSQL das variáveis de ambiente adicionadas pelo serviço Conector de Serviço. Para definir as configurações TSL para o servidor PostgreSQL, consulte estas etapas.
No código, obtenha as informações de conexão do PostgreSQL das variáveis de ambiente adicionadas pelo serviço Conector de Serviço. Para definir as configurações TSL para o servidor PostgreSQL, consulte estas etapas.
require 'pg'
require 'dotenv/load'
begin
conn = PG::Connection.new(
connection_string: ENV['AZURE_POSTGRESQL_CONNECTIONSTRING'],
)
rescue PG::Error => e
puts e.message
ensure
connection.close if connection
end
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 utilizando 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, descompacte a parte do snippet de código para o tipo de autenticação que você deseja 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();
}
Adicione as dependências a seguir no seu arquivo pom.xml:
Para um aplicativo Spring, se você criar uma conexão com a opção --client-type springboot, o Conector de Serviço definirá as propriedades spring.datasource.azure.passwordless-enabled, spring.datasource.url e spring.datasource.username para os Aplicativos Spring do Azure.
pip install azure-identity
pip install psycopg2-binary
pip freeze > requirements.txt # Save the dependencies to a file
Obtenha o token de acesso usando a biblioteca azure-identity e use o token como senha. Obtenha informações de conexão das variáveis de ambiente adicionadas pelo Conector de Serviço. Ao usar o código abaixo, descompacte a parte do snippet de código para o tipo de autenticação que você deseja usar.
from azure.identity import DefaultAzureCredential
import psycopg2
# Uncomment the following lines corresponding to the authentication type you want to use.
# 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)
# For service principal.
# tenant_id = os.getenv('AZURE_POSTGRESQL_TENANTID')
# client_id = os.getenv('AZURE_POSTGRESQL_CLIENTID')
# client_secret = os.getenv('AZURE_POSTGRESQL_CLIENTSECRET')
# cred = ClientSecretCredential(tenant_id=tenant_id, client_id=client_id, client_secret=client_secret)
# 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)
Instale as dependências.
pip install azure-identity
Obtenha o token de acesso usando a biblioteca azure-identity usando variáveis de ambiente adicionadas pelo conector de serviço. Ao usar o código abaixo, descompacte a parte do snippet de código para o tipo de autenticação que você deseja usar.
from azure.identity import DefaultAzureCredential
import psycopg2
# Uncomment the following lines corresponding to the authentication type you want to use.
# For system-assigned identity.
# credential = DefaultAzureCredential()
# For user-assigned identity.
# managed_identity_client_id = os.getenv('AZURE_POSTGRESQL_CLIENTID')
# cred = ManagedIdentityCredential(client_id=managed_identity_client_id)
# For service principal.
# tenant_id = os.getenv('AZURE_POSTGRESQL_TENANTID')
# client_id = os.getenv('AZURE_POSTGRESQL_CLIENTID')
# client_secret = os.getenv('AZURE_POSTGRESQL_CLIENTSECRET')
# cred = ClientSecretCredential(tenant_id=tenant_id, client_id=client_id, client_secret=client_secret)
# Acquire the access token.
accessToken = cred.get_token('https://ossrdbms-aad.database.windows.net/.default')
No arquivo de configuração, obtenha as informações do banco de dados PostgreSQL do Azure das variáveis de ambiente adicionadas pelo serviço Conector de Serviço. Use accessToken adquirido na etapa anterior para acessar o banco de dados.
# In your setting file, eg. settings.py
host = os.getenv('AZURE_POSTGRESQL_HOST')
user = os.getenv('AZURE_POSTGRESQL_USER')
password = accessToken.token # this is accessToken acquired from above step.
database = os.getenv('AZURE_POSTGRESQL_NAME')
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql_psycopg2',
'NAME': database,
'USER': user,
'PASSWORD': password,
'HOST': host,
'PORT': '5432', # Port is 5432 by default
'OPTIONS': {'sslmode': 'require'},
}
}
Instale as dependências.
go get github.com/lib/pq
go get "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
go get "github.com/Azure/azure-sdk-for-go/sdk/azcore"
No código, obtenha o token de acesso usando azidentity e use-o como senha para se conectar ao PostgreSQL do Azure, juntamente com as informações de conexão fornecidas pelo conector de serviço. Ao usar o código abaixo, descompacte a parte do snippet de código para o tipo de autenticação que você deseja usar.
import (
"database/sql"
"fmt"
"os"
"context"
"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy"
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
_ "github.com/lib/pq"
)
// Uncomment the following lines corresponding to the authentication type you want to use.
// For system-assigned identity.
// cred, err := azidentity.NewDefaultAzureCredential(nil)
// For user-assigned identity.
// clientid := os.Getenv("AZURE_POSTGRESQL_CLIENTID")
// azidentity.ManagedIdentityCredentialOptions.ID := clientid
// options := &azidentity.ManagedIdentityCredentialOptions{ID: clientid}
// cred, err := azidentity.NewManagedIdentityCredential(options)
// For service principal.
// clientid := os.Getenv("AZURE_POSTGRESQL_CLIENTID")
// tenantid := os.Getenv("AZURE_POSTGRESQL_TENANTID")
// clientsecret := os.Getenv("AZURE_POSTGRESQL_CLIENTSECRET")
// cred, err := azidentity.NewClientSecretCredential(tenantid, clientid, clientsecret, &azidentity.ClientSecretCredentialOptions{})
if err != nil {
// error handling
}
// Acquire the access token
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
token, err := cred.GetToken(ctx, policy.TokenRequestOptions{
Scopes: []string("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.
connectionString := os.Getenv("AZURE_POSTGRESQL_CONNECTIONSTRING") + " password=" + token.Token
conn, err := sql.Open("postgres", connectionString)
if err != nil {
panic(err)
}
conn.Close()
No código, obtenha o token de acesso usando @azure/identity e informações de conexão PostgreSQL de variáveis de ambiente adicionadas pelo serviço do conector de serviço. Conectar-se a eles para estabelecer a conexão. Ao usar o código abaixo, descompacte a parte do snippet de código para o tipo de autenticação que você deseja usar.
import { DefaultAzureCredential, ClientSecretCredential } from "@azure/identity";
const { Client } = require('pg');
// Uncomment the following lines corresponding to the authentication type you want to use.
// 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
// });
// For service principal.
// const tenantId = process.env.AZURE_POSTGRESQL_TENANTID;
// const clientId = process.env.AZURE_POSTGRESQL_CLIENTID;
// const clientSecret = process.env.AZURE_POSTGRESQL_CLIENTSECRET;
// 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();
})();
Para o PHP, não existe um plug-in ou uma biblioteca para conexões sem senha. Você pode obter um token de acesso para a identidade gerenciada ou a entidade de serviço e usá-lo como senha para se conectar ao banco de dados. O token de acesso pode ser adquirido utilizando a API REST do Azure.
No código, obtenha o token de acesso usando a API REST com sua biblioteca favorita.
Para identidade atribuída pelo usuário e identidade atribuída pelo sistema, o Serviço de Aplicativo e os Aplicativos de Contêiner fornecem um ponto de extremidade REST acessível internamente para recuperar tokens para identidades gerenciadas, definindo duas variáveis de ambiente: IDENTITY_ENDPOINT e IDENTITY_HEADER. Para obter mais informações, consulte a referência do ponto de extremidade REST.
Obtenha o token de acesso fazendo uma solicitação HTTP GET para o ponto de extremidade de identidade e utilize https://ossrdbms-aad.database.windows.net como resource na consulta. Para a identidade atribuída pelo usuário, inclua também na consulta a ID do cliente das variáveis de ambiente adicionadas pelo Conector de Serviço.
Para entidades de serviço, consulte a solicitação de token de acesso de serviço para o serviço do Microsoft Azure AD para ver os detalhes de como adquirir o token de acesso. Faça a solicitação POST no escopo de https://ossrdbms-aad.database.windows.net/.default e com a ID de Locatário, a ID de Cliente e o segredo do cliente da entidade de serviço das variáveis de ambiente adicionadas pelo Conector de Serviço.
Combine o token de acesso e a cadeia de conexão PostgreSQL das variáveis de ambiente adicionadas pelo serviço Conector de Serviço para estabelecer a conexão.
Para o Ruby, não existe um plug-in ou uma biblioteca para conexões sem senha. Você pode obter um token de acesso para a identidade gerenciada ou a entidade de serviço e usá-lo como senha para se conectar ao banco de dados. O token de acesso pode ser adquirido utilizando a API REST do Azure.
Instale as dependências.
gem install pg
No código, obtenha o token de acesso usando a API REST e as informações de conexão do PostgreSQL de variáveis de ambiente adicionadas pelo serviço do conector de serviço. Conectar-se a eles para estabelecer a conexão. Ao usar o código abaixo, descompacte a parte do snippet de código para o tipo de autenticação que você deseja usar.
O serviço de aplicativo e os Aplicativos de contêiner fornecem um ponto de extremidade REST acessível internamente para recuperar tokens para identidades gerenciadas. Para obter mais informações, consulte a referência do ponto de extremidade REST.
require 'pg'
require 'dotenv/load'
require 'net/http'
require 'json'
# Uncomment the following lines corresponding to the authentication type you want to use.
# For system-assigned identity.
# uri = URI(ENV['IDENTITY_ENDPOINT'] + '?resource=https://ossrdbms-aad.database.windows.net&api-version=2019-08-01')
# res = Net::HTTP.get_response(uri, {'X-IDENTITY-HEADER' => ENV['IDENTITY_HEADER'], 'Metadata' => 'true'})
# For user-assigned identity.
# uri = URI(ENV[IDENTITY_ENDPOINT] + '?resource=https://ossrdbms-aad.database.windows.net&api-version=2019-08-01&client-id=' + ENV['AZURE_POSTGRESQL_CLIENTID'])
# res = Net::HTTP.get_response(uri, {'X-IDENTITY-HEADER' => ENV['IDENTITY_HEADER'], 'Metadata' => 'true'})
# For service principal
# uri = URI('https://login.microsoftonline.com/' + ENV['AZURE_POSTGRESQL_TENANTID'] + '/oauth2/v2.0/token')
# params = {
# :grant_type => 'client_credentials',
# :client_id: => ENV['AZURE_POSTGRESQL_CLIENTID'],
# :client_secret => ENV['AZURE_POSTGRESQL_CLIENTSECRET'],
# :scope => 'https://ossrdbms-aad.database.windows.net/.default'
# }
# req = Net::HTTP::POST.new(uri)
# req.set_form_data(params)
# req['Content-Type'] = 'application/x-www-form-urlencoded'
# res = Net::HTTP.start(uri.hostname, uri.port, :use_ssl => true) do |http|
# http.request(req)
parsed = JSON.parse(res.body)
access_token = parsed["access_token"]
# Use the token and the connection string from the environment variables added by Service Connector to establish the connection.
conn = PG::Connection.new(
connection_string: ENV['AZURE_POSTGRESQL_CONNECTIONSTRING'] + " password=" + access_token,
)
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.