온-프레미스에서 호스트되는 Go 앱에서 Azure 리소스에 인증
Azure 외부(예: 온-프레미스 또는 타사 데이터 센터)에서 호스트되는 앱은 Azure 리소스에 액세스할 때 애플리케이션 서비스 주체를 사용하여 Azure에 인증해야 합니다. 애플리케이션 서비스 주체 개체는 Azure에서 앱 등록 프로세스를 사용하여 만들어집니다. 애플리케이션 서비스 주체가 만들어지면 앱에 대한 클라이언트 ID 및 클라이언트 암호가 생성됩니다. 클라이언트 ID, 클라이언트 암호 및 테넌트 ID는 환경 변수에 저장되므로 Azure SDK for Go에서 런타임에 Azure에 앱을 인증하는 데 사용할 수 있습니다.
앱이 호스트되는 각 환경에 대해 다른 앱 등록을 만들어야 합니다. 이렇게 하면 각 서비스 주체에 대해 환경별 리소스 권한을 구성할 수 있으며, 한 환경에 배포된 앱이 다른 환경의 일부인 Azure 리소스와 통신하지 않도록 합니다.
1 - Azure에서 애플리케이션 등록
Azure Portal 또는 Azure CLI를 사용하여 Azure에 앱을 등록할 수 있습니다.
- Azure CLI
-
Azure Portal
az ad sp create-for-rbac --name <app-name>
명령의 출력은 다음과 유사합니다. 다음 단계에서 이러한 값이 필요하고 암호(클라이언트 암호) 값을 다시 볼 수 없으므로 이러한 값을 기록하거나 이 창을 열어 둡니다.
{
"appId": "00001111-aaaa-2222-bbbb-3333cccc4444",
"displayName": "msdocs-python-sdk-auth-prod",
"password": "Ee5Ff~6Gg7.-Hh8Ii9Jj0Kk1Ll2Mm3_Nn4Oo5Pp6",
"tenant": "aaaabbbb-0000-cccc-1111-dddd2222eeee"
}
2 - 애플리케이션 서비스 주체에 역할 할당
다음으로, 앱이 어떤 리소스에 필요한 역할(권한)을 결정하고 해당 역할을 앱에 할당해야 합니다. 역할은 리소스, 리소스 그룹 또는 구독 범위에서 할당될 수 있습니다. 이 예제에서는 대부분의 애플리케이션이 모든 Azure 리소스를 단일 리소스 그룹으로 그룹화하기 때문에 리소스 그룹 범위에서 서비스 주체에 대한 역할을 할당하는 방법을 보여 줍니다.
- Azure CLI
-
Azure 포털
서비스 주체에 Azure에서 역할을 할당하기 위해 az role assignment create 명령이 사용됩니다.
az role assignment create --assignee {appId} \
--scope /subscriptions/{subscriptionId}/resourceGroups/{resourceGroupName} \
--role "{roleName}"
서비스 주체에 할당할 수 있는 역할의 이름을 얻으려면 az role definition list 명령을 사용합니다.
az role definition list \
--query "sort_by([].{roleName:roleName, description:description}, &roleName)" \
--output table
예를 들어, 앱 ID가 00001111-aaaa-2222-bbbb-3333cccc4444
인 서비스 주체에게 ID aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e
을(를) 가진 구독의 msdocs-go-sdk-auth-example 리소스 그룹 내 모든 스토리지 계정에서 Azure Storage Blob 컨테이너 및 데이터에 대한 읽기, 쓰기 및 삭제 권한을 부여하려면, 다음 명령을 사용하여 애플리케이션 서비스 주체를 Storage Blob 데이터 기여자 역할에 할당합니다.
az role assignment create --assignee 00001111-aaaa-2222-bbbb-3333cccc4444 \
--scope /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-go-sdk-auth-example \
--role "Storage Blob Data Contributor"
Azure CLI를 사용하여 리소스 또는 구독 수준에서 권한을 할당하는 방법에 대한 자세한 내용은 Azure CLI사용하여 Azure 역할 할당
3 - 애플리케이션에 대한 환경 변수 구성
Go 앱을 실행하는 프로세스에 대한 AZURE_CLIENT_ID
, AZURE_TENANT_ID
및 AZURE_CLIENT_SECRET
환경 변수를 설정하여 런타임에 앱에서 애플리케이션 서비스 주체 자격 증명을 사용할 수 있도록 해야 합니다.
DefaultAzureCredential
개체는 이러한 환경 변수에서 서비스 주체 정보를 찾습니다.
변수 이름 | 가치 |
---|---|
AZURE_CLIENT_ID |
Azure 서비스 주체의 애플리케이션 ID |
AZURE_TENANT_ID |
애플리케이션의 Microsoft Entra 테넌트 ID |
AZURE_CLIENT_SECRET |
Azure 서비스 주체의 암호 |
export AZURE_TENANT_ID="<active_directory_tenant_id>"
export AZURE_CLIENT_ID="<service_principal_appid>"
export AZURE_CLIENT_SECRET="<service_principal_password>"
4 - 애플리케이션에서 DefaultAzureCredential 구현
Azure에 Azure SDK 클라이언트 개체를 인증하려면 애플리케이션이 azidentity
패키지의 DefaultAzureCredential
형식을 사용해야 합니다.
먼저 애플리케이션에 azidentity
패키지를 추가합니다.
go get github.com/Azure/azure-sdk-for-go/sdk/azidentity
다음으로, 앱에서 Azure SDK 클라이언트를 인스턴스화하는 Go 코드가 있을 경우, 다음을 수행하세요.
-
azidentity
패키지를 가져옵니다. -
DefaultAzureCredential
형식의 인스턴스를 만듭니다. -
DefaultAzureCredential
형식의 인스턴스를 Azure SDK 클라이언트 생성자에 전달합니다.
이 예제는 다음 코드 세그먼트에 나와 있습니다.
import (
"context"
"github.com/Azure/azure-sdk-for-go/sdk/azidentity"
"github.com/Azure/azure-sdk-for-go/sdk/storage/azblob"
)
const (
account = "https://<replace_with_your_storage_account_name>.blob.core.windows.net/"
containerName = "sample-container"
blobName = "sample-blob"
sampleFile = "path/to/sample/file"
)
func main() {
// create a credential
cred, err := azidentity.NewDefaultAzureCredential(nil)
if err != nil {
// TODO: handle error
}
// create a client for the specified storage account
client, err := azblob.NewClient(account, cred, nil)
if err != nil {
// TODO: handle error
}
// TODO: perform some action with the azblob Client
// _, err = client.DownloadFile(context.TODO(), <containerName>, <blobName>, <target_file>, <DownloadFileOptions>)
}
위의 코드가 DefaultAzureCredential
을 인스턴스화하면, DefaultAzureCredential
은 Azure에 연결하기 위한 애플리케이션 서비스 주체 정보로 AZURE_TENANT_ID
, AZURE_CLIENT_ID
및 AZURE_CLIENT_SECRET
환경 변수를 읽습니다.