자습서: Azure CLI를 사용하여 Azure Container Apps에 Dapr 애플리케이션 배포

Dapr(Distributed Application Runtime)은 개발자가 복원력 있고 신뢰할 수 있는 마이크로 서비스를 빌드하는 데 도움이 됩니다. 이 자습서에서는 샘플 Dapr 애플리케이션이 Azure Container Apps에 배포됩니다.

다음 방법에 대해 설명합니다.

  • 컨테이너 앱의 Container Apps 환경 만들기
  • 컨테이너 앱의 Azure Blob Storage 상태 저장소 만들기
  • 메시지를 생성 및 사용하고 상태 저장소에 유지하는 두 개의 앱 배포
  • 두 마이크로 서비스 간의 상호 작용을 확인합니다.

Azure Container Apps를 사용하면 마이크로 서비스를 빌드할 때 완전 관리형 버전의 Dapr API를 얻을 수 있습니다. Azure Container Apps에서 Dapr을 사용하는 경우 다양한 기능을 제공하는 사이드카를 마이크로 서비스와 나란히 실행할 수 있습니다. 사용 가능한 Dapr API에는 서비스 간 호출, Pub/Sub, 이벤트 바인딩, 상태 저장소작업자가 포함됩니다.

이 자습서에서는 Dapr Hello World 빠른 시작에서 동일한 애플리케이션을 배포합니다.

애플리케이션은 다음과 같이 구성되어 있습니다.

  • 메시지를 생성하는 클라이언트(Python) 컨테이너 앱.
  • 상태 저장소에서 해당 메시지를 사용하고 유지하는 서비스(노드) 컨테이너 앱

다음 아키텍처 다이어그램에서는 이 자습서를 구성하는 구성 요소를 보여줍니다.

Architecture diagram for Dapr Hello World microservices on Azure Container Apps

설정

시작하려면 Azure에 로그인합니다. 다음 명령을 실행하고 프롬프트에 따라 인증 프로세스를 완료합니다.

az login

다음으로, CLI용 Azure Container Apps 확장을 설치합니다.

az extension add --name containerapp --upgrade

현재 확장 또는 모듈이 설치되었으므로 Microsoft.App 네임스페이스를 등록합니다.

참고 항목

Azure Container Apps 리소스가 Microsoft.Web 네임스페이스에서 Microsoft.App 네임스페이스로 마이그레이션되었습니다. 자세한 내용은 2022년 3월 Microsoft.Web에서 Microsoft.App으로 네임스페이스 마이그레이션을 참조하세요.

az provider register --namespace Microsoft.App

이전에 사용한 적이 없는 경우 Azure Monitor Log Analytics 작업 영역에 대한 Microsoft.OperationalInsights 공급자를 등록합니다.

az provider register --namespace Microsoft.OperationalInsights

다음으로, 다음 환경 변수를 설정합니다.

RESOURCE_GROUP="my-container-apps"
LOCATION="canadacentral"
CONTAINERAPPS_ENVIRONMENT="my-environment"

이러한 변수를 정의하면 리소스 그룹을 만들어 새 컨테이너 앱과 관련된 서비스를 구성할 수 있습니다.

az group create \
  --name $RESOURCE_GROUP \
  --location $LOCATION

CLI가 업그레이드되고 새 리소스 그룹이 사용 가능해지면 컨테이너 앱 환경을 만들고 컨테이너 앱을 배포할 수 있습니다.

환경 만들기

Azure Container Apps의 환경은 컨테이너 앱 그룹 주위에 보안 경계를 만듭니다. 동일한 환경에 배포된 컨테이너 앱은 동일한 가상 네트워크에 배포되고 동일한 Log Analytics 작업 영역에 로그를 씁니다.


개별 컨테이너 앱은 Azure Container Apps 환경에 배포됩니다. 환경을 만들려면 다음 명령을 실행합니다.

az containerapp env create \
  --name $CONTAINERAPPS_ENVIRONMENT \
  --resource-group $RESOURCE_GROUP \
  --location "$LOCATION"

상태 저장소 설정

Azure Blob Storage 계정 만들기

배포된 환경에서 다음 단계는 마이크로 서비스 중 하나에서 데이터를 저장하는 데 사용되는 Azure Blob Storage 계정을 배포하는 것입니다. 서비스를 배포하기 전에 스토리지 계정의 이름을 선택해야 합니다. Storage 계정 이름은 Azure 내에서 고유하고, 길이가 3자에서 24자 사이여야 하며, 숫자 및 소문자만 포함해야 합니다.

