암호 없는 연결은 관리 ID를 사용하여 Azure 서비스에 액세스합니다. 이 방법을 사용하면 관리 ID에 대한 비밀을 수동으로 추적하고 관리할 필요가 없습니다. 이러한 작업은 Azure에서 내부적으로 안전하게 처리됩니다.
서비스 커넥터를 사용하면 Azure Spring Apps, Azure App Service 및 Azure Container Apps와 같은 앱 호스팅 서비스에서 관리 ID를 사용할 수 있습니다. 또한 서비스 커넥터는 관리 ID를 허용하도록 Azure Database for PostgreSQL, Azure Database for MySQL 및 Azure SQL Database와 같은 데이터베이스 서비스를 구성합니다.
이 자습서에서는 Azure CLI를 사용하여 다음 작업을 완료합니다.
Azure CLI를 사용하여 초기 환경을 확인합니다.
서비스 커넥터를 사용하여 암호 없는 연결을 만듭니다.
서비스 커넥터에서 생성된 환경 변수 또는 구성을 사용하여 데이터베이스 서비스에 액세스합니다.
다음 Azure CLI 명령은 --client-type 매개 변수를 사용하며 java, dotnet, python 등일 수 있습니다. az webapp connection create postgres-flexible -h를 실행하여 지원되는 클라이언트 형식을 가져오고 애플리케이션과 일치하는 클라이언트 형식을 선택합니다.
시스템이 할당한 관리 ID를 사용하도록 설정하거나 Azure App Service/Azure Spring Apps/Azure Container Apps에서 호스트하는 앱 $APPSERVICE_NAME에 대한 사용자 ID를 할당합니다.
이전에 활성화되지 않은 경우 데이터베이스 서버에 대해 Microsoft Entra 인증을 활성화합니다.
Microsoft Entra 관리자를 현재 로그인한 사용자로 설정합니다.
시스템이 할당한 관리 ID, 사용자가 할당한 관리 ID 또는 서비스 주체에 대한 데이터베이스 사용자를 추가합니다. 이 사용자에게 데이터베이스 $DATABASE_NAME의 모든 권한을 부여합니다. 사용자 이름은 이전 명령 출력의 연결 문자열에서 찾을 수 있습니다.
AZURE_MYSQL_CONNECTIONSTRING, AZURE_POSTGRESQL_CONNECTIONSTRING 또는 AZURE_SQL_CONNECTIONSTRING이라는 구성을 데이터베이스 유형에 기반한 Azure 리소스로 설정합니다.
App Service의 경우 구성은 앱 설정 블레이드에서 설정됩니다.
Spring Apps의 경우 애플리케이션이 시작될 때 구성이 설정됩니다.
Container Apps의 경우 구성이 환경 변수로 설정됩니다. Azure Portal의 서비스 커넥터 블레이드에서 모든 구성 및 해당 값을 가져올 수 있습니다.
서비스 커넥터는 사용자에게 다음 권한을 할당합니다. 이를 취소하고 요구 사항에 따라 권한을 조정할 수 있습니다.
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와 같은 클라이언트 라이브러리를 사용하여 관리 ID 또는 서비스 주체에 대한 액세스 토큰을 가져올 수 있습니다. 그런 다음 액세스 토큰을 암호로 사용하여 데이터베이스에 연결할 수 있습니다. 아래 코드를 사용하는 경우 사용하려는 인증 유형에 대한 코드 조각 부분의 주석 처리를 제거합니다.
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();
}
Spring 애플리케이션의 경우 --client-type springboot 옵션을 사용하여 연결을 만드는 경우 서비스 커넥터는 spring.datasource.azure.passwordless-enabled, spring.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 데이터베이스 정보를 가져옵니다. 이전 단계에서 얻은 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 연결 정보를 사용하여 액세스 토큰을 가져옵니다. 이들을 결합하여 연결을 설정합니다. 아래 코드를 사용하는 경우 사용하려는 인증 유형에 대한 코드 조각 부분의 주석 처리를 제거합니다.
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의 경우 암호 없는 연결을 지원하는 플러그 인 또는 라이브러리가 없습니다. 관리 ID 또는 서비스 주체에 대한 액세스 토큰을 가져와 암호로 사용하여 데이터베이스에 연결할 수 있습니다. 액세스 토큰은 Azure REST API를 사용하여 얻을 수 있습니다.
코드에서 선호하는 라이브러리와 함께 REST API를 사용하여 액세스 토큰을 가져옵니다.
사용자가 할당한 ID와 시스템이 할당한 ID의 경우 App Service 및 Container Apps는 IDENTITY_ENDPOINT 및 IDENTITY_HEADER 환경 변수를 정의하여 관리 ID에 대한 토큰을 검색할 수 있는, 내부적으로 액세스 가능한 REST 엔드포인트를 제공합니다. 자세한 내용은 REST 엔드포인트 참조에서 확인할 수 있습니다.
ID 엔드포인트에 대한 HTTP GET 요청을 만들어 액세스 토큰을 가져오고, 쿼리에서 https://ossrdbms-aad.database.windows.net을 resource로 사용합니다. 사용자가 할당한 ID의 경우 서비스 커넥터가 추가한 환경 변수의 클라이언트 ID도 쿼리에 포함시킵니다.
서비스 주체의 경우 Azure AD 서비스 간 액세스 토큰 요청을 참조하여 액세스 토큰을 가져오는 자세한 방법을 확인합니다. 서비스 커넥터가 추가한 환경 변수의 서비스 주체 테넌트 ID, 클라이언트 ID 및 클라이언트 암호를 사용하여 https://ossrdbms-aad.database.windows.net/.default 범위까지 POST 요청을 만듭니다.
서비스 커넥터 서비스가 추가한 환경 변수의 액세스 토큰과 PostgreSQL 연결 문자열을 결합하여 연결을 설정합니다.
Ruby의 경우 암호 없는 연결을 지원하는 플러그 인 또는 라이브러리가 없습니다. 관리 ID 또는 서비스 주체에 대한 액세스 토큰을 가져와 암호로 사용하여 데이터베이스에 연결할 수 있습니다. 액세스 토큰은 Azure REST API를 사용하여 얻을 수 있습니다.
종속성을 설치합니다.
gem install pg
코드에서 REST API 및 서비스 커넥터 서비스가 추가한 환경 변수의 PostgreSQL 연결 정보를 사용하여 액세스 토큰을 가져옵니다. 이들을 결합하여 연결을 설정합니다. 아래 코드를 사용하는 경우 사용하려는 인증 유형에 대한 코드 조각 부분의 주석 처리를 제거합니다.
App Service 및 Container Apps는 관리 ID에 대한 토큰을 검색할 수 있는 내부적으로 액세스 가능한 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,
)
다음으로, 서비스 커넥터를 사용하기 전에 PostgreSQL 유연한 서버에서 테이블 및 시퀀스를 만든 경우 소유자로 연결하고 서비스 커넥터에서 만든 <aad-username>에 사용 권한을 부여해야 합니다. 서비스 커넥터에 설정한 연결 문자열 또는 구성의 사용자 이름은 aad_<connection name>과 같습니다. Azure Portal을 사용하는 경우 Service Type 열 옆에 있는 확장 단추를 선택하고 값을 가져옵니다. Azure CLI를 사용하는 경우 CLI 명령 출력에서 configurations를 확인합니다.
그런 다음 쿼리를 실행하여 사용 권한을 부여합니다.
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와 같은 클라이언트 라이브러리를 사용하여 관리 ID 또는 서비스 주체에 대한 액세스 토큰을 가져올 수 있습니다. 그런 다음 액세스 토큰을 암호로 사용하여 데이터베이스에 연결할 수 있습니다. 아래 코드를 사용하는 경우 사용하려는 인증 유형에 대한 코드 조각 부분의 주석 처리를 제거합니다.
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 데이터베이스 정보를 가져옵니다. 이전 단계에서 얻은 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 SQL Database 연결 문자열을 가져옵니다.
using Microsoft.Data.SqlClient;
string connectionString =
Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING")!;
using var connection = new SqlConnection(connectionString);
connection.Open();
서비스 커넥터에서 추가한 환경 변수에서 Azure SQL Database 연결 문자열을 가져옵니다.
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();
}
}
}
Spring 애플리케이션의 경우 --client-type springboot 옵션을 사용하여 연결을 만드는 경우 서비스 커넥터는 값 형식이 jdbc:sqlserver://<sql-server>.database.windows.net:1433;databaseName=<sql-db>;authentication=ActiveDirectoryMSI;인 spring.datasource.url 속성을 Azure Spring Apps로 설정합니다.
서비스 커넥터가 추가한 환경 변수에서 Azure SQL Database 연결 구성을 가져옵니다. 아래 코드를 사용하는 경우 사용하려는 인증 유형에 대한 코드 조각 부분의 주석 처리를 제거합니다. Azure Container Apps를 컴퓨팅 서비스로 사용하고 있거나 코드 조각의 연결 문자열이 작동하지 않는 경우 Azure SQL Database에서 암호 없는 연결을 사용하도록 Python 애플리케이션 마이그레이션을 참조하여 액세스 토큰을 사용해 Azure SQL Database에 연결합니다.
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 연결 구성을 가져옵니다. 아래 코드를 사용하는 경우 사용하려는 인증 유형에 대한 코드 조각 부분의 주석 처리를 제거합니다.
Azure CLI 로그인 사용자를 데이터베이스 서버 Microsoft Entra 관리자로 추가하는 데 필요
Permission
연산
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 인증 사용자가 이미 SQL 서버의 Active Directory 관리자인 경우 Microsoft.Sql/servers/administrators/write 권한이 필요하지 않습니다.
Microsoft Entra ID
ERROR: AADSTS530003: Your device is required to be managed to access this resource. 오류가 발생하면 IT 부서에 이 디바이스를 Microsoft Entra ID에 조인하는 방법에 대해 지원을 요청하세요. 자세한 내용은 Microsoft Entra 조인 디바이스를 참조하세요.
서비스 커넥터는 계정의 정보와 호스팅 서비스의 관리 ID를 가져오려면 Microsoft Entra ID에 액세스해야 합니다. 다음 명령을 사용하여 디바이스가 Microsoft Entra ID에 액세스할 수 있는지 확인할 수 있습니다.
az ad signed-in-user show
대화형으로 로그인하지 않은 경우 오류와 Interactive authentication is needed가 표시될 수도 있습니다. 오류를 해결하려면 az login 명령을 사용하여 로그인합니다.
네트워크 연결
데이터베이스 서버가 Virtual Network에 있는 경우 Azure CLI 명령을 실행하는 환경이 Virtual Network의 서버에 액세스할 수 있는지 확인합니다.
데이터베이스 서버가 Virtual Network에 있는 경우 Azure CLI 명령을 실행하는 환경이 Virtual Network의 서버에 액세스할 수 있는지 확인합니다.
데이터베이스 서버에서 공용 액세스를 허용하지 않는 경우 Azure CLI 명령을 실행하는 환경이 프라이빗 엔드포인트를 통해 서버에 액세스할 수 있는지 확인합니다.