

# デーモン戦略を使用してデプロイする
<a name="CloudWatch-Application-Signals-ECS-Daemon"></a>

## ステップ 1: アカウントで Application Signals を有効にする
<a name="Application-Signals-ECS-Grant-Daemon"></a>

まず、アカウントで Application Signals を有効にする必要があります。まだ有効にしていない場合は、「[アカウントで Application Signals を有効にする](CloudWatch-Application-Signals-Enable.md)」を参照してください。

## ステップ 2: IAM ロールを作成する
<a name="Application-Signals-Enable-ECS-IAM-Daemon"></a>

IAM ロールを作成する必要があります。このロールが作成済みであっても、アクセス権限の追加が必要となる場合があります。
+ **ECS タスクロール** – コンテナは、このロールを使用して実行します。アクセス権限では、アプリケーションに必要な権限の他に、**CloudWatchAgentServerPolicy** を指定する必要があります。

IAM ロールの作成についての詳細は、「[IAM ロールの作成](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create.html)」を参照してください。

## ステップ 3: CloudWatch エージェント設定を準備する
<a name="Application-Signals-Enable-ECS-PrepareAgent-Daemon"></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="Application-Signals-Enable-ECS-Sidecar-Daemon"></a>

次のタスク定義を作成し、アプリケーションクラスターにデプロイします。*\$1REGION* は実際のリージョン名に置き換えてください。*\$1TASK\$1ROLE\$1ARN* と *\$1EXECUTION\$1ROLE\$1ARN* を、[ステップ 2: IAM ロールを作成する](#Application-Signals-Enable-ECS-IAM-Daemon) で準備した IAM ロールに置き換えます。また、*\$1IMAGE* を Amazon Elastic Container Registry にある最新の CloudWatch コンテナイメージへのパスに置き換えます。詳細については、Amazon ECR で「[cloudwatch-agent](https://gallery.ecr.aws/cloudwatch-agent/cloudwatch-agent)」を参照してください。

**注記**  
デーモンサービスはホスト上の 2 つのポートを公開します。4316 はメトリクスとトレースを受信するためのエンドポイントとして使用され、2000 は CloudWatch トレースサンプラーエンドポイントとして使用されます。この設定により、エージェントはホストで実行されているすべてのアプリケーションタスクからテレメトリデータを収集して送信できます。競合を避けるために、これらのポートがホスト上の他のサービスで使用されていないことを確認してください。

```
{
  "family": "ecs-cwagent-daemon",
  "taskRoleArn": "$TASK_ROLE_ARN",
  "executionRoleArn": "$EXECUTION_ROLE_ARN",
  "networkMode": "bridge",
  "containerDefinitions": [
    {
      "name": "ecs-cwagent",
      "image": "$IMAGE",
      "essential": true,
      "portMappings": [
        {
          "containerPort": 4316,
          "hostPort": 4316
        },
        {
          "containerPort": 2000,
          "hostPort": 2000
        }
      ],
      "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"
        }
      }
    }
  ],
  "requiresCompatibilities": [
    "EC2"
  ],
  "cpu": "128",
  "memory": "64"
}
```

## ステップ 5: アプリケーションを計測する
<a name="Application-Signals-Enable-ECS-Instrument-Daemon"></a>

次のステップは、Application Signals のアプリケーションを計測することです。

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

**CloudWatch エージェントを使用して Amazon ECS で稼働するアプリケーションを計測するには**

1. 最初に、バインドマウントを指定します。次のステップでは、このボリュームを使用してコンテナ間でファイルを共有します。このバインドマウントは、そのステップの後半で使用します。

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

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/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch-Application-Signals-ECS-Daemon.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://CW_CONTAINER_IP:4316/v1/metrics"
       },
       {
         "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
         "value": "http://CW_CONTAINER_IP: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.py` ファイルの場所に `DJANGO_SETTINGS_MODULE` 環境変数を設定します。これにより、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. アプリケーションのタスク定義に新規コンテナ `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/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch-Application-Signals-ECS-Daemon.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://CW_CONTAINER_IP: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://CW_CONTAINER_IP:4316/v1/traces"
       },
       {
         "name": "OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT",
         "value": "http://CW_CONTAINER_IP: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"
       }
     ],
     "dependsOn": [
       {
         "containerName": "init",
         "condition": "SUCCESS"
       }
     ],
     "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://CW_CONTAINER_IP: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://CW_CONTAINER_IP:4316/v1/traces"
       },
       {
         "name": "OTEL_AWS_APPLICATION_SIGNALS_EXPORTER_ENDPOINT",
         "value": "http://CW_CONTAINER_IP: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"
       }
     ],
     "dependsOn": [
       {
         "containerName": "init",
         "condition": "SUCCESS"
       }
     ],
     "mountPoints": [
       {
         "sourceVolume": "opentelemetry-auto-instrumentation-python",
         "containerPath": "/otel-auto-instrumentation-python",
         "readOnly": false
       }
     ]
   }
   ```

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

**CloudWatch エージェントを使用して Amazon ECS で稼働するアプリケーションを計測するには**

1. 最初に、バインドマウントを指定します。次のステップでは、このボリュームを使用してコンテナ間でファイルを共有します。このバインドマウントは、そのステップの後半で使用します。

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

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/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch-Application-Signals-ECS-Daemon.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=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://CW_CONTAINER_IP:4316/v1/traces"
           },
           {
               "name": "OTEL_EXPORTER_OTLP_ENDPOINT",
               "value": "http://CW_CONTAINER_IP:4316"
           },
           {
              "name": "OTEL_TRACES_SAMPLER",
              "value": "xray"
          },
          {
              "name": "OTEL_TRACES_SAMPLER_ARG",
              "value": "endpoint=http://CW_CONTAINER_IP: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
           }
       ],
       "dependsOn": [
           {
               "containerName": "init",
               "condition": "SUCCESS"
           }
      ]
   }
   ```

   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://CW_CONTAINER_IP:4316/v1/metrics"
           },
           {
               "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
               "value": "http://CW_CONTAINER_IP:4316/v1/traces"
           },
           {
               "name": "OTEL_EXPORTER_OTLP_ENDPOINT",
               "value": "http://CW_CONTAINER_IP:4316"
           },
           {
              "name": "OTEL_TRACES_SAMPLER",
              "value": "xray"
          },
          {
              "name": "OTEL_TRACES_SAMPLER_ARG",
              "value": "endpoint=http://CW_CONTAINER_IP: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](#ECSDaemon-NodeJs-ESM)」を参照してください。

**CloudWatch エージェントを使用して Amazon ECS で稼働するアプリケーションを計測するには**

1. 最初に、バインドマウントを指定します。次のステップでは、このボリュームを使用してコンテナ間でファイルを共有します。このバインドマウントは、そのステップの後半で使用します。

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

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/ja_jp/AmazonCloudWatch/latest/monitoring/CloudWatch-Application-Signals-ECS-Daemon.html)

