

# 사이드카 전략을 사용한 배포
<a name="CloudWatch-Application-Signals-ECS-Sidecar"></a>

## 1단계: 계정에서 Application Signals 활성화
<a name="CloudWatch-Application-Signals-ECS-Grant"></a>

먼저 계정에서 Application Signals를 활성화해야 합니다. 그렇지 않은 경우 [계정에서 Application Signals 활성화](CloudWatch-Application-Signals-Enable.md) 섹션을 참조하세요.

## 2단계: IAM 역할 생성
<a name="CloudWatch-Application-Signals-Enable-ECS-IAM"></a>

IAM 역할을 생성해야 합니다. 이 역할을 이미 생성한 경우 권한을 추가해야 할 수 있습니다.
+ **ECS 태스크 역할** - 컨테이너는 이 역할을 사용하여 실행됩니다. **CloudWatchAgentServerPolicy** 외에도 권한은 애플리케이션에 필요한 것이어야 합니다.

IAM 역할 생성에 대한 자세한 내용은 [IAM 역할 생성](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create.html) 단원을 참조하세요.

## 3단계: CloudWatch 에이전트 구성 준비
<a name="CloudWatch-Application-Signals-Enable-ECS-PrepareAgent"></a>

먼저 Application Signals가 활성화된 에이전트 구성을 준비합니다. 이렇게 하려면 `/tmp/ecs-cwagent.json`이라는 로컬 파일을 생성합니다.

```
{
  "traces": {
    "traces_collected": {
      "application_signals": {}
    }
  },
  "logs": {
    "metrics_collected": {
      "application_signals": {}
    }
  }
}
```

그런 다음, 이 구성을 SSM Parameter Store에 업로드합니다. 이를 위해 다음 명령을 입력합니다. 파일에서 *\$1REGION*을 실제 리전 이름으로 바꿉니다.

```
aws ssm put-parameter \
--name "ecs-cwagent" \
--type "String" \
--value "`cat /tmp/ecs-cwagent.json`" \
--region "$REGION"
```

## 4단계: CloudWatch 에이전트를 사용하여 애플리케이션 계측
<a name="CloudWatch-Application-Signals-Enable-ECS-Instrument"></a>

다음 단계는 CloudWatch Application Signals에 대해 애플리케이션을 계측하는 것입니다.

------
#### [ Java ]

**CloudWatch 에이전트를 사용하여 Amazon ECS에서 애플리케이션 계측**

1. 먼저 바인드 탑재를 지정합니다. 다음 단계에서 이 볼륨은 컨테이너 간에 파일을 공유하는 데 사용됩니다. 이 바인드 탑재는 이 절차의 뒷부분에서 사용합니다.

   ```
   "volumes": [
     {
       "name": "opentelemetry-auto-instrumentation"
     }
   ]
   ```

