다음을 통해 공유


자습서: Azure Container Apps를 사용하여 이벤트 기반 작업 배포

Azure Container Apps 작업을 사용하면 한정된 기간 동안 실행되고 종료되는 컨테이너화된 작업을 실행할 수 있습니다. 수동으로, 일정에 따라 또는 이벤트를 기반으로 작업 실행을 트리거할 수 있습니다. 작업은 데이터 처리, 기계 학습, 리소스 정리 또는 서버리스 임시 컴퓨팅 리소스가 필요한 모든 시나리오와 같은 작업에 가장 적합합니다.

이 자습서에서는 이벤트 기반 작업을 수행하는 방법을 알아봅니다.

  • 컨테이너 앱을 배포하기 위한 Container Apps 환경 만들기
  • 컨테이너 앱에 메시지를 보내는 Azure Storage 큐 만들기
  • 작업을 실행하는 컨테이너 이미지 빌드
  • Container Apps 환경에 작업 배포
  • 큐 메시지가 컨테이너 앱에서 처리되는지 확인

만든 작업은 Azure Storage 큐로 전송되는 각 메시지에 대한 실행을 시작합니다. 각 작업 실행은 다음 단계를 수행하는 컨테이너를 실행합니다.

  1. 큐에서 하나의 메시지를 가져옵니다.
  2. 작업 실행 로그에 메시지를 기록합니다.
  3. 큐에서 메시지를 삭제합니다.
  4. 종료합니다.

Important

스케일러는 큐의 길이를 모니터링하여 시작할 작업 수를 결정합니다. 정확한 스케일링을 위해 작업 실행이 완료될 때까지 큐에서 메시지를 삭제하지 마세요.

이 자습서에서 실행하는 작업의 소스 코드는 Azure 샘플 GitHub 리포지토리에서 사용할 수 있습니다.

필수 조건

설정

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

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

    az upgrade
    
  3. 최신 버전의 Azure Container Apps CLI 확장을 설치합니다.

    az extension add --name containerapp --upgrade
    
  4. Azure 구독에 Microsoft.App아직 등록하지 않은 경우 , Microsoft.OperationalInsightsMicrosoft.Storage 네임스페이스를 등록합니다.

    az provider register --namespace Microsoft.App
    az provider register --namespace Microsoft.OperationalInsights
    az provider register --namespace Microsoft.Storage
    
  5. 이제 Azure CLI 설정이 완료되었으므로 이 문서 전체에서 사용되는 환경 변수를 정의할 수 있습니다.

    RESOURCE_GROUP="jobs-quickstart"
    LOCATION="northcentralus"
    ENVIRONMENT="env-jobs-quickstart"
    JOB_NAME="my-job"
    

컨테이너 앱 환경 만들기

Azure Container Apps 환경은 Container Apps와 작업 주위의 보안 경계 역할을 하므로 동일한 네트워크를 공유하고 서로 통신할 수 있습니다.

  1. 다음 명령을 사용하여 리소스 그룹을 만듭니다.

    az group create \
        --name "$RESOURCE_GROUP" \
        --location "$LOCATION"
    
  2. 다음 명령을 사용하여 Container Apps 환경을 만듭니다.

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

스토리지 큐 설정

작업은 Azure Storage 큐를 사용하여 메시지를 수신합니다. 이 섹션에서는 스토리지 계정과 큐를 만듭니다.

  1. 스토리지 계정의 이름을 정의합니다.

    STORAGE_ACCOUNT_NAME="<STORAGE_ACCOUNT_NAME>"
    QUEUE_NAME="myqueue"
    

    <STORAGE_ACCOUNT_NAME>을 스토리지 계정의 고유한 이름으로 바꿉니다. Storage 계정 이름은 Azure 내에서 고유하고, 길이가 3자에서 24자 사이여야 하며, 숫자 및 소문자만 포함해야 합니다.

  2. Azure Storage 계정을 만듭니다.

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

    이 명령이 오류를 반환하는 경우:

    (SubscriptionNotFound) Subscription <SUBSCRIPTION_ID> was not found.
    Code: SubscriptionNotFound
    Message: Subscription <SUBSCRIPTION_ID> was not found.
    

    Azure 구독에 네임스페이 Microsoft.Storage 스를 등록했는지 확인합니다.

    az provider register --namespace Microsoft.Storage
    
  3. 큐의 연결 문자열을 변수에 저장합니다.

    QUEUE_CONNECTION_STRING=$(az storage account show-connection-string -g $RESOURCE_GROUP --name $STORAGE_ACCOUNT_NAME --query connectionString --output tsv)
    
  4. 메시지 큐를 만듭니다.

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

