개발자 계정을 사용하여 로컬 개발 중에 Azure 서비스에 Go 앱 인증
개발자는 클라우드 애플리케이션을 만들 때 일반적으로 로컬 워크스테이션에서 애플리케이션을 디버그하고 테스트합니다. 애플리케이션이 로컬 개발 중에 개발자의 워크스테이션에서 실행되는 경우에도 앱에서 사용하는 모든 Azure 서비스에 인증해야 합니다. 이 문서에서는 로컬 개발 중에 개발자의 Azure 자격 증명을 사용하여 Azure에 앱을 인증하는 방법을 설명합니다.
개발자의 Azure 자격 증명을 사용하여 로컬 개발 중에 Azure에 인증하려면 개발자가 Azure CLI 또는 Azure 개발자 CLI에서 Azure에 로그인해야 합니다. Azure SDK for Go는 개발자가 이러한 도구 중 하나에서 로그인한 것을 감지한 다음 자격 증명 캐시에서 필요한 자격 증명을 가져와서 로그인한 사용자로 Azure에 앱을 인증할 수 있습니다.
이 방법은 개발자의 기존 Azure 계정을 활용하기 때문에 개발 팀에 대해 설정하는 것이 가장 쉽습니다. 그러나 개발자의 계정에는 애플리케이션에 필요한 것보다 더 많은 권한이 있을 수 있으므로 프로덕션 환경에서 앱이 실행할 권한을 초과할 수 있습니다. 또는 로컬 개발중에 사용할 애플리케이션 서비스 주체를
1 - 로컬 개발을 위한 Microsoft Entra 보안 그룹 만들기
애플리케이션에서 작업하는 개발자는 거의 항상 여러 명이므로 먼저 Microsoft Entra 보안 그룹을 만들어 앱이 로컬 개발에 필요한 역할(권한)을 캡슐화하는 것이 좋습니다. 이 방법은 다음과 같은 이점을 제공합니다.
- 모든 개발자는 역할이 그룹 수준에서 할당되므로 동일한 역할을 보장받습니다.
- 앱에 새 역할이 필요한 경우 앱에 대한 Microsoft Entra 그룹에만 추가하면 됩니다.
- 새 개발자가 팀에 합류하는 경우 앱에서 작업할 수 있는 올바른 권한을 얻으려면 올바른 Microsoft Entra 그룹에 추가하기만 하면 됩니다.
개발 팀을 위한 기존 Microsoft Entra 보안 그룹이 있는 경우 해당 그룹을 사용할 수 있습니다. 그렇지 않은 경우 다음 단계를 완료하여 Microsoft Entra 보안 그룹을 만듭니다.
az ad group create 명령은 Microsoft Entra ID에서 그룹을 만드는 데 사용됩니다.
--display-name
및 --main-nickname
매개 변수가 필요합니다. 그룹에 지정된 이름은 애플리케이션의 이름을 기반으로 해야 합니다. 그룹의 용도를 나타내기 위해 그룹 이름에 'local-dev'와 같은 구를 포함하는 것도 유용합니다.
az ad group create \
--display-name MyDisplay \
--mail-nickname MyDisplay \
--description "<group-description>"
명령의 출력에서 id
속성 값을 복사합니다. 그룹의 개체 ID입니다. 이후 단계에서 필요합니다.
az ad group show 명령을 사용하여 이 속성을 검색할 수도 있습니다.
그룹에 구성원을 추가하려면 Azure 사용자의 개체 ID가 필요합니다.
az ad user list을 사용하여 사용 가능한 서비스 주체 계정을 나열합니다.
--filter
매개 변수 명령은 OData 스타일 필터를 허용하며 표시된 대로 사용자의 표시 이름에 있는 목록을 필터링하는 데 사용할 수 있습니다.
--query
매개 변수는 출력을 관심 있는 열로 제한합니다.
az ad user list \
--filter "startswith(displayName, 'Bob')" \
--query "[].{objectId:id, displayName:displayName}" \
--output table
그룹에 멤버를 추가하려면 az ad group member add 명령을 사용할 수 있습니다.
az ad group member add \
--group <group-name> \
--member-id <object-id>
메모
기본적으로 Microsoft Entra 보안 그룹 만들기는 디렉터리의 특정 권한 있는 역할로 제한됩니다. 그룹을 만들 수 없는 경우 디렉터리의 관리자에게 연락하세요. 기존 그룹에 구성원을 추가할 수 없는 경우 그룹 소유자 또는 디렉터리 관리자에게 문의하세요. 자세한 내용은 Microsoft Entra 그룹과 그룹 구성원 관리을 참조하세요.
2 - Microsoft Entra 그룹에 역할 할당
다음으로, 앱이 어떤 리소스에 필요한 역할(권한)을 결정하고 해당 역할을 앱에 할당해야 합니다. 이 예제에서는 1단계에서 만든 Microsoft Entra 그룹에 역할이 할당됩니다. 역할은 리소스, 리소스 그룹 또는 구독 범위에서 할당할 수 있습니다. 이 예제에서는 대부분의 애플리케이션이 모든 Azure 리소스를 단일 리소스 그룹으로 그룹화하기 때문에 리소스 그룹 범위에서 역할을 할당하는 방법을 보여 줍니다.
사용자, 그룹 또는 애플리케이션 서비스 주체는 az role assignment create 명령을 사용하여 Azure에서 역할이 할당됩니다. 해당 개체 ID를 사용하여 그룹을 지정할 수 있습니다.
az role assignment create --assignee <objectId> \
--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가
az role assignment create --assignee bbbbbbbb-1111-2222-3333-cccccccccccc \
--scope /subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/msdocs-go-sdk-auth-example \
--role "Storage Blob Data Contributor"
Azure CLI를 사용하여 리소스 또는 구독 수준에서 권한을 할당하는 방법에 대한 자세한 내용은 Azure CLI사용하여 Azure 역할 할당
3 - Azure CLI 또는 Azure 개발자 CLI를 사용하여 Azure에 로그인
4 - 애플리케이션에서 DefaultAzureCredential 구현
Azure에 Azure SDK 클라이언트 개체를 인증하려면 애플리케이션에서 DefaultAzureCredential
클래스를 사용해야 합니다. 이 시나리오에서 DefaultAzureCredential
개발자가 Azure CLI 또는 Azure 개발자 CLI를 사용하여 Azure에 로그인했는지 순차적으로 확인합니다. 개발자가 이러한 도구 중 하나를 사용하여 Azure에 로그인하는 경우 도구에 로그인하는 데 사용되는 자격 증명은 앱에서 Azure에 인증하는 데 사용됩니다.
먼저 애플리케이션에 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>)
}