1. この手順のステップ 1 で定義したボリューム `opentelemetry-auto-instrumentation-node` をマウントします。メトリクスやトレースとのログ相関を有効にする必要がない場合は、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://CW_CONTAINER_IP:4316/v1/metrics"
       },
       {
         "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
         "value": "http://CW_CONTAINER_IP:4316/v1/traces"
       },
       {
         "name": "OTEL_TRACES_SAMPLER",
         "value": "xray"
       },
       {
         "name": "OTEL_TRACES_SAMPLER_ARG",
         "value": "endpoint=http://CW_CONTAINER_IP: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://CW_CONTAINER_IP:4316/v1/metrics"
       },
       {
         "name": "OTEL_EXPORTER_OTLP_TRACES_ENDPOINT",
         "value": "http://CW_CONTAINER_IP:4316/v1/traces"
       },
       {
         "name": "OTEL_TRACES_SAMPLER",
         "value": "xray"
       },
       {
         "name": "OTEL_TRACES_SAMPLER_ARG",
         "value": "endpoint=http://CW_CONTAINER_IP: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="ECSDaemon-NodeJs-ESM"></a>

**ESM モジュール形式を使用する Node.js アプリケーションをセットアップする**

ESM モジュール形式を使用する Node.js アプリケーションには限定的なサポートが提供されます。詳細については、「[EMS を使用する ENode.js における既知の制限事項](CloudWatch-Application-Signals-supportmatrix.md#ESM-limitations)」を参照してください。

ESM モジュール形式の場合、`init` コンテナを使用して Node.js インストルメンテーション SDK を挿入することは適用されません。ESM を使用する Node.js の Application Signals を有効にするには、前の手順のステップ 1 とステップ 2 をスキップし、代わりに次の手順を実行します。

**ESM を使用する Node.js アプリケーションの Application Signals を有効にするには**

1. 自動計測のために、関連する依存関係を Node.js アプリケーションにインストールします。

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

1. 前の手順のステップ 4 とステップ 5 で、ボリューム `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"
   }
   ```

------

## ステップ 6: アプリケーションをデプロイする
<a name="Application-Signals-Enable-ECS-Deploy-Daemon"></a>

タスク定義のリビジョンを新規作成し、アプリケーションクラスターにデプロイします。新規作成したタスクに次の 2 つのコンテナが表示されます。
+ `init`- Application Signals を初期化するために必要なコンテナ
+ `my-app`– これは、ドキュメントのアプリケーションコンテナの例です。実際のワークロードでは、この特定のコンテナが存在しないか、独自のサービスコンテナに置き換えられる可能性があります。

## (オプション) ステップ 7: アプリケーションの状態をモニタリングする
<a name="CloudWatch-Application-Signals-Monitor-daemon"></a>

Amazon ECS でアプリケーションを有効にすると、アプリケーションの状態をモニタリングできます。詳細については、「[Application Signals を使用したアプリケーションの運用状態のモニタリング](Services.md)」を参照してください。