STORAGE_ACCOUNT_NAME="<storage account name>"

다음 명령을 사용하여 Azure Storage 계정을 만듭니다.

az storage account create \
  --name $STORAGE_ACCOUNT_NAME \
  --resource-group $RESOURCE_GROUP \
  --location "$LOCATION" \
  --sku Standard_RAGRS \
  --kind StorageV2

노드 앱에 대한 사용자 할당 ID 구성

Container Apps는 사용자 할당 및 시스템 할당 관리 ID를 모두 지원하지만 사용자 할당 ID는 Blob Storage 계정에 액세스할 수 있는 권한을 Dapr 지원 노드 앱에 제공합니다.

  1. 사용자 할당 ID를 만듭니다.
az identity create --resource-group $RESOURCE_GROUP --name "nodeAppIdentity" --output json

principalIdid 속성을 검색하고 변수에 저장합니다.

PRINCIPAL_ID=$(az identity show -n "nodeAppIdentity" --resource-group $RESOURCE_GROUP --query principalId | tr -d \")
IDENTITY_ID=$(az identity show -n "nodeAppIdentity" --resource-group $RESOURCE_GROUP --query id | tr -d \")
CLIENT_ID=$(az identity show -n "nodeAppIdentity" --resource-group $RESOURCE_GROUP --query clientId | tr -d \")
  1. Storage Blob Data Contributor 역할을 사용자 할당 ID에 할당합니다.

현재 구독에 대한 구독 ID를 검색합니다.

SUBSCRIPTION_ID=$(az account show --query id --output tsv)
az role assignment create --assignee $PRINCIPAL_ID  \
--role "Storage Blob Data Contributor" \
--scope "/subscriptions/$SUBSCRIPTION_ID/resourceGroups/$RESOURCE_GROUP/providers/Microsoft.Storage/storageAccounts/$STORAGE_ACCOUNT_NAME"

상태 저장소 구성 요소 구성

Dapr을 통해 외부 리소스에 인증하는 방법에는 여러 가지가 있습니다. 이 예제에서는 런타임에 Dapr 비밀 API를 사용하지 않고 Azure 기반 상태 저장소를 사용합니다. 따라서 비밀 저장소 구성 요소를 만드는 대신 관리 ID를 사용하여 노드 앱에서 Blob 저장소로 직접 액세스할 수 있습니다. 런타임에 비 Azure 상태 저장소 또는 Dapr 비밀 API를 사용하려는 경우 비밀 저장소 구성 요소를 만들 수 있습니다. 이 구성 요소는 런타임 시 비밀을 참조할 수 있도록 런타임 비밀을 로드합니다.

텍스트 편집기를 열고 이전 단계에서 가져온 속성을 사용하여 statestore.yaml이라는 구성 파일을 만듭니다. 이 파일을 사용하면 Dapr 앱이 상태 저장소에 액세스할 수 있습니다. 다음 예제에서는 statestore.yaml 파일이 Azure Blob Storage 계정에 대해 구성될 경우 어떻게 표시되는지 보여줍니다.

# statestore.yaml for Azure Blob storage component
componentType: state.azure.blobstorage
version: v1
metadata:
  - name: accountName
    value: "<STORAGE_ACCOUNT_NAME>"
  - name: containerName
    value: mycontainer
  - name: azureClientId
    value: "<MANAGED_IDENTITY_CLIENT_ID>"
scopes:
  - nodeapp

이 파일을 사용하려면 자리 표시자를 업데이트합니다.

  • <STORAGE_ACCOUNT_NAME>를 정의한 변수의 STORAGE_ACCOUNT_NAME 값으로 바꿉니다. 해당 값을 가져오려면 다음 명령을 실행합니다.
echo $STORAGE_ACCOUNT_NAME
  • <MANAGED_IDENTITY_CLIENT_ID>를 정의한 변수의 CLIENT_ID 값으로 바꿉니다. 해당 값을 가져오려면 다음 명령을 실행합니다.
echo $CLIENT_ID

구성 요소 yaml 파일을 저장한 디렉터리로 이동하고 다음 명령을 실행하여 Container Apps 환경에서 Dapr 구성 요소를 구성합니다. Dapr 구성 요소를 구성하는 방법에 대한 자세한 내용은 Dapr 구성 요소 구성을 참조하세요.

az containerapp env dapr-component set \
    --name $CONTAINERAPPS_ENVIRONMENT --resource-group $RESOURCE_GROUP \
    --dapr-component-name statestore \
    --yaml statestore.yaml

서비스 애플리케이션(HTTP 웹 서버) 배포

az containerapp create \
  --name nodeapp \
  --resource-group $RESOURCE_GROUP \
  --user-assigned $IDENTITY_ID \
  --environment $CONTAINERAPPS_ENVIRONMENT \
  --image dapriosamples/hello-k8s-node:latest \
  --min-replicas 1 \
  --max-replicas 1 \
  --enable-dapr \
  --dapr-app-id nodeapp \
  --dapr-app-port 3000 \
  --env-vars 'APP_PORT=3000'

기본적으로 이미지는 Docker Hub에서 가져옵니다.

클라이언트 애플리케이션(헤드리스 클라이언트) 배포

다음 명령을 실행하여 클라이언트 컨테이너 앱을 배포합니다.

az containerapp create \
  --name pythonapp \
  --resource-group $RESOURCE_GROUP \
  --environment $CONTAINERAPPS_ENVIRONMENT \
  --image dapriosamples/hello-k8s-python:latest \
  --min-replicas 1 \
  --max-replicas 1 \
  --enable-dapr \
  --dapr-app-id pythonapp

결과 확인

성공적인 상태 지속성 확인

Azure Storage 계정의 데이터를 확인하여 서비스가 올바르게 작동하는지 확인할 수 있습니다.

  1. 브라우저에서 Azure Portal을 열고 스토리지 계정으로 이동합니다.

  2. 컨테이너 왼쪽 메뉴를 선택합니다.

  3. mycontainer를 선택합니다.

  4. 컨테이너에서 order라는 파일을 볼 수 있는지 확인합니다.

  5. 파일 선택.

  6. 편집 탭을 선택합니다.

  7. 새로 고침 단추를 선택하여 데이터가 자동으로 업데이트되는 방식을 관찰합니다.

로그 보기

컨테이너 앱의 로그는 Log Analytics 작업 영역의 ContainerAppConsoleLogs_CL 사용자 지정 테이블에 저장됩니다. Azure Portal 또는 CLI를 통해 로그를 볼 수 있습니다. 처음에는 테이블이 작업 영역에 표시되는 데 약간의 지연이 있을 수 있습니다.

다음 CLI 명령을 통해 명령줄을 사용하여 로그를 봅니다.

LOG_ANALYTICS_WORKSPACE_CLIENT_ID=`az containerapp env show --name $CONTAINERAPPS_ENVIRONMENT --resource-group $RESOURCE_GROUP --query properties.appLogsConfiguration.logAnalyticsConfiguration.customerId --out tsv`

az monitor log-analytics query \
  --workspace $LOG_ANALYTICS_WORKSPACE_CLIENT_ID \
  --analytics-query "ContainerAppConsoleLogs_CL | where ContainerAppName_s == 'nodeapp' and (Log_s contains 'persisted' or Log_s contains 'order') | project ContainerAppName_s, Log_s, TimeGenerated | sort by TimeGenerated | take 5" \
  --out table

다음 출력은 CLI 명령에서 예상되는 응답 형식을 보여 줍니다.

ContainerAppName_s    Log_s                            TableName      TimeGenerated
--------------------  -------------------------------  -------------  ------------------------
nodeapp               Got a new order! Order ID: 61    PrimaryResult  2021-10-22T21:31:46.184Z
nodeapp               Successfully persisted state.    PrimaryResult  2021-10-22T21:31:46.184Z
nodeapp               Got a new order! Order ID: 62    PrimaryResult  2021-10-22T22:01:57.174Z
nodeapp               Successfully persisted state.    PrimaryResult  2021-10-22T22:01:57.174Z
nodeapp               Got a new order! Order ID: 63    PrimaryResult  2021-10-22T22:45:44.618Z

리소스 정리

축하합니다! 이 자습서를 완료했습니다. 이 연습의 일부로 만든 리소스를 삭제하려면 다음 명령을 실행합니다.

주의

이 명령은 지정된 리소스 그룹과 그 안에 포함된 모든 리소스를 삭제합니다. 지정된 리소스 그룹에 이 자습서의 범위에 속하지 않는 리소스가 포함된 경우 해당 리소스도 삭제됩니다.

az group delete --resource-group $RESOURCE_GROUP

참고 항목

pythonapp은 구성된 상태 저장소에 유지되는 메시지를 사용하여 nodeapp을 지속적으로 호출하므로 지속적인 청구 가능 작업을 방지하려면 이러한 정리 단계를 완료하는 것이 중요합니다.

문제가 있나요? Azure Container Apps 리포지토리에서 문제를 열어 GitHub에 알려주세요.

다음 단계