자습서: 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) 컨테이너 앱.
- 상태 저장소에서 해당 메시지를 사용하고 유지하는 서비스(노드) 컨테이너 앱
다음 아키텍처 다이어그램에서는 이 자습서를 구성하는 구성 요소를 보여줍니다.
설정
CLI에서 Azure에 로그인하려면 다음 명령을 실행하고 프롬프트에 따라 인증 프로세스를 완료합니다.
az login
최신 버전의 CLI를 실행하고 있는지 확인하려면 업그레이드 명령을 실행합니다.
az upgrade
그런 다음 CLI용 Azure Container Apps 확장을 설치하거나 업데이트합니다.
Azure CLI에서 az containerapp
명령을 실행하거나 Azure PowerShell의 Az.App
모듈에서 cmdlet을 실행할 때 누락된 매개 변수에 대한 오류가 발생하는 경우 최신 버전의 Azure Container Apps 확장이 설치되어 있어야 합니다.
az extension add --name containerapp --upgrade
참고 항목
2024년 5월부터 Azure CLI 확장 기능은 기본적으로 미리 보기 기능을 사용하도록 설정하지 않습니다. Container Apps 미리 보기 기능에 액세스하려면 --allow-preview true
를 사용하여 Container Apps 확장을 설치합니다.
az extension add --name containerapp --upgrade --allow-preview true
이제 현재 확장 또는 모듈이 설치되었으므로 Microsoft.App
및 Microsoft.OperationalInsights
네임스페이스를 등록합니다.
az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights
환경 변수 설정
다음 환경 변수를 설정합니다. 값을 <PLACEHOLDERS>
다음 값으로 바꿉다.
RESOURCE_GROUP="<RESOURCE_GROUP>"
LOCATION="<LOCATION>"
CONTAINERAPPS_ENVIRONMENT="<CONTAINERAPPS_ENVIRONMENT>"
Azure 리소스 그룹 만들기
컨테이너 앱 배포와 관련된 서비스를 구성하는 리소스 그룹을 만듭니다.
az group create \
--name $RESOURCE_GROUP \
--location "$LOCATION"
환경 만들기
Azure Container Apps의 환경은 컨테이너 앱 그룹 주위에 보안 경계를 만듭니다. 동일한 환경에 배포된 컨테이너 앱은 동일한 가상 네트워크에 배포되고 동일한 Log Analytics 작업 영역에 로그를 씁니다.
환경을 만들려면 다음 명령을 실행합니다.
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 지원 노드 앱에 제공합니다.
- 사용자 할당 ID를 만듭니다.
az identity create --resource-group $RESOURCE_GROUP --name "nodeAppIdentity" --output json
principalId
및 id
속성을 검색하고 변수에 저장합니다.
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 \")
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'
Azure Container Registry를 사용하는 경우 명령에 --registry-server <REGISTRY_NAME>.azurecr.io
플래그를 포함합니다.
기본적으로 이미지는 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 Container Registry를 사용하는 경우 명령에 --registry-server <REGISTRY_NAME>.azurecr.io
플래그를 포함합니다.
결과 확인
성공적인 상태 지속성 확인
Azure Storage 계정의 데이터를 확인하여 서비스가 올바르게 작동하는지 확인할 수 있습니다.
브라우저에서 Azure Portal을 열고 스토리지 계정으로 이동합니다.
컨테이너 왼쪽 메뉴를 선택합니다.
mycontainer를 선택합니다.
컨테이너에서
order
라는 파일을 볼 수 있는지 확인합니다.파일 선택.
편집 탭을 선택합니다.
새로 고침 단추를 선택하여 데이터가 자동으로 업데이트되는 방식을 관찰합니다.
로그 보기
컨테이너 앱의 로그는 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에 알려주세요.