CLI 참조 명령을 로컬에서 실행하려면 Azure CLI를 설치합니다. Windows 또는 macOS에서 실행 중인 경우 Docker 컨테이너에서 Azure CLI를 실행하는 것이 좋습니다. 자세한 내용은 Docker 컨테이너에서 Azure CLI를 실행하는 방법을 참조하세요.
로컬 설치를 사용하는 경우 az login 명령을 사용하여 Azure CLI에 로그인합니다. 인증 프로세스를 완료하려면 터미널에 표시되는 단계를 수행합니다. 다른 로그인 옵션은 Azure CLI를 사용하여 로그인을 참조하세요.
메시지가 표시되면 처음 사용할 때 Azure CLI 확장을 설치합니다. 확장에 대한 자세한 내용은 Azure CLI에서 확장 사용을 참조하세요.
az extension add --name serviceconnector-passwordless --upgrade
참고 항목
az version을 실행하여 확장 "serviceconnector-passwordless" 버전이 "2.0.2" 이상인지 확인하세요. 확장 버전을 업그레이드하려면 먼저 Azure CLI를 업그레이드해야 할 수 있습니다.
2. 암호 없는 연결 만들기
다음으로, 서비스 커넥터를 사용하여 암호 없는 연결을 만듭니다.
팁
Azure Portal은 아래 명령을 작성하는 데 도움이 될 수 있습니다. Azure Portal에서 Azure App Service 리소스로 이동하고, 왼쪽 메뉴에서 서비스 커넥터를 선택하고, 만들기를 선택합니다. 필요한 모든 매개 변수로 양식을 작성합니다. Azure는 CLI에서 사용하거나 Azure Cloud Shell에서 실행하도록 복사할 수 있는 연결 만들기 명령을 자동으로 생성합니다.
다음으로, 서비스 커넥터를 사용하기 전에 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
이 서비스 커넥터 명령은 백그라운드에서 다음 작업을 완료합니다.
시스템 할당 관리 ID를 사용하도록 설정하거나 Azure App Service에서 호스트하는 앱 <server-name>의 사용자 ID를 할당합니다.
Microsoft Entra 관리자를 현재 로그인한 사용자로 설정합니다.
시스템 할당 관리 ID 또는 사용자 할당 관리 ID에 대한 데이터베이스 사용자를 추가합니다. 이 사용자에게 데이터베이스 <database-name>의 모든 권한을 부여합니다. 사용자 이름은 이전 명령 출력의 연결 문자열에서 찾을 수 있습니다.
AZURE_MYSQL_CONNECTIONSTRING, AZURE_POSTGRESQL_CONNECTIONSTRING 또는 AZURE_SQL_CONNECTIONSTRING이라는 구성을 데이터베이스 유형에 기반한 Azure 리소스로 설정합니다.
서비스 커넥터에서 추가한 환경 변수에서 Azure SQL Database 연결 문자열을 가져옵니다.
using Microsoft.Data.SqlClient;
// AZURE_SQL_CONNECTIONSTRING should be one of the following:
// For system-assigned managed identity:"Server=tcp:<server-name>.database.windows.net;Database=<database-name>;Authentication=Active Directory Default;TrustServerCertificate=True"
// For user-assigned managed identity: "Server=tcp:<server-name>.database.windows.net;Database=<database-name>;Authentication=Active Directory Default;User Id=<client-id-of-user-assigned-identity>;TrustServerCertificate=True"
string connectionString =
Environment.GetEnvironmentVariable("AZURE_SQL_CONNECTIONSTRING")!;
using var connection = new SqlConnection(connectionString);
connection.Open();
서비스 커넥터가 추가한 환경 변수에서 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') # The value should be 'ActiveDirectoryMsi'
# Uncomment the following lines according to the authentication type.
# For system-assigned managed identity.
# connString = f'Driver={{ODBC Driver 18 for SQL Server}};Server={server},{port};Database={database};Authentication={authentication};Encrypt=yes;'
# For user-assigned managed identity.
# client_id = os.getenv('AZURE_SQL_USER')
# connString = f'Driver={{ODBC Driver 18 for SQL Server}};Server={server},{port};Database={database};UID={client_id};Authentication={authentication};Encrypt=yes;'
conn = pyodbc.connect(connString)
코드에서 Azure Database for MySQL에 대한 연결은 모든 언어 스택에 대해 DefaultAzureCredential 패턴을 따릅니다. DefaultAzureCredential은 개발 환경과 Azure 환경 모두에 적응할 수 있을 만큼 충분히 유연합니다. 로컬에서 실행할 때 선택한 환경(Visual Studio, Visual Studio Code, Azure CLI 또는 Azure PowerShell)에서 로그인한 Azure 사용자를 검색할 수 있습니다. Azure에서 실행할 때 관리 ID를 검색합니다. 따라서 개발 시와 프로덕션에서 모두 데이터베이스에 연결할 수 있습니다. 패턴은 다음과 같습니다.
Azure ID 클라이언트 라이브러리에서 DefaultAzureCredential을 인스턴스화합니다. 사용자 할당 ID를 사용하는 경우 해당 ID의 클라이언트 ID를 할당합니다.
Azure Database for MySQL에 대한 액세스 토큰을 가져옵니다. https://ossrdbms-aad.database.windows.net/.default.
.NET의 경우 Azure.Identity와 같은 클라이언트 라이브러리를 사용하여 관리 ID에 대한 액세스 토큰을 가져옵니다. 그런 다음 액세스 토큰을 암호로 사용하여 데이터베이스에 연결합니다. 아래 코드를 사용하는 경우 사용하려는 인증 유형에 해당하는 코드 조각 부분의 주석 처리를 제거해야 합니다.
using Azure.Core;
using Azure.Identity;
using MySqlConnector;
// Uncomment the following lines according to the authentication type.
// 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");
// });
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
코드에서 Azure Database for PostgreSQL에 대한 연결은 모든 언어 스택에 대해 DefaultAzureCredential 패턴을 따릅니다. DefaultAzureCredential은 개발 환경과 Azure 환경 모두에 적응할 수 있을 만큼 충분히 유연합니다. 로컬에서 실행할 때 선택한 환경(Visual Studio, Visual Studio Code, Azure CLI 또는 Azure PowerShell)에서 로그인한 Azure 사용자를 검색할 수 있습니다. Azure에서 실행할 때 관리 ID를 검색합니다. 따라서 개발 시와 프로덕션에서 모두 데이터베이스에 연결할 수 있습니다. 패턴은 다음과 같습니다.
Azure ID 클라이언트 라이브러리에서 DefaultAzureCredential을 인스턴스화합니다. 사용자 할당 ID를 사용하는 경우 해당 ID의 클라이언트 ID를 할당합니다.
Azure Database for PostgreSQL에 대한 액세스 토큰을 가져옵니다. https://ossrdbms-aad.database.windows.net/.default.
.NET의 경우 Azure.Identity와 같은 클라이언트 라이브러리를 사용하여 관리 ID에 대한 액세스 토큰을 가져옵니다. 그런 다음 액세스 토큰을 암호로 사용하여 데이터베이스에 연결합니다. 아래 코드를 사용하는 경우 사용하려는 인증 유형에 해당하는 코드 조각 부분의 주석 처리를 제거해야 합니다.
using Azure.Identity;
using Azure.Core;
using Npgsql;
// Uncomment the following lines according to the authentication type.
// For system-assigned identity.
// var sqlServerTokenProvider = new DefaultAzureCredential();
// For user-assigned identity.
// var sqlServerTokenProvider = new DefaultAzureCredential(
// new DefaultAzureCredentialOptions
// {
// ManagedIdentityClientId = Environment.GetEnvironmentVariable("AZURE_POSTGRESQL_CLIENTID");
// }
// );
// 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();
}
azure-identity 라이브러리에서 액세스 토큰으로 인증하고 토큰을 암호로 사용합니다. 서비스 커넥터에서 추가한 환경 변수에서 연결 정보를 가져옵니다. 아래 코드를 사용하는 경우 사용하려는 인증 유형에 해당하는 코드 조각 부분의 주석 처리를 제거해야 합니다.
from azure.identity import DefaultAzureCredential
import psycopg2
# Uncomment the following lines according to the authentication type.
# 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)
# 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)
코드에서 서비스 커넥터 서비스에서 추가한 환경 변수에서 @azure/identity 및 PostgreSQL 연결 정보를 통해 액세스 토큰을 가져옵니다. 이들을 결합하여 연결을 설정합니다. 아래 코드를 사용하는 경우 사용하려는 인증 유형에 해당하는 코드 조각 부분의 주석 처리를 제거해야 합니다.
import { DefaultAzureCredential, ClientSecretCredential } from "@azure/identity";
const { Client } = require('pg');
// Uncomment the following lines according to the authentication type.
// 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
// });
// 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();
})();
이 샘플 코드는 DefaultAzureCredential을 사용하여 Microsoft Entra ID에서 Azure 데이터베이스에 사용할 수 있는 토큰을 가져온 다음 데이터베이스 연결에 추가합니다. DefaultAzureCredential을 사용자 지정할 수 있지만 기본적으로 다양합니다. 개발 환경에서 로컬로 실행하는지 App Service에서 실행하는지에 따라 로그인한 Microsoft Entra 사용자 또는 관리 ID에서 토큰을 가져옵니다.
추가 변경 없이 코드를 Azure에서 실행할 준비가 되었습니다. 그러나 로컬에서 코드를 디버그하려면 개발 환경에 로그인한 Microsoft Entra 사용자가 필요합니다. 이 단계에서는 Microsoft Entra 사용자로 로그인하여 원하는 환경을 구성합니다.
Windows용 Visual Studio는 Microsoft Entra 인증과 통합됩니다. Visual Studio에서 개발 및 디버깅을 사용하도록 설정하려면 Visual Studio의 메뉴에서 파일>계정 설정을 선택하여 Microsoft Entra 사용자를 추가하고 로그인 또는 추가를 선택합니다.
Azure 서비스 인증의 Microsoft Entra 사용자를 설정하려면 메뉴에서 도구>옵션을 선택한 후 Azure 서비스 인증>계정 선택을 선택합니다. 추가한 Microsoft Entra 사용자를 선택하고 확인을 선택합니다.
Mac용 Visual Studio는 Microsoft Entra 인증과 통합되지 않습니다. 그러나 나중에 사용할 Azure ID 클라이언트 라이브러리도 Azure CLI에서 토큰을 검색할 수 있습니다. Visual Studio에서 개발 및 디버깅을 사용하려면 로컬 머신에 Azure CLI를 설치합니다.
Microsoft Entra 사용자를 사용하여 다음 명령으로 Azure CLI에 로그인합니다.
az login --allow-no-subscriptions
Visual Studio Code는 Azure 확장을 통해 Microsoft Entra 인증과 통합됩니다. Visual Studio Code에 Azure 도구 확장을 설치합니다.
Login failed for user '<token-identified principal>'. 오류가 발생합니다.
토큰을 요청하려는 관리 ID는 Azure 데이터베이스에 액세스할 수 있는 권한이 없습니다.
App Service 인증 또는 관련 앱 등록을 변경했습니다. 여전히 이전 토큰을 받는 이유는 무엇인가요?
또한 관리 ID의 백 엔드 서비스는 만료된 경우에만 대상 리소스에 대한 토큰을 업데이트하는 토큰 캐시를 유지 관리합니다. 앱에서 토큰을 얻으려고 시도한 후 구성을 수정하면 캐시된 토큰이 만료될 때까지 업데이트된 권한이 있는 새 토큰을 실제로 얻지 못합니다. 이 문제를 해결하려면 새로운 InPrivate(Edge)/private(Safari)/Incognito(Chrome) 창에서 변경 내용을 테스트하는 것이 가장 좋습니다. 그렇게 하면 인증된 새 세션에서 시작할 수 있습니다.
Microsoft Entra 그룹에 관리 ID를 추가하려면 어떻게 해야 하나요?
원하는 경우 ID를 Microsoft Entra 그룹에 추가한 다음 ID 대신 Microsoft Entra 그룹에 대한 액세스 권한을 부여할 수 있습니다. 예를 들어 다음 명령은 이전 단계의 관리 ID를 myAzureSQLDBAccessGroup이라는 새 그룹에 추가합니다.
groupid=$(az ad group create --display-name myAzureSQLDBAccessGroup --mail-nickname myAzureSQLDBAccessGroup --query objectId --output tsv)
msiobjectid=$(az webapp identity show --resource-group <group-name> --name <app-name> --query principalId --output tsv)
az ad group member add --group $groupid --member-id $msiobjectid
az ad group member list -g $groupid
Microsoft Entra 그룹에 대한 데이터베이스 권한을 부여하려면 해당 데이터베이스 형식에 대한 설명서를 참조하세요.
SSL connection is required. Please specify SSL options and retry 오류가 발생합니다.
Azure 데이터베이스에 연결하려면 추가 설정이 필요하며 이 자습서의 범위를 벗어납니다. 자세한 내용은 다음 링크 중 하나를 참조하세요.
웹앱 + 데이터베이스 템플릿을 사용하여 앱을 만들었는데 이제 서비스 커넥터 명령을 사용하여 관리 ID 연결을 구성할 수 없습니다.
서비스 커넥터는 앱 ID에 대한 액세스 권한을 부여하기 위해 데이터베이스에 대한 네트워크 액세스 권한이 필요합니다. 웹앱 + 데이터베이스 템플릿을 사용하여 Azure Portal에서 기본적으로 안전한 앱 및 데이터베이스 아키텍처를 만드는 경우 아키텍처는 데이터베이스에 대한 네트워크 액세스를 잠그고 가상 네트워크 내에서의 연결만 허용합니다. Azure Cloud Shell에도 마찬가지입니다. 그러나 가상 네트워크에 Cloud Shell을 배포한 다음, 해당 Cloud Shell에서 서비스 커넥터 명령을 실행할 수 있습니다.
다음 단계
학습한 내용은 다음과 같습니다.
Microsoft Entra 사용자를 Azure 데이터베이스의 관리자 권한으로 구성합니다.
Microsoft Entra 사용자로 데이터베이스에 연결합니다.
App Service 앱에 대해 시스템 할당 또는 사용자 할당 관리 ID를 구성합니다.
관리 ID에 대한 데이터베이스 액세스 권한을 부여합니다.
관리 ID를 사용하여 코드(.NET Framework 4.8, .NET 6, Node.js, Python, Java)에서 Azure 데이터베이스에 연결합니다.
Microsoft Entra 사용자를 사용하여 개발 환경에서 Azure 데이터베이스에 연결합니다.