1. CloudWatch 에이전트 사이드카 정의를 추가합니다. 이렇게 하려면 애플리케이션의 작업 정의에 `ecs-cwagent`라는 새 컨테이너를 추가합니다. *\$1REGION*을 실제 리전 이름으로 바꿉니다. *\$1IMAGE*를 Amazon Elastic Container Registry의 최신 CloudWatch 컨테이너 이미지 경로로 바꿉니다. 자세한 내용은 Amazon ECR의 [cloudwatch-agent](https://gallery.ecr.aws/cloudwatch-agent/cloudwatch-agent)를 참조하세요.

   대신 대몬 전략으로 CloudWatch 에이전트를 활성화하려면 [대몬 전략을 사용하여 배포](CloudWatch-Application-Signals-ECS-Daemon.md)의 지침을 참조하세요.

   ```
   {
     "name": "ecs-cwagent",
     "image": "$IMAGE",
     "essential": true,
     "secrets": [
       {
         "name": "CW_CONFIG_CONTENT",
         "valueFrom": "ecs-cwagent"
       }
     ],
     "logConfiguration": {
       "logDriver": "awslogs",
       "options": {
         "awslogs-create-group": "true",
         "awslogs-group": "/ecs/ecs-cwagent",
         "awslogs-region": "$REGION",
         "awslogs-stream-prefix": "ecs"
       }
     }
   }
   ```

1. 애플리케이션의 작업 정의에 새 컨테이너 `init`를 추가합니다. *\$1IMAGE*를 [AWS Distro for OpenTelemetry Amazon ECR 이미지 리포지토리](https://gallery.ecr.aws/aws-observability/adot-autoinstrumentation-java)의 최신 이미지로 바꿉니다.

   ```
   {
     "name": "init",
     "image": "$IMAGE",
     "essential": false,
     "command": [
       "cp",
       "/javaagent.jar",
       "/otel-auto-instrumentation/javaagent.jar"
     ],
     "mountPoints": [
       {
         "sourceVolume": "opentelemetry-auto-instrumentation",
         "containerPath": "/otel-auto-instrumentation",
         "readOnly": false
       }
     ]
   }
   ```

1. 애플리케이션 컨테이너가 시작되기 전에 이 컨테이너가 완료되도록 `init` 컨테이너에 종속성을 추가하세요.

   ```
   "dependsOn": [
     {
       "containerName": "init",
       "condition": "SUCCESS"
     }
   ]
   ```

1. 애플리케이션 컨테이너에 다음 환경 변수를 추가합니다. Java용 AWS Distro for OpenTelemetry [자동 계측 에이전트](https://opentelemetry.io/docs/zero-code/java/agent/) 버전 1.32.2 이상을 사용해야 합니다.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/CloudWatch-Application-Signals-ECS-Sidecar.html)

1. 이 절차의 1단계에서 정의한 볼륨을 `opentelemetry-auto-instrumentation`을 마운트합니다. 지표 및 추적과의 로그 상관 관계를 활성화할 필요가 없는 경우 Java 애플리케이션에 대한 다음 예제를 사용합니다. 로그 상관 관계를 활성화하려면 다음 단계를 대신 참조하세요.

   ```
   {
     "name": "my-app",
      ...
     "environment": [
       {
         "name": "OTEL_RESOURCE_ATTRIBUTES",
         "value": "service.name=$SVC_NAME"
       },
       {
         "name": "OTEL_LOGS_EXPORTER",
         "value": "none"
       },
       {
         "name": "OTEL_METRICS_EXPORTER",
         "value": "none"
       },
       {
         "name": "OTEL_EXPORTER_OTLP_PROTOCOL",
         "value": "http/protobuf"
       },
       {
         "name": "OTEL_AWS_APPLICATION_SIGNALS_ENABLED",
         "value": "true"
       },
       {
         "name": "JAVA_TOOL_OPTIONS",
         "value": " -javaagent:/otel-auto-instrumentation/javaagent.jar"
       },
       {
         "name": "OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT",
         "value": "http://localhost:4316/v1/metrics"
       },
       {
         "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
         "value": "http://localhost:4316/v1/traces"
       },
       {
         "name": "OTEL_TRACES_SAMPLER",
         "value": "xray"
       },
       {
         "name": "OTEL_PROPAGATORS",
         "value": "tracecontext,baggage,b3,xray"
       }
     ],
     "dependsOn": [
       {
         "containerName": "init",
         "condition": "SUCCESS"
       }
     ],
     "mountPoints": [
       {
         "sourceVolume": "opentelemetry-auto-instrumentation",
         "containerPath": "/otel-auto-instrumentation",
         "readOnly": false
       }
     ]
   }
   ```

------
#### [ Python ]

Python 애플리케이션에서 Application Signals를 활성화하기 전에 다음 사항에 유의하세요.
+ 일부 컨테이너화된 애플리케이션에서는 `PYTHONPATH` 환경 변수가 누락되면 애플리케이션이 시작되지 않을 수 있습니다. 이 문제를 해결하려면 `PYTHONPATH` 환경 변수를 애플리케이션의 작업 디렉터리 위치로 설정해야 합니다. 이는 OpenTelemetry 자동 계측과 관련하여 알려진 문제 때문입니다. 이 문제에 대한 자세한 내용은 [Python autoinstrumentation setting of PYTHONPATH is not compliant](https://github.com/open-telemetry/opentelemetry-operator/issues/2302)를 참조하세요.
+ Django 애플리케이션의 경우 추가 필수 구성이 있으며, [OpenTelemetry Python 설명서](https://opentelemetry-python.readthedocs.io/en/latest/examples/django/README.html)에서 설명합니다.
  + `--noreload` 플래그를 사용하여 자동 재로드를 방지합니다.
  + `DJANGO_SETTINGS_MODULE` 환경 변수를 Django 애플리케이션 `settings.py` 파일의 위치로 설정합니다. 이렇게 하면 OpenTelemetry가 올바르게 액세스하여 Django 설정에 통합할 수 있습니다.
+ Python 애플리케이션에 WSGI 서버를 사용하는 경우 이 섹션의 다음 단계 외에도 [WSGI 서버를 사용하는 Python 애플리케이션에 대한 Application Signals 데이터 없음](CloudWatch-Application-Signals-Enable-Troubleshoot.md#Application-Signals-troubleshoot-Python-WSGI) 섹션을 참조하여 Application Signals 작동 정보를 확인하세요.

**CloudWatch 에이전트를 사용하여 Amazon ECS에서 Python 애플리케이션 계측**

1. 먼저 바인드 탑재를 지정합니다. 다음 단계에서 이 볼륨은 컨테이너 간에 파일을 공유하는 데 사용됩니다. 이 바인드 탑재는 이 절차의 뒷부분에서 사용합니다.

   ```
   "volumes": [
     {
       "name": "opentelemetry-auto-instrumentation-python"
     }
   ]
   ```

1. CloudWatch 에이전트 사이드카 정의를 추가합니다. 이렇게 하려면 애플리케이션의 작업 정의에 `ecs-cwagent`라는 새 컨테이너를 추가합니다. *\$1REGION*을 실제 리전 이름으로 바꿉니다. *\$1IMAGE*를 Amazon Elastic Container Registry의 최신 CloudWatch 컨테이너 이미지 경로로 바꿉니다. 자세한 내용은 Amazon ECR의 [cloudwatch-agent](https://gallery.ecr.aws/cloudwatch-agent/cloudwatch-agent)를 참조하세요.

   대신 대몬 전략으로 CloudWatch 에이전트를 활성화하려면 [대몬 전략을 사용하여 배포](CloudWatch-Application-Signals-ECS-Daemon.md)의 지침을 참조하세요.

   ```
   {
     "name": "ecs-cwagent",
     "image": "$IMAGE",
     "essential": true,
     "secrets": [
       {
         "name": "CW_CONFIG_CONTENT",
         "valueFrom": "ecs-cwagent"
       }
     ],
     "logConfiguration": {
       "logDriver": "awslogs",
       "options": {
         "awslogs-create-group": "true",
         "awslogs-group": "/ecs/ecs-cwagent",
         "awslogs-region": "$REGION",
         "awslogs-stream-prefix": "ecs"
       }
     }
   }
   ```

1. 애플리케이션의 작업 정의에 새 컨테이너 `init`를 추가합니다. *\$1IMAGE*를 [AWS Distro for OpenTelemetry Amazon ECR 이미지 리포지토리](https://gallery.ecr.aws/aws-observability/adot-autoinstrumentation-python)의 최신 이미지로 바꿉니다.

   ```
   {
       "name": "init",
       "image": "$IMAGE",
       "essential": false,
       "command": [
           "cp",
           "-a",
           "/autoinstrumentation/.",
           "/otel-auto-instrumentation-python"
       ],
       "mountPoints": [
           {
               "sourceVolume": "opentelemetry-auto-instrumentation-python",
               "containerPath": "/otel-auto-instrumentation-python",
               "readOnly": false
           }
       ]
   }
   ```

1. 애플리케이션 컨테이너가 시작되기 전에 이 컨테이너가 완료되도록 `init` 컨테이너에 종속성을 추가하세요.

   ```
   "dependsOn": [
     {
       "containerName": "init",
       "condition": "SUCCESS"
     }
   ]
   ```

1. 애플리케이션 컨테이너에 다음 환경 변수를 추가합니다.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/CloudWatch-Application-Signals-ECS-Sidecar.html)

1. 이 절차의 1단계에서 정의한 볼륨을 `opentelemetry-auto-instrumentation-python`을 마운트합니다. 지표 및 추적과의 로그 상관 관계를 활성화할 필요가 없는 경우 Python 애플리케이션에 대한 다음 예제를 사용합니다. 로그 상관 관계를 활성화하려면 다음 단계를 대신 참조하세요.

   ```
   {
     "name": "my-app",
     ...
     "environment": [
       {
         "name": "PYTHONPATH",
         "value": "/otel-auto-instrumentation-python/opentelemetry/instrumentation/auto_instrumentation:$APP_PATH:/otel-auto-instrumentation-python"
       },
       {
         "name": "OTEL_EXPORTER_OTLP_PROTOCOL",
         "value": "http/protobuf"
       },
       {
         "name": "OTEL_TRACES_SAMPLER",
         "value": "xray"
       },
       {
         "name": "OTEL_TRACES_SAMPLER_ARG",
         "value": "endpoint=http://localhost:2000"
       },
       {
         "name": "OTEL_LOGS_EXPORTER",
         "value": "none"
       },
       {
         "name": "OTEL_PYTHON_DISTRO",
         "value": "aws_distro"
       },
       {
         "name": "OTEL_PYTHON_CONFIGURATOR",
         "value": "aws_configurator"
       },
       {
         "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
         "value": "http://localhost:4316/v1/traces"
       },
       {
         "name": "OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT",
         "value": "http://localhost:4316/v1/metrics"
       },
       {
         "name": "OTEL_METRICS_EXPORTER",
         "value": "none"
       },
       {
         "name": "OTEL_AWS_APPLICATION_SIGNALS_ENABLED",
         "value": "true"
       },
       {
         "name": "OTEL_RESOURCE_ATTRIBUTES",
         "value": "service.name=$SVC_NAME"
       },
       {
         "name": "DJANGO_SETTINGS_MODULE",
         "value": "$PATH_TO_SETTINGS.settings"
       }
     ],
     "mountPoints": [
       {
         "sourceVolume": "opentelemetry-auto-instrumentation-python",
         "containerPath": "/otel-auto-instrumentation-python",
         "readOnly": false
       }
     ]
   }
   ```

1. (선택 사항) 로그 상관 관계를 활성화하려면 볼륨을 마운트하기 전에 다음을 수행하세요. `OTEL_RESOURCE_ATTRIBUTES`에서 애플리케이션의 로그 그룹에 대한 추가 환경 변수 `aws.log.group.names`를 설정합니다. 이렇게 하면 애플리케이션의 추적과 지표를 로그 그룹의 관련 로그 항목과 상관시킬 수 있습니다. 이 변수의 경우 *\$1YOUR\$1APPLICATION\$1LOG\$1GROUP*을 애플리케이션의 로그 그룹 이름으로 바꿉니다. 로그 그룹이 여러 개 있는 경우 다음 예와 같이 앰퍼샌드(`&`)를 사용하여 로그 그룹을 구분할 수 있습니다. `aws.log.group.names=log-group-1&log-group-2` 지표와 로그의 상관 관계를 활성화하려면 이 현재 환경 변수를 설정하는 것으로 충분합니다. 자세한 내용은 [로그 상관 관계에 대한 지표 활성화](Application-Signals-MetricLogCorrelation.md) 섹션을 참조하세요. 추적과 로그의 상관 관계를 활성화하려면 애플리케이션의 로깅 구성도 변경해야 합니다. 자세한 내용은 [로그 상관 관계에 대한 추적 활성화](Application-Signals-TraceLogCorrelation.md) 섹션을 참조하세요.

   다음은 예입니다. 로그 상관 관계를 활성화하려면 이 절차의 1단계에서 정의한 `opentelemetry-auto-instrumentation-python` 볼륨을 마운트할 때 이 예제를 사용하세요.

   ```
   {
     "name": "my-app",
     ...
     "environment": [
       {
         "name": "PYTHONPATH",
         "value": "/otel-auto-instrumentation-python/opentelemetry/instrumentation/auto_instrumentation:$APP_PATH:/otel-auto-instrumentation-python"
       },
       {
         "name": "OTEL_EXPORTER_OTLP_PROTOCOL",
         "value": "http/protobuf"
       },
       {
         "name": "OTEL_TRACES_SAMPLER",
         "value": "xray"
       },
       {
         "name": "OTEL_TRACES_SAMPLER_ARG",
         "value": "endpoint=http://localhost:2000"
       },
       {
         "name": "OTEL_LOGS_EXPORTER",
         "value": "none"
       },
       {
         "name": "OTEL_PYTHON_DISTRO",
         "value": "aws_distro"
       },
       {
         "name": "OTEL_PYTHON_CONFIGURATOR",
         "value": "aws_configurator"
       },
       {
         "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
         "value": "http://localhost:4316/v1/traces"
       },
       {
         "name": "OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT",
         "value": "http://localhost:4316/v1/metrics"
       },
       {
         "name": "OTEL_METRICS_EXPORTER",
         "value": "none"
       },
       {
         "name": "OTEL_AWS_APPLICATION_SIGNALS_ENABLED",
         "value": "true"
       },
       {
         "name": "OTEL_RESOURCE_ATTRIBUTES",
         "value": "aws.log.group.names=$YOUR_APPLICATION_LOG_GROUP,service.name=$SVC_NAME"
       },
       {
         "name": "DJANGO_SETTINGS_MODULE",
         "value": "$PATH_TO_SETTINGS.settings"
       }
     ],
     "mountPoints": [
       {
         "sourceVolume": "opentelemetry-auto-instrumentation-python",
         "containerPath": "/otel-auto-instrumentation-python",
         "readOnly": false
       }
     ]
   }
   ```

------
#### [ .NET ]

**CloudWatch 에이전트를 사용하여 Amazon ECS에서 애플리케이션 계측**

1. 먼저 바인드 탑재를 지정합니다. 다음 단계에서 이 볼륨은 컨테이너 간에 파일을 공유하는 데 사용됩니다. 이 바인드 탑재는 이 절차의 뒷부분에서 사용합니다.

   ```
   "volumes": [
     {
       "name": "opentelemetry-auto-instrumentation"
     }
   ]
   ```

1. CloudWatch 에이전트 사이드카 정의를 추가합니다. 이렇게 하려면 애플리케이션의 작업 정의에 `ecs-cwagent`라는 새 컨테이너를 추가합니다. *\$1REGION*을 실제 리전 이름으로 바꿉니다. *\$1IMAGE*를 Amazon Elastic Container Registry의 최신 CloudWatch 컨테이너 이미지 경로로 바꿉니다. 자세한 내용은 Amazon ECR의 [cloudwatch-agent](https://gallery.ecr.aws/cloudwatch-agent/cloudwatch-agent)를 참조하세요.

   대신 대몬 전략으로 CloudWatch 에이전트를 활성화하려면 [대몬 전략을 사용하여 배포](CloudWatch-Application-Signals-ECS-Daemon.md)의 지침을 참조하세요.

   ```
   {
     "name": "ecs-cwagent",
     "image": "$IMAGE",
     "essential": true,
     "secrets": [
       {
         "name": "CW_CONFIG_CONTENT",
         "valueFrom": "ecs-cwagent"
       }
     ],
     "logConfiguration": {
       "logDriver": "awslogs",
       "options": {
         "awslogs-create-group": "true",
         "awslogs-group": "/ecs/ecs-cwagent",
         "awslogs-region": "$REGION",
         "awslogs-stream-prefix": "ecs"
       }
     }
   }
   ```

1. 애플리케이션의 작업 정의에 새 컨테이너 `init`를 추가합니다. *\$1IMAGE*를 [AWS Distro for OpenTelemetry Amazon ECR 이미지 리포지토리](https://gallery.ecr.aws/aws-observability/adot-autoinstrumentation-dotnet)의 최신 이미지로 바꿉니다.

   Linux 컨테이너 인스턴스의 경우 다음을 사용합니다.

   ```
   {
     "name": "init",
     "image": "$IMAGE",
     "essential": false,
     "command": [
         "cp",
         "-a",
         "autoinstrumentation/.",
         "/otel-auto-instrumentation"
     ],
     "mountPoints": [
         {
             "sourceVolume": "opentelemetry-auto-instrumentation",
             "containerPath": "/otel-auto-instrumentation",
             "readOnly": false
         }
     ]
   }
   ```

   Windows Server 컨테이너 인스턴스의 경우 다음을 사용합니다.

   ```
   {
     "name": "init",
     "image": "$IMAGE",
     "essential": false,
     "command": [
         "CMD",
         "/c",
         "xcopy",
         "/e",
         "C:\\autoinstrumentation\\*",
         "C:\\otel-auto-instrumentation",
         "&&",
         "icacls",
         "C:\\otel-auto-instrumentation",
         "/grant",
         "*S-1-1-0:R",
         "/T"
     ],
     "mountPoints": [
         {
             "sourceVolume": "opentelemetry-auto-instrumentation",
             "containerPath": "C:\\otel-auto-instrumentation",
             "readOnly": false
         }
     ]
   }
   ```

1. 애플리케이션 컨테이너가 시작되기 전에 이 컨테이너가 완료되도록 `init` 컨테이너에 종속성을 추가하세요.

   ```
   "dependsOn": [
       {
           "containerName": "init",
           "condition": "SUCCESS"
       }
   ]
   ```

1. 애플리케이션 컨테이너에 다음 환경 변수를 추가합니다. .NET용 AWS Distro for OpenTelemetry [자동 계측 에이전트](https://opentelemetry.io/docs/zero-code/net/) 버전 1.1.0 이상을 사용해야 합니다.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/CloudWatch-Application-Signals-ECS-Sidecar.html)

1. 이 절차의 1단계에서 정의한 볼륨을 `opentelemetry-auto-instrumentation`을 마운트합니다. Linux의 경우 다음을 사용합니다.

   ```
   {
       "name": "my-app",
      ...
       "environment": [
           {
              "name": "OTEL_RESOURCE_ATTRIBUTES",
              "value": "service.name=$SVC_NAME"
          },
           {
               "name": "CORECLR_ENABLE_PROFILING",
               "value": "1"
           },
           {
               "name": "CORECLR_PROFILER",
               "value": "{918728DD-259F-4A6A-AC2B-B85E1B658318}"
           },
           {
               "name": "CORECLR_PROFILER_PATH",
               "value": "/otel-auto-instrumentation/linux-x64/OpenTelemetry.AutoInstrumentation.Native.so"
           },
           {
               "name": "DOTNET_ADDITIONAL_DEPS",
               "value": "/otel-auto-instrumentation/AdditionalDeps"
           },
           {
               "name": "DOTNET_SHARED_STORE",
               "value": "/otel-auto-instrumentation/store"
           },
           {
               "name": "DOTNET_STARTUP_HOOKS",
               "value": "/otel-auto-instrumentation/net/OpenTelemetry.AutoInstrumentation.StartupHook.dll"
           },
           {
               "name": "OTEL_DOTNET_AUTO_HOME",
               "value": "/otel-auto-instrumentation"
           },
           {
               "name": "OTEL_DOTNET_AUTO_PLUGINS",
               "value": "AWS.Distro.OpenTelemetry.AutoInstrumentation.Plugin, AWS.Distro.OpenTelemetry.AutoInstrumentation"
           },
           {
               "name": "OTEL_RESOURCE_ATTRIBUTES",
               "value": "aws.log.group.names=$YOUR_APPLICATION_LOG_GROUP,service.name=aws-dotnet-service-name"
           },
           {
               "name": "OTEL_LOGS_EXPORTER",
               "value": "none"
           },
           {
               "name": "OTEL_METRICS_EXPORTER",
               "value": "none"
           },
           {
               "name": "OTEL_EXPORTER_OTLP_PROTOCOL",
               "value": "http/protobuf"
           },
           {
               "name": "OTEL_AWS_APPLICATION_SIGNALS_ENABLED",
               "value": "true"
           },
           {
               "name": "OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT",
               "value": "http://localhost:4316/v1/metrics"
           },
           {
               "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
               "value": "http://localhost:4316/v1/traces"
           },
           {
               "name": "OTEL_EXPORTER_OTLP_ENDPOINT",
               "value": "http://localhost:4316"
           },
           {
              "name": "OTEL_TRACES_SAMPLER",
              "value": "xray"
          },
          {
              "name": "OTEL_TRACES_SAMPLER_ARG",
              "value": "endpoint=http://localhost:2000"
          },
           {
               "name": "OTEL_PROPAGATORS",
               "value": "tracecontext,baggage,b3,xray"
           }
       ],
       "dependsOn": [
       {
         "containerName": "init",
         "condition": "SUCCESS"
       }
     ],
       "mountPoints": [
           {
               "sourceVolume": "opentelemetry-auto-instrumentation",
               "containerPath": "/otel-auto-instrumentation",
               "readOnly": false
           }
       ]
   }
   ```

   Windows Server의 경우 다음을 사용합니다.

   ```
   {
       "name": "my-app",
      ...
       "environment": [
          {
              "name": "OTEL_RESOURCE_ATTRIBUTES",
              "value": "service.name=$SVC_NAME"
          },
           {
               "name": "CORECLR_ENABLE_PROFILING",
               "value": "1"
           },
           {
               "name": "CORECLR_PROFILER",
               "value": "{918728DD-259F-4A6A-AC2B-B85E1B658318}"
           },
           {
               "name": "CORECLR_PROFILER_PATH",
               "value": "C:\\otel-auto-instrumentation\\win-x64\\OpenTelemetry.AutoInstrumentation.Native.dll"
           },
           {
               "name": "DOTNET_ADDITIONAL_DEPS",
               "value": "C:\\otel-auto-instrumentation\\AdditionalDeps"
           },
           {
               "name": "DOTNET_SHARED_STORE",
               "value": "C:\\otel-auto-instrumentation\\store"
           },
           {
               "name": "DOTNET_STARTUP_HOOKS",
               "value": "C:\\otel-auto-instrumentation\\net\\OpenTelemetry.AutoInstrumentation.StartupHook.dll"
           },
           {
               "name": "OTEL_DOTNET_AUTO_HOME",
               "value": "C:\\otel-auto-instrumentation"
           },
           {
               "name": "OTEL_DOTNET_AUTO_PLUGINS",
               "value": "AWS.Distro.OpenTelemetry.AutoInstrumentation.Plugin, AWS.Distro.OpenTelemetry.AutoInstrumentation"
           },
           {
               "name": "OTEL_RESOURCE_ATTRIBUTES",
               "value": "aws.log.group.names=$YOUR_APPLICATION_LOG_GROUP,service.name=dotnet-service-name"
           },
           {
               "name": "OTEL_LOGS_EXPORTER",
               "value": "none"
           },
           {
               "name": "OTEL_METRICS_EXPORTER",
               "value": "none"
           },
           {
               "name": "OTEL_EXPORTER_OTLP_PROTOCOL",
               "value": "http/protobuf"
           },
           {
               "name": "OTEL_AWS_APPLICATION_SIGNALS_ENABLED",
               "value": "true"
           },
           {
               "name": "OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT",
               "value": "http://localhost:4316/v1/metrics"
           },
           {
               "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
               "value": "http://localhost:4316/v1/traces"
           },
           {
               "name": "OTEL_EXPORTER_OTLP_ENDPOINT",
               "value": "http://localhost:4316"
           },
           {
              "name": "OTEL_TRACES_SAMPLER",
              "value": "xray"
          },
          {
              "name": "OTEL_TRACES_SAMPLER_ARG",
              "value": "endpoint=http://localhost:2000"
          },
           {
               "name": "OTEL_PROPAGATORS",
               "value": "tracecontext,baggage,b3,xray"
           }
       ],
       "mountPoints": [
           {
               "sourceVolume": "opentelemetry-auto-instrumentation",
               "containerPath": "C:\\otel-auto-instrumentation",
               "readOnly": false
           }
       ],
       "dependsOn": [
           {
               "containerName": "init",
               "condition": "SUCCESS"
           }
      ]
   }
   ```

------
#### [ Node.js ]

**참고**  
ESM을 사용하는 Node.js 애플리케이션용 Application Signals를 활성화하는 경우 이들 단계를 시작하기 전에 [Setting up a Node.js application with the ESM module format](#ECS-NodeJs-ESM)을(를) 참조합니다.

**CloudWatch 에이전트를 사용하여 Amazon ECS에서 애플리케이션 계측**

1. 먼저 바인드 탑재를 지정합니다. 다음 단계에서 이 볼륨은 컨테이너 간에 파일을 공유하는 데 사용됩니다. 이 바인드 탑재는 이 절차의 뒷부분에서 사용합니다.

   ```
   "volumes": [
     {
       "name": "opentelemetry-auto-instrumentation-node"
     }
   ]
   ```

1. CloudWatch 에이전트 사이드카 정의를 추가합니다. 이렇게 하려면 애플리케이션의 작업 정의에 `ecs-cwagent`라는 새 컨테이너를 추가합니다. *\$1REGION*을 실제 리전 이름으로 바꿉니다. *\$1IMAGE*를 Amazon Elastic Container Registry의 최신 CloudWatch 컨테이너 이미지 경로로 바꿉니다. 자세한 내용은 Amazon ECR의 [cloudwatch-agent](https://gallery.ecr.aws/cloudwatch-agent/cloudwatch-agent)를 참조하세요.

   대신 대몬 전략으로 CloudWatch 에이전트를 활성화하려면 [대몬 전략을 사용하여 배포](CloudWatch-Application-Signals-ECS-Daemon.md)의 지침을 참조하세요.

   ```
   {
     "name": "ecs-cwagent",
     "image": "$IMAGE",
     "essential": true,
     "secrets": [
       {
         "name": "CW_CONFIG_CONTENT",
         "valueFrom": "ecs-cwagent"
       }
     ],
     "logConfiguration": {
       "logDriver": "awslogs",
       "options": {
         "awslogs-create-group": "true",
         "awslogs-group": "/ecs/ecs-cwagent",
         "awslogs-region": "$REGION",
         "awslogs-stream-prefix": "ecs"
       }
     }
   }
   ```

1. 애플리케이션의 작업 정의에 새 컨테이너 `init`를 추가합니다. *\$1IMAGE*를 [AWS Distro for OpenTelemetry Amazon ECR 이미지 리포지토리](https://gallery.ecr.aws/aws-observability/adot-autoinstrumentation-node)의 최신 이미지로 바꿉니다.

   ```
   {
     "name": "init",
     "image": "$IMAGE",
     "essential": false,
     "command": [
       "cp",
       "-a",
       "/autoinstrumentation/.",
       "/otel-auto-instrumentation-node"
     ],
     "mountPoints": [
       {
         "sourceVolume": "opentelemetry-auto-instrumentation-node",
         "containerPath": "/otel-auto-instrumentation-node",
         "readOnly": false
       }
     ],
   }
   ```

1. 애플리케이션 컨테이너가 시작되기 전에 이 컨테이너가 완료되도록 `init` 컨테이너에 종속성을 추가하세요.

   ```
   "dependsOn": [
     {
       "containerName": "init",
       "condition": "SUCCESS"
     }
   ]
   ```

1. 애플리케이션 컨테이너에 다음 환경 변수를 추가합니다.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/monitoring/CloudWatch-Application-Signals-ECS-Sidecar.html)

1. 이 절차의 1단계에서 정의한 볼륨을 `opentelemetry-auto-instrumentation`을 마운트합니다. 지표 및 추적과의 로그 상관 관계를 활성화할 필요가 없는 경우 Node.js 애플리케이션에 대한 다음 예를 사용합니다. 로그 상관 관계를 활성화하려면 다음 단계를 대신 참조하세요.

   애플리케이션 컨테이너의 경우 애플리케이션 컨테이너가 시작되기 전에 컨테이너가 완료되도록 `init` 컨테이너에 종속성을 추가합니다.

   ```
   {
     "name": "my-app",
      ...
     "environment": [
       {
         "name": "OTEL_RESOURCE_ATTRIBUTES",
         "value": "service.name=$SVC_NAME"
       },
       {
         "name": "OTEL_LOGS_EXPORTER",
         "value": "none"
       },
       {
         "name": "OTEL_METRICS_EXPORTER",
         "value": "none"
       },
       {
         "name": "OTEL_EXPORTER_OTLP_PROTOCOL",
         "value": "http/protobuf"
       },
       {
         "name": "OTEL_AWS_APPLICATION_SIGNALS_ENABLED",
         "value": "true"
       },
       {
         "name": "OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT",
         "value": "http://localhost:4316/v1/metrics"
       },
       {
         "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
         "value": "http://localhost:4316/v1/traces"
       },
       {
         "name": "OTEL_TRACES_SAMPLER",
         "value": "xray"
       },
       {
         "name": "OTEL_TRACES_SAMPLER_ARG",
         "value": "endpoint=http://localhost:2000"
       },
       {
         "name": "NODE_OPTIONS",
         "value": "--require /otel-auto-instrumentation-node/autoinstrumentation.js"
       }
       ],
     "mountPoints": [
       {
         "sourceVolume": "opentelemetry-auto-instrumentation-node",
         "containerPath": "/otel-auto-instrumentation-node",
         "readOnly": false
       }
     ],
     "dependsOn": [
       {
         "containerName": "init",
         "condition": "SUCCESS"
       }
     ]
   }
   ```

1. (선택 사항) 로그 상관 관계를 활성화하려면 볼륨을 마운트하기 전에 다음을 수행하세요. `OTEL_RESOURCE_ATTRIBUTES`에서 애플리케이션의 로그 그룹에 대한 추가 환경 변수 `aws.log.group.names`를 설정합니다. 이렇게 하면 애플리케이션의 추적과 지표를 로그 그룹의 관련 로그 항목과 상관시킬 수 있습니다. 이 변수의 경우 *\$1YOUR\$1APPLICATION\$1LOG\$1GROUP*을 애플리케이션의 로그 그룹 이름으로 바꿉니다. 로그 그룹이 여러 개 있는 경우 다음 예와 같이 앰퍼샌드(`&`)를 사용하여 로그 그룹을 구분할 수 있습니다. `aws.log.group.names=log-group-1&log-group-2` 지표와 로그의 상관 관계를 활성화하려면 이 현재 환경 변수를 설정하는 것으로 충분합니다. 자세한 내용은 [로그 상관 관계에 대한 지표 활성화](Application-Signals-MetricLogCorrelation.md) 섹션을 참조하세요. 추적과 로그의 상관 관계를 활성화하려면 애플리케이션의 로깅 구성도 변경해야 합니다. 자세한 내용은 [로그 상관 관계에 대한 추적 활성화](Application-Signals-TraceLogCorrelation.md) 섹션을 참조하세요.

   다음은 예입니다. 이 예제를 사용하여 이 절차의 1단계에서 정의한 `opentelemetry-auto-instrumentation` 볼륨을 마운트할 때 로그 상관 관계를 활성화합니다.

   ```
   {
     "name": "my-app",
      ...
     "environment": [
       {
         "name": "OTEL_RESOURCE_ATTRIBUTES",
         "value": "aws.log.group.names=$YOUR_APPLICATION_LOG_GROUP,service.name=$SVC_NAME"
       },
       {
         "name": "OTEL_LOGS_EXPORTER",
         "value": "none"
       },
       {
         "name": "OTEL_METRICS_EXPORTER",
         "value": "none"
       },
       {
         "name": "OTEL_EXPORTER_OTLP_PROTOCOL",
         "value": "http/protobuf"
       },
       {
         "name": "OTEL_AWS_APPLICATION_SIGNALS_ENABLED",
         "value": "true"
       },
       {
         "name": "OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT",
         "value": "http://localhost:4316/v1/metrics"
       },
       {
         "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
         "value": "http://localhost:4316/v1/traces"
       },
       {
         "name": "OTEL_TRACES_SAMPLER",
         "value": "xray"
       },
       {
         "name": "OTEL_TRACES_SAMPLER_ARG",
         "value": "endpoint=http://localhost:2000"
       },
       {
         "name": "NODE_OPTIONS",
         "value": "--require /otel-auto-instrumentation-node/autoinstrumentation.js"
       }
       ],
     "mountPoints": [
       {
         "sourceVolume": "opentelemetry-auto-instrumentation-node",
         "containerPath": "/otel-auto-instrumentation-node",
         "readOnly": false
       }
     ],
     "dependsOn": [
       {
         "containerName": "init",
         "condition": "SUCCESS"
       }
     ]
   }
   ```<a name="ECS-NodeJs-ESM"></a>

**ESM 모듈 형식으로 Node.js 애플리케이션 설정**

ESM 모듈 형식의 Node.js 애플리케이션을 제한적으로 지원합니다. 자세한 내용은 [ESM 사용 Node.js에 대해 알려진 제한 사항](CloudWatch-Application-Signals-supportmatrix.md#ESM-limitations)을 참조하세요.

ESM 모듈 형식의 경우 `init` 컨테이너를 사용한 Node.js 계측 SDK 주입에는 해당되지 않습니다. ESM을 사용하는 Node.js용 Application Signals를 활성화하려면 이전 절차의 1단계와 3단계를 건너뛰고 대신 다음을 수행합니다.

**ESM을 사용하는 Node.js 애플리케이션에 Application Signals를 활성화하려면**

1. 관련 종속성을 자동 계측용 Node.js 애플리케이션에 설치합니다.

   ```
   npm install @aws/aws-distro-opentelemetry-node-autoinstrumentation
   npm install @opentelemetry/instrumentation@0.54.0
   ```

1. 이전 절차의 5단계와 6단계에서 볼륨 `opentelemetry-auto-instrumentation-node`의 탑재를 제거합니다.

   ```
    "mountPoints": [
       {
           "sourceVolume": "opentelemetry-auto-instrumentation-node",
           "containerPath": "/otel-auto-instrumentation-node",
           "readOnly": false
       }
    ]
   ```

   노드 옵션을 다음 중 하나로 변경합니다.

   ```
   {
       "name": "NODE_OPTIONS",
       "value": "--import @aws/aws-distro-opentelemetry-node-autoinstrumentation/register --experimental-loader=@opentelemetry/instrumentation/hook.mjs"
   }
   ```

------

## 5단계: 애플리케이션 배포
<a name="CloudWatch-Application-Signals-Enable-ECS-Deploy"></a>

작업 정의의 새 버전을 생성하여 애플리케이션 클러스터에 배포합니다. 새로 생성된 작업에는 세 개의 컨테이너가 표시되어야 합니다.
+ `init`– Application Signals를 초기화하는 데 필요한 컨테이너입니다.
+ `ecs-cwagent`– CloudWatch 에이전트를 실행하는 컨테이너입니다.
+ `my-app`- 설명서의 예제 애플리케이션 컨테이너입니다. 실제 워크로드에서는 이 특정 컨테이너가 존재하지 않거나 자체 서비스 컨테이너로 대체될 수 있습니다.

## (선택 사항) 6단계: 애플리케이션 상태 모니터링
<a name="CloudWatch-Application-Signals-Monitor-sidecar"></a>

Amazon ECS에서 애플리케이션을 활성화하면 애플리케이션 상태를 모니터링할 수 있습니다. 자세한 내용은 [Application Signals를 사용하여 애플리케이션의 운영 상태 모니터링](Services.md) 섹션을 참조하세요.