Руководство по созданию бессерверного подключения к службе базы данных с помощью соединителя служб
Статья
Для доступа к службам Azure используются управляемые удостоверения без пароля. С помощью этого подхода вам не нужно вручную отслеживать секреты для управляемых удостоверений и управлять ими. Эти задачи безопасно обрабатываются Azure.
Service Connector позволяет использовать управляемые удостоверения в службах размещения приложений, таких как Azure Spring Apps, Azure App Service и Azure Container Apps. Соединитель служб также настраивает службы баз данных, такие как База данных Azure для PostgreSQL, База данных Azure для MySQL и База данных SQL Azure, чтобы принимать управляемые идентичности.
В этом учебнике используется Azure CLI для выполнения следующих задач:
Проверьте исходную среду с помощью Azure CLI.
Создайте подключение без пароля с помощью Service Connector.
Используйте переменные среды или конфигурации, созданные соединителем службы, для доступа к службе базы данных.
Если вы предпочитаете запускать справочные команды CLI локально, установите Azure CLI. Если вы работаете в Windows или macOS, попробуйте запустить Azure CLI в контейнере Docker. Дополнительные сведения см. в статье Как запустить Azure CLI в контейнере Docker.
Если вы используете локальную установку, выполните вход в Azure CLI с помощью команды az login. Чтобы завершить процесс проверки подлинности, выполните действия, отображаемые в терминале. Сведения о других возможностях, доступных при входе, см. в статье Вход с помощью Azure CLI.
Установите расширение Azure CLI при первом использовании, когда появится соответствующий запрос. Дополнительные сведения о расширениях см. в статье Использование расширений с Azure CLI.
Выполните команду az version, чтобы узнать установленную версию и зависимые библиотеки. Чтобы обновиться до последней версии, выполните команду az upgrade.
Установка расширения для работы без пароля для соединителя служб
Установите безпарольное расширение последней версии коннектора сервиса для Azure CLI.
az extension add --name serviceconnector-passwordless --upgrade
Примечание.
Убедитесь, что расширение "serviceconnector-passwordless" версии "2.0.2" или более поздней, запустив az version. Чтобы обновить версию расширения, может потребоваться сначала обновить Azure CLI.
Создание подключения без пароля
Далее мы используем службу приложений Azure в качестве примера для создания подключения с помощью управляемой идентичности.
Если вы используете портал Azure, перейдите в область Service Connector службы Azure App Service, Azure Spring Apps или Azure Container Apps, и выберите Создать, чтобы создать подключение. Портал Azure автоматически создаст команду и активирует выполнение команды на Cloud Shell.
Следующая команда Azure CLI использует --client-type параметр, он может быть java, dotnet, python и т. д. Запустите az webapp connection create postgres-flexible -h файл, чтобы получить поддерживаемые типы клиентов, и выбрать тот, который соответствует приложению.
База данных Azure для MySQL - Flexible Server требует пользовательского управляющего удостоверения для включения аутентификации 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_CONNECTIONSTRING или AZURE_SQL_CONNECTIONSTRING для ресурса Azure на основе типа базы данных.
Для App Service конфигурации задаются на вкладке "Параметры приложения".
Для Spring Apps конфигурации задаются при запуске приложения.
Для контейнерных приложений конфигурации задаются переменными среды. Все конфигурации и их значения можно получить на вкладке Service Connector в портале 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;
// const credential = new ClientSecretCredential(tenantId, clientId, 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 с идентификатором арендатора, идентификатором клиента и клиентским секретом служебного принципала, полученными из значений переменных среды, добавленных соединителем службы.
Скомбинируйте маркер доступа и строку подключения PostgreSQL из переменных среды, добавленных службой Service Connector, для создания соединения.
Для 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.
Затем, если вы создали таблицы и последовательности на гибком сервере 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
Для Spring-приложения, если вы создаете подключение с параметром --client-type springboot, сервисный соединитель задает свойства spring.datasource.azure.passwordless-enabled, spring.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 Database для MySQL с Коннектором службы.
Получите строку подключения к базе данных Azure SQL из переменной среды, добавленной Коннектором службы.
using Microsoft.Data.SqlClient;
string connectionString =
Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING")!;
using var connection = new SqlConnection(connectionString);
connection.Open();
Получите строку подключения к базе данных Azure SQL из переменной среды, добавленной соединителем сервисов.
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 springboot, соединитель служб задает свойства spring.datasource.url со значением формата jdbc:sqlserver://<sql-server>.database.windows.net:1433;databaseName=<sql-db>;authentication=ActiveDirectoryMSI; в Azure Spring Apps.
Получите конфигурации подключения к базе данных Azure SQL из переменной среды, добавленной Коннектором службы. При использовании приведенного ниже кода раскомментируйте часть фрагмента кода для типа проверки подлинности, который вы хотите использовать. Если вы используете приложения Azure Container Apps как вычислительную службу или если строка подключения в коде не работает, см. статью "Миграция приложения Python для использования подключений к базе данных Azure SQL без пароля" для подключения к базе данных Azure SQL с помощью токена доступа.
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
Получите конфигурации подключения Azure SQL Database из переменных среды, добавленных Service Connector. При использовании приведенного ниже кода раскомментируйте часть фрагмента кода для используемого типа проверки подлинности.
Для других языков используйте свойства подключения, которые соединитель службы задает переменным среды для подключения к базе данных. Сведения об переменной среды см. в разделе "Интеграция База данных SQL Azure с соединителем службы".
Планы Basic, Standardи Enterprise вступили в период вывода из обращения 17 марта 2025 года. Дополнительные сведения см. в объявлении о выходе на пенсию в Azure Spring Apps.
Проверьте журнал или вызовите приложение, чтобы узнать, может ли он подключиться к базе данных Azure успешно.
Устранение неполадок
Разрешения
Если возникают ошибки, связанные с разрешениями, убедитесь, что пользователь Azure CLI вошел в систему с помощью команды az account show. Убедитесь, что вы войдите с помощью правильной учетной записи. Затем убедитесь, что у вас есть следующие разрешения, которые могут потребоваться для создания безпарольного подключения с использованием Service Connector.
Разрешение
Операция
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 ID, чтобы извлечь информацию из вашей учетной записи и управляемого удостоверения хостинговой службы. Чтобы проверить, может ли устройство получить доступ к идентификатору Microsoft Entra, можно использовать следующую команду:
az ad signed-in-user show
Если вы не входите в систему в интерактивном режиме, вы также можете получить ошибку и Interactive authentication is needed. Чтобы устранить ошибку, войдите в систему с помощью az login команды.
Сетевое соединение
Если сервер базы данных находится в виртуальной сети, убедитесь, что среда, в которой выполняется команда Azure CLI, может получить доступ к серверу в виртуальной сети.
Если сервер базы данных находится в виртуальной сети, убедитесь, что среда выполнения команды Azure CLI может получить доступ к серверу в виртуальной сети.
Если сервер базы данных запрещает общедоступный доступ, убедитесь, что среда, которая выполняет команду Azure CLI, может получить доступ к серверу через частную конечную точку.
Следующие шаги
Дополнительные сведения о соединителе службы и подключениях без пароля см. в следующих ресурсах: