Руководство по созданию бессерверного подключения к службе базы данных с помощью соединителя служб
Статья
Для доступа к службам Azure используются управляемые удостоверения без пароля. С помощью этого подхода вам не нужно вручную отслеживать секреты для управляемых удостоверений и управлять ими. Эти задачи безопасно обрабатываются Azure.
Соединитель служб включает управляемые удостоверения в службах размещения приложений, таких как Azure Spring Apps, приложение Azure Service и приложения контейнеров Azure. Соединитель служб также настраивает службы баз данных, такие как База данных Azure для PostgreSQL, База данных Azure для MySQL и База данных SQL Azure, для принятия управляемых удостоверений.
В этом учебнике используется Azure CLI для выполнения следующих задач:
Проверьте исходную среду с помощью Azure CLI.
Создайте подключение без пароля с помощью соединителя службы.
Используйте переменные среды или конфигурации, созданные соединителем службы, для доступа к службе базы данных.
Войдите с помощью Azure CLI.az login Если вы используете Azure Cloud Shell или уже вошли в систему, подтвердите проверку подлинности учетной записи.az account show
Установка расширения без пароля соединителя службы
Установите последнее расширение соединителя службы без пароля для Azure CLI:
az extension add --name serviceconnector-passwordless --upgrade
Примечание.
Проверьте расширение serviceconnector-passwordless версии 2.0.2 или более поздней.az version Чтобы обновить версию расширения, может потребоваться сначала обновить Azure CLI.
Создание подключения без пароля
Далее мы используем службу приложение Azure в качестве примера для создания подключения с помощью управляемого удостоверения.
Если вы используете портал Azure, перейдите в колонку соединителя служб приложение Azure, Azure Spring Apps или приложения контейнеров Azure и выберите "Создать", чтобы создать подключение. Портал Azure автоматически создадут команду и активируют выполнение команды в Cloud Shell.
Следующая команда Azure CLI использует --client-type параметр, он может быть java, dotnet, python и т. д. Запустите az webapp connection create postgres-flexible -h файл, чтобы получить поддерживаемые типы клиентов, и выбрать тот, который соответствует приложению.
База данных Azure для MySQL . Гибкий сервер требует управляемого удостоверения, назначаемого пользователем, для включения проверки подлинности Microsoft Entra. Дополнительные сведения см. в статье Настройка проверки подлинности Microsoft Entra для База данных Azure для MySQL — гибкий сервер. Для создания управляемого удостоверения, назначаемого пользователем, можно использовать следующую команду:
После создания управляемого удостоверения, назначаемого пользователем, попросите глобального администратора или администратора привилегированных ролей предоставить следующие разрешения для этого удостоверения:
Затем подключите приложение к базе данных MySQL с помощью управляемого удостоверения, назначаемого системой, с помощью соединителя службы.
Следующая команда Azure CLI использует --client-type параметр. az webapp connection create mysql-flexible -h Запустите файл, чтобы получить поддерживаемые типы клиентов и выберите тот, который соответствует приложению.
Следующая команда Azure CLI использует --client-type параметр. az webapp connection create sql -h Запустите файл, чтобы получить поддерживаемые типы клиентов и выберите тот, который соответствует приложению.
Эта команда Соединителя служб выполняет следующие задачи в фоновом режиме:
Включите управляемое удостоверение, назначаемое системой, или назначьте удостоверение пользователя для приложения$APPSERVICE_NAME, размещенного приложение Azure Service/Azure Spring Apps/Azure Container Apps.
Включите проверку подлинности Microsoft Entra для сервера базы данных, если она не включена раньше.
Задайте администратору Microsoft Entra текущий пользователь, выполнившего вход.
Добавьте пользователя базы данных для управляемого удостоверения, назначаемого системой, назначаемого пользователем управляемого удостоверения или субъекта-службы. Предоставьте этому пользователю все права доступа к базе данных $DATABASE_NAME . Имя пользователя можно найти в строка подключения в предыдущих выходных данных команды.
Задайте конфигурации с именем AZURE_MYSQL_CONNECTIONSTRINGили AZURE_POSTGRESQL_CONNECTIONSTRINGAZURE_SQL_CONNECTIONSTRING ресурсом Azure на основе типа базы данных.
Для Служба приложений конфигурации задаются в колонке "Параметры приложения".
Для Spring Apps конфигурации задаются при запуске приложения.
Для контейнерных приложений конфигурации задаются переменными среды. Все конфигурации и их значения можно получить в колонке "Соединитель службы" в портал Azure.
Соединитель служб назначит пользователю следующие привилегии, вы можете отозвать их и настроить привилегии на основе ваших требований.
GRANT ALL PRIVILEGES ON DATABASE "$DATABASE_NAME" TO "username";
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO "username";
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO "username";
GRANT ALL PRIVILEGES ON $DATABASE_NAME.* TO 'username'@'%';
GRANT CONTROL ON DATABASE::"$DATABASE_NAME" TO "username";
Подключение к базе данных с помощью проверки подлинности Microsoft Entra
После создания подключения можно использовать строка подключения в приложении для подключения к базе данных с проверкой подлинности Microsoft Entra. Например, можно использовать следующие решения для подключения к базе данных с проверкой подлинности Microsoft Entra.
Для .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();
}
Если вы создаете подключение с параметром --client-type springbootSpring, соединитель службы задает свойства spring.datasource.azure.passwordless-enabledspring.datasource.urlи spring.datasource.username Azure Spring Apps.
pip install azure-identity
pip install psycopg2-binary
pip freeze > requirements.txt # Save the dependencies to a file
Получение маркера доступа с помощью azure-identity библиотеки и использование маркера в качестве пароля. Получение сведений о подключении из переменных среды, добавленных соединителем службы. При использовании приведенного ниже кода раскомментируйте часть фрагмента кода для используемого типа проверки подлинности.
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)
Установите зависимости.
pip install azure-identity
Получение маркера доступа с помощью библиотеки с помощью azure-identity переменных среды, добавленных соединителем службы. При использовании приведенного ниже кода раскомментируйте часть фрагмента кода для используемого типа проверки подлинности.
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')
В файле параметров получите сведения о базе данных Azure PostgreSQL из переменных среды, добавленных службой Service Connector. Используйте accessToken полученный на предыдущем шаге для доступа к базе данных.
# 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'},
}
}
Установите зависимости.
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"
В коде получите маркер доступа с помощью azidentity, а затем используйте его в качестве пароля для подключения к Azure PostgreSQL, а также сведения о подключении, предоставляемые соединителем службы. При использовании приведенного ниже кода раскомментируйте часть фрагмента кода для используемого типа проверки подлинности.
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()
В коде получите маркер доступа с помощью @azure/identity и сведения о подключении PostgreSQL из переменных среды, добавленных службой Service Connector. Объедините их для установления соединения. При использовании приведенного ниже кода раскомментируйте часть фрагмента кода для используемого типа проверки подлинности.
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();
})();
Для PHP нет подключаемого модуля или библиотеки для подключений без пароля. Маркер доступа для управляемого удостоверения или субъекта-службы можно получить и использовать в качестве пароля для подключения к базе данных. Маркер доступа можно получить с помощью REST API Azure.
В коде получите маркер доступа с помощью REST API с любимой библиотекой.
Для назначаемых пользователем удостоверений и назначаемых системой удостоверений Служба приложений и контейнерных приложений предоставляет внутреннюю конечную точку REST для получения маркеров для управляемых удостоверений путем определения двух переменных среды: IDENTITY_ENDPOINT и IDENTITY_HEADER. Дополнительные сведения см . в справочнике по конечной точке REST.
Получите маркер доступа, выполнив HTTP-запрос GET к конечной точке удостоверения и используя https://ossrdbms-aad.database.windows.net его как resource в запросе. Для удостоверения, назначаемого пользователем, добавьте идентификатор клиента из переменных среды, добавленных соединителем службы в запрос, а также.
Сведения о том, как получить маркер доступа, см. в запросе маркера доступа между службами Azure AD. Сделайте запрос POST областью https://ossrdbms-aad.database.windows.net/.default действия и с идентификатором клиента, идентификатором клиента и секретом клиента субъекта-службы из переменных среды, добавленных соединителем службы.
Объедините маркер доступа и sting подключения PostgreSQL из переменных среды, добавленных службой Соединителя служб для установления подключения.
Для Ruby нет подключаемого модуля или библиотеки для подключений без пароля. Маркер доступа для управляемого удостоверения или субъекта-службы можно получить и использовать в качестве пароля для подключения к базе данных. Маркер доступа можно получить с помощью REST API Azure.
Установите зависимости.
gem install pg
В коде получите маркер доступа с помощью REST API и сведений о подключении PostgreSQL из переменных среды, добавленных службой Service Connector. Объедините их для установления соединения. При использовании приведенного ниже кода раскомментируйте часть фрагмента кода для используемого типа проверки подлинности.
Служба приложений и приложения-контейнеры предоставляют внутреннюю конечную точку REST для получения маркеров для управляемых удостоверений. Дополнительные сведения см . в справочнике по конечной точке 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,
)
Дополнительные сведения о получении маркера доступа для субъекта-службы см. в запросе маркера доступа к службе Azure AD.
Для других языков используйте свойства подключения, которые соединитель службы задает переменным среды для подключения к базе данных. Сведения об переменной среды см. в разделе "Интеграция База данных Azure для PostgreSQL с соединителем службы".
Затем, если вы создали таблицы и последовательности в гибком сервере 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
Для .NET нет подключаемого модуля или библиотеки для поддержки подключений без пароля. Маркер доступа для управляемого удостоверения или субъекта-службы можно получить с помощью клиентской библиотеки, такой как Azure.Identity. Затем вы можете использовать маркер доступа в качестве пароля для подключения к базе данных. При использовании приведенного ниже кода раскомментируйте часть фрагмента кода для используемого типа проверки подлинности.
using Azure.Core;
using Azure.Identity;
using MySqlConnector;
// Uncomment the following lines corresponding to the authentication type you want to use.
// 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");
// });
// For service principal.
// var tenantId = Environment.GetEnvironmentVariable("AZURE_MYSQL_TENANTID");
// var clientId = Environment.GetEnvironmentVariable("AZURE_MYSQL_CLIENTID");
// var clientSecret = Environment.GetEnvironmentVariable("AZURE_MYSQL_CLIENTSECRET");
// var credential = new ClientSecretCredential(tenantId, clientId, clientSecret);
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
Если вы создаете подключение с параметром --client-type springbootSpring, соединитель службы задает свойства spring.datasource.azure.passwordless-enabledspring.datasource.urlи spring.datasource.username Azure Spring Apps.
Проверка подлинности с помощью azure-identity маркера доступа через библиотеку и получение сведений о подключении из переменной среды, добавленной соединителем службы. При использовании приведенного ниже кода раскомментируйте часть фрагмента кода для используемого типа проверки подлинности.
from azure.identity import ManagedIdentityCredential, ClientSecretCredential
import mysql.connector
import os
# Uncomment the following lines corresponding to the authentication type you want to use.
# For system-assigned managed identity.
# cred = ManagedIdentityCredential()
# For user-assigned managed identity.
# managed_identity_client_id = os.getenv('AZURE_MYSQL_CLIENTID')
# cred = ManagedIdentityCredential(client_id=managed_identity_client_id)
# For service principal
# tenant_id = os.getenv('AZURE_MYSQL_TENANTID')
# client_id = os.getenv('AZURE_MYSQL_CLIENTID')
# client_secret = os.getenv('AZURE_MYSQL_CLIENTSECRET')
# cred = ClientSecretCredential(tenant_id=tenant_id, client_id=client_id, client_secret=client_secret)
# acquire token
accessToken = cred.get_token('https://ossrdbms-aad.database.windows.net/.default')
# open connect to Azure MySQL with the access token.
host = os.getenv('AZURE_MYSQL_HOST')
database = os.getenv('AZURE_MYSQL_NAME')
user = os.getenv('AZURE_MYSQL_USER')
password = accessToken.token
cnx = mysql.connector.connect(user=user,
password=password,
host=host,
database=database)
cnx.close()
Установите зависимости.
pip install azure-identity
Получение маркера доступа через azure-identity библиотеку с переменными среды, добавленными соединителем службы. При использовании приведенного ниже кода раскомментируйте часть фрагмента кода для используемого типа проверки подлинности.
from azure.identity import ManagedIdentityCredential, ClientSecretCredential
import os
# Uncomment the following lines corresponding to the authentication type you want to use.
# system-assigned managed identity
# cred = ManagedIdentityCredential()
# user-assigned managed identity
# managed_identity_client_id = os.getenv('AZURE_MYSQL_CLIENTID')
# cred = ManagedIdentityCredential(client_id=managed_identity_client_id)
# service principal
# tenant_id = os.getenv('AZURE_MYSQL_TENANTID')
# client_id = os.getenv('AZURE_MYSQL_CLIENTID')
# client_secret = os.getenv('AZURE_MYSQL_CLIENTSECRET')
# cred = ClientSecretCredential(tenant_id=tenant_id, client_id=client_id, client_secret=client_secret)
# acquire token
accessToken = cred.get_token('https://ossrdbms-aad.database.windows.net/.default')
В файле параметров получите сведения о базе данных Azure MySQL из переменных среды, добавленных службой Service Connector. Используйте accessToken полученный на предыдущем шаге для доступа к базе данных.
# in your setting file, eg. settings.py
host = os.getenv('AZURE_MYSQL_HOST')
database = os.getenv('AZURE_MYSQL_NAME')
user = os.getenv('AZURE_MYSQL_USER')
password = accessToken.token # this is accessToken acquired from above step.
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': database,
'USER': user,
'PASSWORD': password,
'HOST': host
}
}
Установите зависимости.
go get "github.com/go-sql-driver/mysql"
go get "github.com/Azure/azure-sdk-for-go/sdk/azidentity"
go get "github.com/Azure/azure-sdk-for-go/sdk/azcore"
В коде получите маркер доступа, azidentityа затем подключитесь к Azure MySQL с помощью маркера. При использовании приведенного ниже кода раскомментируйте часть фрагмента кода для используемого типа проверки подлинности.
import (
"context"
"github.com/Azure/azure-sdk-for-go/sdk/azcore/policy"
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
"github.com/go-sql-driver/mysql"
)
func main() {
// Uncomment the following lines corresponding to the authentication type you want to use.
// for system-assigned managed identity
// cred, err := azidentity.NewDefaultAzureCredential(nil)
// for user-assigned managed identity
// clientid := os.Getenv("AZURE_MYSQL_CLIENTID")
// azidentity.ManagedIdentityCredentialOptions.ID := clientid
// options := &azidentity.ManagedIdentityCredentialOptions{ID: clientid}
// cred, err := azidentity.NewManagedIdentityCredential(options)
// for service principal
// clientid := os.Getenv("AZURE_MYSQL_CLIENTID")
// tenantid := os.Getenv("AZURE_MYSQL_TENANTID")
// clientsecret := os.Getenv("AZURE_MYSQL_CLIENTSECRET")
// cred, err := azidentity.NewClientSecretCredential(tenantid, clientid, clientsecret, &azidentity.ClientSecretCredentialOptions{})
if err != nil {
}
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"),
})
connectionString := os.Getenv("AZURE_MYSQL_CONNECTIONSTRING") + ";Password=" + token.Token
db, err := sql.Open("mysql", connectionString)
}
Получение маркера доступа с помощью @azure/identity и сведений о базе данных Azure MySQL из переменных среды, добавленных службой Service Connector. При использовании приведенного ниже кода раскомментируйте часть фрагмента кода для используемого типа проверки подлинности.
import { DefaultAzureCredential,ClientSecretCredential } from "@azure/identity";
const mysql = require('mysql2');
// Uncomment the following lines corresponding to the authentication type you want to use.
// for system-assigned managed identity
// const credential = new DefaultAzureCredential();
// for user-assigned managed identity
// const clientId = process.env.AZURE_MYSQL_CLIENTID;
// const credential = new DefaultAzureCredential({
// managedIdentityClientId: clientId
// });
// for service principal
// const tenantId = process.env.AZURE_MYSQL_TENANTID;
// const clientId = process.env.AZURE_MYSQL_CLIENTID;
// const clientSecret = process.env.AZURE_MYSQL_CLIENTSECRET;
// const credential = new ClientSecretCredential(tenantId, clientId, clientSecret);
// acquire token
var accessToken = await credential.getToken('https://ossrdbms-aad.database.windows.net/.default');
const connection = mysql.createConnection({
host: process.env.AZURE_MYSQL_HOST,
user: process.env.AZURE_MYSQL_USER,
password: accessToken.token,
database: process.env.AZURE_MYSQL_DATABASE,
port: process.env.AZURE_MYSQL_PORT,
ssl: process.env.AZURE_MYSQL_SSL
});
connection.connect((err) => {
if (err) {
console.error('Error connecting to MySQL database: ' + err.stack);
return;
}
console.log('Connected to MySQL database');
});
Для других языков используйте строка подключения и имя пользователя, которые соединитель службы задает переменным среды для подключения к базе данных. Сведения об переменной среды см. в разделе "Интеграция База данных Azure для MySQL с соединителем службы".
Для других языков используйте строка подключения и имя пользователя, которые соединитель службы задает переменным среды для подключения к базе данных. Сведения об переменной среды см. в разделе "Интеграция База данных Azure для MySQL с соединителем службы".
Для других языков используйте свойства подключения, которые соединитель службы задает переменным среды для подключения к базе данных. Сведения об переменной среды см. в разделе "Интеграция База данных Azure для MySQL с соединителем службы".
Получите База данных SQL Azure строка подключения из переменной среды, добавленной соединителем службы.
using Microsoft.Data.SqlClient;
string connectionString =
Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING")!;
using var connection = new SqlConnection(connectionString);
connection.Open();
Получите База данных SQL Azure строка подключения из переменной среды, добавленной соединителем службы.
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.Statement;
import com.microsoft.sqlserver.jdbc.SQLServerDataSource;
public class Main {
public static void main(String[] args) {
// AZURE_SQL_CONNECTIONSTRING should be one of the following:
// For system-assigned managed identity: "jdbc:sqlserver://{SQLName}.database.windows.net:1433;databaseName={SQLDbName};authentication=ActiveDirectoryMSI;"
// For user-assigned managed identity: "jdbc:sqlserver://{SQLName}.database.windows.net:1433;databaseName={SQLDbName};msiClientId={UserAssignedMiClientId};authentication=ActiveDirectoryMSI;"
// For service principal: "jdbc:sqlserver://{SQLName}.database.windows.net:1433;databaseName={SQLDbName};user={ServicePrincipalClientId};password={spSecret};authentication=ActiveDirectoryServicePrincipal;"
String connectionString = System.getenv("AZURE_SQL_CONNECTIONSTRING");
SQLServerDataSource ds = new SQLServerDataSource();
ds.setURL(connectionString);
try (Connection connection = ds.getConnection()) {
System.out.println("Connected successfully.");
} catch (SQLException e) {
e.printStackTrace();
}
}
}
Если вы создаете подключение с параметром --client-type springbootSpring, соединитель служб задает свойства spring.datasource.url с форматом jdbc:sqlserver://<sql-server>.database.windows.net:1433;databaseName=<sql-db>;authentication=ActiveDirectoryMSI; значений в Azure Spring Apps.
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')
# Uncomment the following lines corresponding to the authentication type you want to use.
# For system-assigned managed identity.
# connString = f'Driver={{ODBC Driver 18 for SQL Server}};Server=tcp:{server},{port};Database={database};Authentication={authentication};Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30'
# For user-assigned managed identity.
# clientID = os.getenv('AZURE_SQL_USER')
# connString = f'Driver={{ODBC Driver 18 for SQL Server}};Server=tcp:{server},{port};Database={database};UID={clientID};Authentication={authentication};Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30'
# For service principal.
# user = os.getenv('AZURE_SQL_USER')
# password = os.getenv('AZURE_SQL_PASSWORD')
# connString = f'Driver={{ODBC Driver 18 for SQL Server}};Server=tcp:{server},{port};Database={database};UID={user};PWD={password};Authentication={authentication};Encrypt=yes;TrustServerCertificate=no;Connection Timeout=30'
conn = pyodbc.connect(connString)
Установите зависимости.
npm install mssql
Получите конфигурации подключения База данных SQL Azure из переменных среды, добавленных соединителем службы. При использовании приведенного ниже кода раскомментируйте часть фрагмента кода для используемого типа проверки подлинности.
Для других языков используйте свойства подключения, которые соединитель службы задает переменным среды для подключения к базе данных. Сведения об переменной среды см. в разделе "Интеграция База данных SQL Azure с соединителем службы".
Развертывание приложения в службе размещения Azure
Наконец, разверните приложение в службе размещения Azure. Эта исходная служба может использовать управляемое удостоверение для подключения к целевой базе данных в Azure.
Затем вы можете проверить журнал или вызвать приложение, чтобы узнать, может ли он подключиться к базе данных Azure успешно.
Устранение неполадок
Разрешение
Если возникают ошибки, связанные с разрешениями, убедитесь, что пользователь Azure CLI вошел в систему с помощью команды az account show. Убедитесь, что вы войдите с помощью правильной учетной записи. Затем убедитесь, что у вас есть следующие разрешения, которые могут потребоваться для создания бессерверного подключения к соединителю службы.
Разрешение
Операция
Microsoft.DBforPostgreSQL/flexibleServers/read
Требуется для получения сведений о сервере базы данных
Microsoft.DBforPostgreSQL/flexibleServers/write
Требуется для включения проверки подлинности Microsoft Entra для сервера базы данных
Требуется, чтобы добавить пользователя входа Azure CLI в качестве администратора сервера базы данных Microsoft Entra
Разрешение
Операция
Microsoft.Sql/servers/read
Требуется для получения сведений о сервере базы данных
Microsoft.Sql/servers/firewallRules/write
Требуется для создания правила брандмауэра в случае блокировки локального IP-адреса
Microsoft.Sql/servers/firewallRules/delete
Требуется для восстановления правила брандмауэра, созданного соединителем службы, чтобы избежать проблем безопасности
Microsoft.Sql/servers/administrators/read
Требуется проверить, является ли пользователь входа Azure CLI администратором Microsoft Entra сервера базы данных
Microsoft.Sql/servers/administrators/write
Требуется, чтобы добавить пользователя входа Azure CLI в качестве администратора сервера базы данных Microsoft Entra
В некоторых случаях разрешения не требуются. Например, если пользователь, прошедший проверку подлинности Azure CLI, уже является администратором Active Directory на СЕРВЕРе SQL Server, у вас нет Microsoft.Sql/servers/administrators/write разрешения.
Microsoft Entra ID
Если возникает ошибка ERROR: AADSTS530003: Your device is required to be managed to access this resource., обратитесь к ИТ-отделу за помощью при присоединении этого устройства к идентификатору Microsoft Entra. Дополнительные сведения см. в разделе "Присоединенные к Microsoft Entra устройства".
Соединитель служб должен получить доступ к идентификатору Microsoft Entra, чтобы получить сведения о вашей учетной записи и управляемом удостоверении службы размещения. Чтобы проверить, может ли устройство получить доступ к идентификатору Microsoft Entra, можно использовать следующую команду:
az ad signed-in-user show
Если вы не входите в систему в интерактивном режиме, вы также можете получить ошибку и Interactive authentication is needed. Чтобы устранить ошибку, войдите в систему с помощью az login команды.
Сетевое соединение
Если сервер базы данных находится в виртуальная сеть, убедитесь, что среда, в которой выполняется команда Azure CLI, может получить доступ к серверу в виртуальная сеть.
Если сервер базы данных находится в виртуальная сеть, убедитесь, что среда, в которой выполняется команда Azure CLI, может получить доступ к серверу в виртуальная сеть.
Если сервер базы данных запрещает общедоступный доступ, убедитесь, что среда, которая выполняет команду Azure CLI, может получить доступ к серверу через частную конечную точку.
Следующие шаги
Дополнительные сведения о соединителе службы и бессерверных подключениях см. в следующих ресурсах: