다음을 통해 공유


온-프레미스에서 호스트되는 Go 앱에서 Azure 리소스에 인증

Azure 외부(예: 온-프레미스 또는 타사 데이터 센터)에서 호스트되는 앱은 Azure 리소스에 액세스할 때 애플리케이션 서비스 주체를 사용하여 Azure에 인증해야 합니다. 애플리케이션 서비스 주체 개체는 Azure에서 앱 등록 프로세스를 사용하여 만들어집니다. 애플리케이션 서비스 주체가 만들어지면 앱에 대한 클라이언트 ID 및 클라이언트 암호가 생성됩니다. 클라이언트 ID, 클라이언트 암호 및 테넌트 ID는 환경 변수에 저장되므로 Azure SDK for Go에서 런타임에 Azure에 앱을 인증하는 데 사용할 수 있습니다.

앱이 호스트되는 각 환경에 대해 다른 앱 등록을 만들어야 합니다. 이렇게 하면 각 서비스 주체에 대해 환경별 리소스 권한을 구성할 수 있으며, 한 환경에 배포된 앱이 다른 환경의 일부인 Azure 리소스와 통신하지 않도록 합니다.

1 - Azure에서 애플리케이션 등록

Azure Portal 또는 Azure CLI를 사용하여 Azure에 앱을 등록할 수 있습니다.

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에서 역할을 할당하기 위해 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_IDAZURE_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 코드가 있을 경우, 다음을 수행하세요.

  1. azidentity 패키지를 가져옵니다.
  2. DefaultAzureCredential 형식의 인스턴스를 만듭니다.
  3. 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_IDAZURE_CLIENT_SECRET 환경 변수를 읽습니다.