다음을 통해 공유


자습서: Azure Container Apps에서 init 컨테이너를 사용하여 APM(애플리케이션 성능 관리) Java 에이전트 구성

이 자습서에서는 Azure Container Apps의 init 컨테이너를 사용하여 APM(애플리케이션 성능 관리) Java 에이전트를 구성합니다. APM은 컨테이너 앱의 가시성을 강화하는 데 도움이 됩니다. APM 플러그 인을 앱과 동일한 이미지나 Dockerfile에 패키징할 수 있지만, 이를 통해 릴리스 및 CVE(Common Vulnerabilities and Exposures) 완화와 같은 관리 문제를 해결할 수 있습니다. 여러 문제를 하나로 묶는 대신 Azure Container Apps의 Java 에이전트와 init 컨테이너를 사용하여 앱 이미지를 수정하지 않고도 APM 솔루션을 삽입할 수 있습니다.

이 자습서에서는 다음을 수행합니다.

  • Java 에이전트를 설정하기 위한 이미지를 준비하고 Azure Container Registry에 푸시합니다.
  • Container Apps 환경과 컨테이너 앱을 대상 Java 앱으로 만듭니다.
  • Application Insights 통합을 설정하려면 init 컨테이너와 볼륨 탑재를 구성합니다.

필수 구성 요소

환경 설정

다음 단계에 따라 환경 변수를 정의하고 Container Apps 확장이 최신 상태인지 확인합니다.

  1. 다음 명령을 사용하여 환경 변수를 정의합니다.

    export SUBSCRIPTION_ID="<SUBSCRIPTION_ID>" # Replace with your own Azure subscription ID
    export APP_INSIGHTS_RESOURCE_ID="/subscriptions/$SUBSCRIPTION_ID/resourceGroups/my-resource-group/providers/microsoft.insights/components/my-app-insights"
    export CONTAINER_REGISTRY_NAME="myacr"
    export RESOURCE_GROUP="my-resource-group"
    export ENVIRONMENT_NAME="my-environment"
    export CONTAINER_APP_NAME="my-container-app"
    export LOCATION="eastus"
    
  2. 다음 명령을 사용하여 Azure CLI에 로그인합니다.

    az login
    az account set --subscription $SUBSCRIPTION_ID
    
  3. 다음 명령을 사용하여 Container Apps 및 Application Insights에 대한 Azure CLI 확장의 최신 버전이 있는지 확인합니다.

    az extension add --name containerapp --upgrade
    az extension add --name application-insights --upgrade
    
  4. 다음 명령을 사용하여 Application Insights 인스턴스에 대한 연결 문자열을 검색합니다.

    CONNECTION_STRING=$(az monitor app-insights component show \
        --ids $APP_INSIGHTS_RESOURCE_ID \
        --query connectionString)
    

컨테이너 이미지 준비

Application Insights Java 에이전트에 대한 설치 이미지를 빌드하려면 동일한 디렉터리에서 다음 단계를 따릅니다.

  1. 다음 콘텐츠로 Dockerfile을 만듭니다.

    FROM mcr.microsoft.com/cbl-mariner/base/core:2.0
    
    ARG version="3.5.4"
    
    RUN tdnf update -y && tdnf install -y curl ca-certificates
    
    RUN curl -L "https://github.com/microsoft/ApplicationInsights-Java/releases/download/${version}/applicationinsights-agent-${version}.jar" > agent.jar
    
    ADD setup.sh /setup.sh
    
    ENTRYPOINT ["/bin/sh", "setup.sh"]
    
  2. 다음 내용을 사용하여 setup.sh 파일을 만듭니다.

    #!/bin/sh
    
    if [[ -z "$CONNECTION_STRING" ]]; then
      echo "Environment variable CONNECTION_STRING is not found. Exiting..."
      exit 1
    else
      echo "{\"connectionString\": \"$CONNECTION_STRING\"}" > /java-agent/applicationinsights.json
      cp agent.jar /java-agent/agent.jar
    fi
    
  3. 다음 명령을 사용하여 이미지를 만듭니다.

    docker build . --tag "$CONTAINER_REGISTRY_NAME.azurecr.io/samples/java-agent-setup:1.0.0"
    
  4. 다음 명령을 사용하여 이미지를 Azure Container Registry 또는 다른 컨테이너 이미지 레지스트리로 푸시합니다.

    az acr login --name $CONTAINER_REGISTRY_NAME
    docker push "$CONTAINER_REGISTRY_NAME.azurecr.io/samples/java-agent-setup:1.0.0"
    

azure-container-apps-java-samples GitHub 리포지토리에서 이 단계와 관련된 코드를 찾을 수 있습니다.

Container Apps 환경과 컨테이너 앱을 대상 Java 앱으로 만듭니다.

