다음을 통해 공유


자습서: 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에 푸시하는 이미지를 준비합니다.
  • 컨테이너 앱 환경 및 컨테이너 앱을 대상 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 리포지토리에서 이 단계와 관련된 코드를 찾을 수 있습니다.

대상 Java 앱으로 Container Apps 환경 및 컨테이너 앱 만들기

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 .

Init 컨테이너, 비밀, 환경 변수 및 볼륨을 구성하여 Application Insights 통합 설정

다음 단계를 사용하여 비밀, 환경 변수 및 볼륨을 사용하여 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 연결 문자열 대한 비밀을 추가합니다. Application Insights 연결 문자열 대체 $CONNECTION_STRING 합니다.

      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 애플리케이션 Insights 외에 커뮤니티에는 다른 인기 있는 APM 솔루션이 있습니다. Azure Container App을 다른 APM 공급자와 통합하려면 Java 에이전트 JAR 및 관련 구성 파일을 바꾸기만 하면 됩니다.