사용자 할당 관리 ID 만들기

관리 자격 증명을 사용하지 않도록 하려면 인증에 관리 ID를 사용하여 Microsoft Azure Container Registry의 프라이빗 리포지토리에서 이미지를 끌어오면 됩니다. 가능하면 사용자 할당 관리 ID를 사용하여 이미지를 가져옵니다.

  1. 사용자가 할당한 관리 ID 만들기 다음 명령을 실행하기 전에 관리 ID의 이름을 선택하고 이름을 바꿉 \<PLACEHOLDER\> 니다.

    IDENTITY="<YOUR_IDENTITY_NAME>"
    
    az identity create \
        --name $IDENTITY \
        --resource-group $RESOURCE_GROUP
    
  2. ID의 리소스 ID를 가져옵니다.

    IDENTITY_ID=$(az identity show \
        --name $IDENTITY \
        --resource-group $RESOURCE_GROUP \
        --query id \
        --output tsv)
    

작업 빌드 및 배포

작업을 배포하려면 먼저 작업에 대한 컨테이너 이미지를 빌드하고 이를 레지스트리에 푸시해야 합니다. 그런 다음 작업을 Container Apps 환경에 배포할 수 있습니다.

  1. 컨테이너 이미지 및 레지스트리의 이름을 정의합니다.

    CONTAINER_IMAGE_NAME="queue-reader-job:1.0"
    CONTAINER_REGISTRY_NAME="<CONTAINER_REGISTRY_NAME>"
    

    <CONTAINER_REGISTRY_NAME>을 컨테이너 레지스트리의 고유 이름으로 바꿉니다. 컨테이너 레지스트리 이름은 Azure 내에서 고유해야 하며 숫자와 소문자만 포함하여 5~50자여야 합니다.

  2. 컨테이너 레지스트리를 만듭니다.

    az acr create \
        --name "$CONTAINER_REGISTRY_NAME" \
        --resource-group "$RESOURCE_GROUP" \
        --location "$LOCATION" \
        --sku Basic
    
  3. 컨테이너 레지스트리는 관리 ID를 사용하여 이미지를 끌어오기 위해 인증을 위해 ARM(Azure Resource Manager) 대상 그룹 토큰을 허용해야 합니다.

    다음 명령을 사용하여 ARM 토큰이 ACR(Azure Container Registry)에 액세스할 수 있는지 확인합니다.

    az acr config authentication-as-arm show --registry "$CONTAINER_REGISTRY_NAME"
    

    ARM 토큰이 허용되는 경우 명령은 다음을 출력합니다.

    {
      "status": "enabled"
    }
    

    status disabled경우 다음 명령을 사용하여 ARM 토큰을 허용합니다.

    az acr config authentication-as-arm update --registry "$CONTAINER_REGISTRY_NAME" --status enabled
    
  4. 작업의 소스 코드는 GitHub에서 확인할 수 있습니다. 다음 명령을 실행하여 리포지토리를 복제하고 az acr build 명령을 사용하여 클라우드에 컨테이너 이미지를 빌드합니다.

    az acr build \
        --registry "$CONTAINER_REGISTRY_NAME" \
        --image "$CONTAINER_IMAGE_NAME" \
        "https://github.com/Azure-Samples/container-apps-event-driven-jobs-tutorial.git"
    

    이제 컨테이너 레지스트리에서 이미지를 사용할 수 있습니다.

  5. Container Apps 환경에서 작업을 만듭니다.

    az containerapp job create \
        --name "$JOB_NAME" \
        --resource-group "$RESOURCE_GROUP" \
        --environment "$ENVIRONMENT" \
        --trigger-type "Event" \
        --replica-timeout "1800" \
        --min-executions "0" \
        --max-executions "10" \
        --polling-interval "60" \
        --scale-rule-name "queue" \
        --scale-rule-type "azure-queue" \
        --scale-rule-metadata "accountName=$STORAGE_ACCOUNT_NAME" "queueName=$QUEUE_NAME" "queueLength=1" \
        --scale-rule-auth "connection=connection-string-secret" \
        --image "$CONTAINER_REGISTRY_NAME.azurecr.io/$CONTAINER_IMAGE_NAME" \
        --cpu "0.5" \
        --memory "1Gi" \
        --secrets "connection-string-secret=$QUEUE_CONNECTION_STRING" \
        --registry-server "$CONTAINER_REGISTRY_NAME.azurecr.io" \
        --mi-user-assigned "$IDENTITY_ID" \
        --registry-identity "$IDENTITY_ID" \
        --env-vars "AZURE_STORAGE_QUEUE_NAME=$QUEUE_NAME" "AZURE_STORAGE_CONNECTION_STRING=secretref:connection-string-secret"
    

    다음 표에서는 명령에 사용되는 주요 매개 변수를 설명합니다.

    매개 변수 설명
    --replica-timeout 복제본을 실행할 수 있는 최대 기간입니다.
    --min-executions 폴링 간격당 실행할 최소 작업 실행 수입니다.
    --max-executions 폴링 간격당 실행할 최대 작업 실행 수입니다.
    --polling-interval 크기 조정 규칙을 평가할 폴링 간격입니다.
    --scale-rule-name 크기 조정 규칙의 이름입니다.
    --scale-rule-type 사용할 배율 규칙의 형식입니다.
    --scale-rule-metadata 크기 조정 규칙의 메타데이터입니다.
    --scale-rule-auth 크기 조정 규칙에 대한 인증입니다.
    --secrets 작업에 사용할 비밀입니다.
    --registry-server 작업에 사용할 컨테이너 레지스트리 서버입니다. Azure Container Registry의 경우 명령은 자동으로 인증을 구성합니다.
    --mi-user-assigned 작업에 할당할 사용자 할당 관리 ID의 리소스 ID입니다.
    --registry-identity 사용자 이름 및 암호를 사용하는 대신 레지스트리 서버에서 인증할 관리 ID의 리소스 ID입니다. 가능하면 ID에 대한 'acrpull' 역할 할당이 자동으로 만들어집니다.
    --env-vars 작업에 사용할 환경 변수입니다.

    크기 조정 규칙 구성은 모니터링할 이벤트 원본을 정의합니다. 각 폴링 간격마다 평가되어 트리거할 작업 실행 수를 결정합니다. 자세한 내용은 크기 조정 규칙 설정을 참조하세요.