Container Apps 환경과 컨테이너 앱을 대상 Java 앱으로 만들려면 다음 단계를 따릅니다.

  1. 다음 명령을 사용하여 Container Apps 환경을 만듭니다.

    az containerapp env create \
        --name $ENVIRONMENT_NAME \
        --resource-group $RESOURCE_GROUP \
        --location "$LOCATION" \
        --query "properties.provisioningState"
    

    Container Apps 환경을 성공적으로 만들면 명령줄에서 Succeeded 메시지가 반환됩니다.

  2. 다음 명령을 사용하여 추가 구성을 위한 컨테이너 앱을 만듭니다.

    az containerapp create \
        --name $CONTAINER_APP_NAME \
        --environment $ENVIRONMENT_NAME \
        --resource-group $RESOURCE_GROUP \
        --query "properties.provisioningState"
    

    컨테이너 앱을 만든 후 명령줄은 Succeeded 메시지를 반환합니다.

Application Insights 통합을 설정하기 위해 init 컨테이너, 비밀, 환경 변수 및 볼륨을 구성합니다.

다음 단계에 따라 비밀, 환경 변수 및 볼륨을 사용하여 init 컨테이너를 구성합니다. 이 구성을 사용하면 저장된 정보를 Application Insights 인스턴스와 함께 사용할 수 있습니다.

  1. 다음 명령을 사용하여 실행 중인 컨테이너 앱의 현재 구성을 현재 디렉터리의 app.yaml 파일에 씁니다.

    az containerapp show \
        --resource-group $RESOURCE_GROUP \
        --name $CONTAINER_APP_NAME \
        --output yaml \
    > app.yaml
    
  2. 다음 단계를 사용하여 app.yaml 파일을 편집합니다. 편집을 통해 파일에 비밀, 임시 스토리지, init 컨테이너가 추가되고 앱 컨테이너가 업데이트됩니다.

    1. 다음 예를 사용하여 Application Insights 연결 문자열에 대한 비밀을 추가합니다. $CONNECTION_STRING을 Application Insights 연결 문자열로 바꿉니다.

      properties:
        configuration:
           secrets:
           - name: app-insights-connection-string
             value: $CONNECTION_STRING
      
    2. 다음 예를 사용하여 Java 에이전트 파일에 대한 임시 스토리지 볼륨을 추가합니다.

      properties:
        template:
          volumes:
          - name: java-agent-volume
            storageType: EmptyDir
      
    3. 다음 예를 사용하여 볼륨 탑재와 환경 변수가 있는 init 컨테이너를 추가합니다. <CONTAINER_REGISTRY_NAME>을 Azure Container Registry 이름으로 바꿉니다.

      properties:
        template:
          initContainers:
          - image: <CONTAINER_REGISTRY_NAME>.azurecr.io/samples/java-agent-setup:1.0.0
            name: java-agent-setup
            resources:
              cpu: 0.25
              memory: 0.5Gi
            env:
            - name: CONNECTION_STRING
              secretRef: app-insights-connection-string
            volumeMounts:
            - mountPath: /java-agent
              volumeName: java-agent-volume
      
    4. 다음 예를 사용하여 볼륨 탑재 및 환경 변수로 앱 컨테이너를 업데이트합니다.

      properties:
        template:
          containers:
          - name: test-java-app
            image: mcr.microsoft.com/azurespringapps/samples/hello-world:0.0.1
            resources:
              cpu: 0.5
              memory: 1Gi
            env:
            - name: JAVA_TOOL_OPTIONS
              value: -javaagent:/java-agent/agent.jar
            volumeMounts:
            - mountPath: /java-agent
              volumeName: java-agent-volume
      
  3. 다음 명령을 사용하여 수정된 app.yaml 파일로 컨테이너 앱을 업데이트합니다.

    az containerapp update \
        --resource-group $RESOURCE_GROUP \ 
        --name $CONTAINER_APP_NAME \
        --yaml app.yaml \
        --query "properties.provisioningState"
    

    컨테이너 앱을 업데이트한 후 명령은 Succeeded 메시지를 반환합니다. 이제 Azure Portal에서 Application Insights 인스턴스를 확인하여 컨테이너 앱이 연결되었는지 확인할 수 있습니다.

리소스 정리

이 자습서에서 만든 리소스는 Azure 청구서에 포함됩니다. 장기적으로 필요하지 않은 경우 다음 명령을 사용하여 리소스 그룹과 해당 리소스를 제거합니다.

az group delete --resource-group $RESOURCE_GROUP

Azure Application Insights 외에 커뮤니티에는 다른 인기 있는 APM 솔루션이 있습니다. Azure Container App을 다른 APM 공급자와 통합하려면 Java 에이전트 JAR 및 관련 구성 파일만 바꾸면 됩니다.