다음을 통해 공유


빠른 시작: Azure CLI를 사용하여 Azure Container Apps에 Dapr 애플리케이션 배포

Dapr(Distributed Application Runtime)은 개발자가 복원력 있고 신뢰할 수 있는 마이크로 서비스를 빌드하는 데 도움이 됩니다. 이 빠른 시작에서는 Dapr 사이드카가 마이크로 서비스 컨테이너 앱과 함께 실행되도록 설정하는 방법을 알아봅니다. 다음 작업을 수행합니다.

  • 컨테이너 앱에 대한 Container Apps 환경 및 Azure Blog Storage 상태 저장소를 만듭니다.
  • 메시지를 게시하는 Python 컨테이너 앱을 배포합니다.
  • 메시지를 구독하고 상태 저장소에 유지하는 Node.js 컨테이너 앱을 배포합니다.
  • Azure Portal을 사용하여 두 마이크로 서비스 간의 상호 작용을 확인합니다.

Azure Container Apps의 Dapr Hello World 마이크로서비스에 대한 아키텍처 다이어그램

이 빠른 시작은 오픈 소스 Dapr 헬로 월드 빠른 시작에서 배포하는 애플리케이션을 미러링합니다.

설정

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.AppMicrosoft.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 계정 만들기

환경이 배포되면 Node.js 컨테이너 앱에서 데이터를 저장하는 데 사용되는 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 지원 Node.js 앱을 제공합니다.

  1. 사용자 할당 ID를 만듭니다.

    az identity create --resource-group $RESOURCE_GROUP --name "nodeAppIdentity"     --output json
    
  2. 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 \")
    
  3. 현재 구독에 대한 구독 ID를 검색합니다.

    SUBSCRIPTION_ID=$(az account show --query id --output tsv)
    
  4. Storage Blob Data Contributor 사용자 할당 ID에 역할을 할당합니다.

    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을 통해 외부 리소스에 인증하기 위한 여러 옵션이 있습니다. 이 예제에서는 Azure 기반 상태 저장소를 사용하므로 관리 ID를 사용하여 Node.js 앱에서 Blob 저장소로 직접 액세스할 수 있습니다.

  1. 텍스트 편집기에서 이전 단계에서 가져온 속성을 사용하여 statestore.yaml이라는 파일을 만듭니다.

    # 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
    

    이 파일을 사용하면 Dapr 앱이 상태 저장소에 액세스할 수 있습니다.

  2. yaml 파일을 저장한 디렉터리로 이동하고 다음 명령을 실행하여 Container Apps 환경에서 Dapr 구성 요소를 구성합니다.

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

Node.js 애플리케이션 배포

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에서 가져옵니다.

Python 애플리케이션 배포

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 계정의 데이터를 확인하여 서비스가 올바르게 작동하는지 확인할 수 있습니다.

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

  2. 왼쪽 메뉴에서 데이터 스토리지>컨테이너를 선택합니다.

  3. 컨테이너 앱을 선택합니다.

  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

리소스 정리

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

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

주의

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

az group delete --resource-group $RESOURCE_GROUP

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

다음 단계