Share via


자습서: Azure Container Apps를 사용하여 백그라운드 처리 애플리케이션 배포

Azure Container Apps를 사용하면 퍼블릭 엔드포인트를 노출하지 않고도 애플리케이션을 배포할 수 있습니다. Container Apps 스케일링 규칙을 사용하여 Azure Storage 큐 길이에 따라 애플리케이션을 스케일 아웃 및 스케일 인할 수 있습니다. 큐에 메시지가 없으면 컨테이너 앱이 0으로 스케일 인됩니다.

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

  • 컨테이너 앱을 배포하기 위한 Container Apps 환경 만들기
  • 컨테이너 앱에 메시지를 보내는 Azure Storage 큐 만들기
  • 백그라운드 처리 애플리케이션을 컨테이너 앱으로 배포
  • 큐 메시지가 컨테이너 앱에서 처리되는지 확인

설정

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

az login

최신 버전의 CLI를 실행하고 있는지 확인하려면 업그레이드 명령을 실행합니다.

az upgrade

그런 다음 CLI용 Azure Container Apps 확장을 설치하거나 업데이트합니다.

az extension add --name containerapp --upgrade

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

참고 항목

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

az provider register --namespace Microsoft.App
az provider register --namespace Microsoft.OperationalInsights

환경 변수 설정

다음 환경 변수를 설정합니다. <자리 표시자>는 해당 값으로 바꿉니다.

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"

스토리지 큐 설정

먼저 스토리지 계정의 이름을 정의합니다. 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

다음으로 큐의 연결 문자열을 가져옵니다.

QUEUE_CONNECTION_STRING=`az storage account show-connection-string -g $RESOURCE_GROUP --name $STORAGE_ACCOUNT_NAME --query connectionString --out json | tr -d '"'`

이제 메시지 큐를 만들 수 있습니다.

az storage queue create \
  --name "myqueue" \
  --account-name $STORAGE_ACCOUNT_NAME \
  --connection-string $QUEUE_CONNECTION_STRING

마지막으로 큐에 메시지를 보낼 수 있습니다.

az storage message put \
  --content "Hello Queue Reader App" \
  --queue-name "myqueue" \
  --connection-string $QUEUE_CONNECTION_STRING

백그라운드 애플리케이션 배포

queue.json이라는 파일을 만들고 다음 구성 코드를 파일에 붙여넣습니다.

{
    "$schema": "https://schema.management.azure.com/schemas/2019-08-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "location": {
            "defaultValue": "canadacentral",
            "type": "String"
        },
        "environment_name": {
            "type": "String"
        },
        "queueconnection": {
            "type": "secureString"
        }
    },
    "variables": {},
    "resources": [
    {
        "name": "queuereader",
        "type": "Microsoft.App/containerApps",
        "apiVersion": "2022-03-01",
        "kind": "containerapp",
        "location": "[parameters('location')]",
        "properties": {
            "managedEnvironmentId": "[resourceId('Microsoft.App/managedEnvironments', parameters('environment_name'))]",
            "configuration": {
                "activeRevisionsMode": "single",
                "secrets": [
                {
                    "name": "queueconnection",
                    "value": "[parameters('queueconnection')]"
                }]
            },
            "template": {
                "containers": [
                    {
                        "image": "mcr.microsoft.com/azuredocs/containerapps-queuereader",
                        "name": "queuereader",
                        "env": [
                            {
                                "name": "QueueName",
                                "value": "myqueue"
                            },
                            {
                                "name": "QueueConnectionString",
                                "secretRef": "queueconnection"
                            }
                        ]
                    }
                ],
                "scale": {
                    "minReplicas": 1,
                    "maxReplicas": 10,
                    "rules": [
                        {
                            "name": "myqueuerule",
                            "azureQueue": {
                                "queueName": "myqueue",
                                "queueLength": 100,
                                "auth": [
                                    {
                                        "secretRef": "queueconnection",
                                        "triggerParameter": "connection"
                                    }
                                ]
                            }
                        }
                    ]
                }
            }
        }
    }]
}

이제 컨테이너 앱을 만들고 배포할 수 있습니다.

az deployment group create --resource-group "$RESOURCE_GROUP" \
  --template-file ./queue.json \
  --parameters \
    environment_name="$CONTAINERAPPS_ENVIRONMENT" \
    queueconnection="$QUEUE_CONNECTION_STRING" \
    location="$LOCATION"

이 명령은 mcr.microsoft.com/azuredocs/containerapps-queuereader라는 퍼블릭 컨테이너 이미지에서 데모 애플리케이션을 배포하고 애플리케이션에서 사용하는 비밀 및 환경 변수를 설정합니다.

애플리케이션은 ARM 템플릿의 scale 섹션에 정의된 큐 길이에 따라 최대 10개의 복제본을 스케일 아웃합니다.

결과 확인

컨테이너 앱은 백그라운드 프로세스로 실행됩니다. Azure Storage Queue에서 메시지가 도착하면 애플리케이션은 Log Analytics에 로그 항목을 만듭니다. 로그된 데이터를 쿼리하기 전에 분석이 처음으로 도착할 때까지 몇 분 정도 기다려야 합니다.

다음 명령을 실행하여 기록된 메시지를 확인합니다. 이 명령에는 Log Analytics 확장이 필요하므로 확장을 설치하라는 요청 프롬프트를 수락합니다.

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 == 'queuereader' and Log_s contains 'Message ID' | project Time=TimeGenerated, AppName=ContainerAppName_s, Revision=RevisionName_s, Container=ContainerName_s, Message=Log_s | take 5" \
  --out table

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

리소스 정리

완료되면 다음 명령을 실행하여 Container Apps 리소스가 포함된 리소스 그룹을 삭제합니다.

주의

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

az group delete \
  --resource-group $RESOURCE_GROUP