이제 이벤트 기반 작업이 Container Apps 환경에서 만들어집니다.

배포 확인

작업은 60초마다 크기 조정 규칙을 평가하여 큐의 메시지 수를 확인하도록 구성됩니다. 각 평가 기간 동안 큐의 각 메시지에 대해 최대 10회 실행까지 새 작업 실행을 시작합니다.

작업이 올바르게 구성되었는지 확인하려면 일부 메시지를 큐에 보내고 작업 실행이 시작되었는지 확인하면 해당 메시지가 작업 실행 로그에 기록됩니다.

  1. 큐에 메시지를 보냅니다.

    az storage message put \
        --content "Hello Queue Reader Job" \
        --queue-name "$QUEUE_NAME" \
        --connection-string "$QUEUE_CONNECTION_STRING"
    
  2. 작업 실행을 나열합니다.

    az containerapp job execution list \
        --name "$JOB_NAME" \
        --resource-group "$RESOURCE_GROUP" \
        --output json
    

    작업은 60초마다 크기 조정 규칙을 평가하도록 구성되어 있으므로 작업 실행이 시작되는 데 최대 1분이 걸릴 수 있습니다. 작업 실행이 표시되고 해당 상태가 Succeeded가 될 때까지 명령을 반복합니다.

  3. 기록된 메시지를 보려면 다음 명령을 실행합니다. 이러한 명령에는 로그 분석 확장이 필요하므로 요청 시 확장을 설치하라는 메시지를 수락합니다.

    LOG_ANALYTICS_WORKSPACE_ID=$(az containerapp env show --name $ENVIRONMENT --resource-group $RESOURCE_GROUP --query properties.appLogsConfiguration.logAnalyticsConfiguration.customerId --output tsv)
    
    az monitor log-analytics query \
        --workspace "$LOG_ANALYTICS_WORKSPACE_ID" \
        --analytics-query "ContainerAppConsoleLogs_CL | where ContainerJobName_s == '$JOB_NAME' | order by _timestamp_d asc"
    

    ContainerAppConsoleLogs_CL 테이블이 준비될 때까지 명령은 오류 BadArgumentError: The request had some invalid properties를 반환합니다. 잠시 기다린 다음 다시 시도하십시오.

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

리소스 정리

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

주의

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

az group delete \
    --resource-group $RESOURCE_GROUP

다음 단계