概要

Amazon ECS は、Docker コンテナに対応する、拡張性とパフォーマンスに優れたコンテナオーケストレーションサービスです。Datadog Agent と使用すると、クラスター内のすべての EC2 インスタンスの ECS コンテナおよびタスクを監視できます。

このページは Datadog コンテナ Agent を使用した Amazon ECS のセットアップについて説明します。他のセットアップについては、以下を参照してください。

: ECS on Fargate をセットアップする場合は、Amazon ECS on AWS Fargate の手順を参照してください。EC2 インスタンスにデプロイされた Datadog Agent コンテナは、Fargate Tasks を監視することはできません。また、AWS Batch はサポートされていません。

セットアップ

ECS の Datadog Agent は、ECS クラスター内の各 EC2 インスタンスに一度、コンテナとしてデプロイする必要があります。これは、Datadog Agent コンテナ用のタスク定義を作成し、それをデーモンサービスとしてデプロイすることで実現します。各 Datadog Agent コンテナは、それぞれの EC2 インスタンス上の他のコンテナを監視します。

稼働中の EC2 Container Service クラスターが構成されていない場合は、ECS ドキュメント内の Getting Started セクションを参照してクラスターを設定、構成します。構成したら、下記のセットアップ手順に従います。

  1. ECS タスク定義の作成と追加
  2. Datadog Agent を Daemon サービスとしてスケジュール
  3. オプション Datadog Agent の追加機能の設定

注: ECS および Docker を併用して Datadog のオートディスカバリーを実行すると、環境内で実行中のタスクを自動的に検出して監視できます。

ECS タスクの作成

タスク定義は、必要な構成で Datadog Agent コンテナを起動します。Agent の構成を変更する必要がある場合、このタスク定義を更新し、必要に応じてデーモンサービスを再デプロイします。タスク定義は、AWS CLI ツールまたは Amazon Web Console のいずれかを使用して構成することができます。

以下のサンプルは、コアインフラストラクチャーを監視するための最小限の構成です。しかし、様々な機能を有効にした追加のタスク定義のサンプルが Agent の追加機能の設定のセクションで提供されていますので、それらを代わりに使用することができます。

タスク定義ファイルの管理

  1. Linux コンテナの場合、datadog-Agent-ecs.json をダウンロードします。

    1. オリジナルの Amazon Linux 1 AMI を使用している場合は、datadog-agent-ecs1.json を使用します。
    2. Windows を使用している場合は、datadog-Agent-ecs-win.json を使用します。
  2. ベースとなるタスク定義ファイルを編集する

    1. <YOUR_DATADOG_API_KEY> にアカウントの Datadog API キー を設定します。

    2. 環境変数 DD_SITE を設定します。

      : DD_SITE 環境変数が明示的に設定されていない場合、値はデフォルトで US サイトの datadoghq.com に設定されます。その他のサイト (EUUS3、または US1-FED) のいずれかを使用しており、これを設定しない場合は、API キーのメッセージが無効になります。ドキュメントのサイト選択ドロップダウンを使用して、使用中のサイトに適したドキュメントを確認してください。

  3. オプション - 以下を ECS タスクの定義に追加して ECS Anywhere クラスターにデプロイします。

    "requiresCompatibilities": ["EXTERNAL"]
    
  4. オプション - ECS タスク定義に Agent ヘルスチェックを追加する

    "healthCheck": {
      "retries": 3,
      "command": ["CMD-SHELL","agent health"],
      "timeout": 5,
      "interval": 30,
      "startPeriod": 15
    }
    

これらの例では、環境変数 DD_API_KEY に、AWS Secret Manager に保存されている “Plaintext” シークレットの ARN を参照することで代用することができます。追加のタグは環境変数 DD_TAGS によって追加することができます。

タスク定義の登録

タスク定義ファイルを作成したら、以下のコマンドを実行して、これを AWS に登録します。

aws ecs register-task-definition --cli-input-json file://<path to datadog-agent-ecs.json>

タスク定義ファイルを作成したら、AWS コンソールにログインしてこれを登録することができます。

  1. AWS コンソールにログインし、Elastic コンテナサービス セクションに移動します。
  2. 左側の Task Definitions をクリックし、Create new Task Definition ボタンをクリックします。
  3. 起動タイプとして “EC2” を選択します。ECS Anywhere クラスターにエージェントタスクをデプロイする場合は、“External” を選択することもできます。
  4. “Configure task and container definitions” ページで、一番下までスクロールし、Configure via JSON を選択します。ここから、ファイルから構成をコピーアンドペーストすることができます。
  5. JSON タブの Save をクリックします。
  6. このページから、またはこの Configure via JSON プロセスを繰り返すことで、追加の変更を行うことができます。
  7. 下部の Create をクリックすると、このタスク定義が登録されます。

Agent を Daemon サービスとして実行

理想的には、各 EC2 インスタンス上で 1 つの Datadog Agent コンテナを実行します。これを実現する最も簡単な方法は、Datadog Agent タスク定義をデーモンサービスとして実行することです。

Datadog の ECS タスクを使用して、AWS でDaemon サービスをスケジューリング

  1. AWS コンソールにログインし、ECS クラスターページに移動します。Agent を実行するクラスターをクリックします。
  2. 新しいサービスを作成するには、「サービス」で Create ボタンをクリックします。
  3. 起動タイプに EC2 を選択し、先に作成したタスク定義を選択します。
  4. サービスタイプに DAEMON を選択し、サービス名を入力したら Next をクリックします。
  5. サービスは各インスタンスで 1 度しか実行されないため、ロードバランサーは不要です。選択せずに Next をクリックします。
  6. デーモンサービスはオートスケーリングを必要としないので、Next Step の後に Create Service をクリックします。

Agent の追加機能の設定

上記の最初のタスク定義は、かなり最小限のものです。このタスク定義は、E CSクラスタ内のコンテナに関するコアメトリクスを収集するための基本構成を持つ Agent コンテナをデプロイします。この Agent は、対応するコンテナ上で発見された Docker オートディスカバリーラベルに基づいて、Agent インテグレーションを実行することも可能です。

もし、

DogStatsD

DogStatsD を使用している場合、以下のように Datadog Agent のコンテナ定義に 8125/udp のホストポートマッピングを追加します。

"portMappings": [
  {
    "hostPort": 8125,
    "protocol": "udp",
    "containerPort": 8125
  }
]

このポートマッピングに加えて、環境変数 DD_DOGSTATSD_NON_LOCAL_TRAFFICtrue に設定します。

この設定により、DogStatsD のトラフィックは、アプリケーションコンテナからホストとホストポートを経由して、Datadog Agent コンテナにルーティングされるようになります。ただし、アプリケーションコンテナは、このトラフィックにホストのプライベート IP アドレスを使用する必要があります。これは、環境変数 DD_AGENT_HOST に EC2 インスタンスのプライベート IP アドレスを設定することで有効になり、インスタンスメタデータサービス (IMDS) から取得することができます。また、初期化時にコードで設定することもできます。DogStatsD の構成は APM と同じで、Agent のエンドポイントを設定する例については Trace Agent のエンドポイントを構成するを参照してください。

EC2 インスタンスのセキュリティグループ設定で、APM と DogStatsD のポートが公に公開されていないことを確認します。

プロセスの収集

Live Container のデータは、Datadog Agent コンテナによって自動的に収集されます。全てのコンテナの Live Process 情報を収集し、Datadog に送信するには、環境変数でタスク定義を更新してください。

{
  "name": "DD_PROCESS_AGENT_ENABLED",
  "value": "true"
}

ネットワークパフォーマンスのモニタリングの収集

この機能は、Linux でのみ使用可能です

  1. 前述の手順に従い Datadog Agent をインストールします。
  2. タスク定義がすでに存在する場合は、次のコンフィギュレーションで datadog-agent-ecs.json ファイル (オリジナルの Amazon Linux AMI を使用している場合は datadog-agent-ecs1.json) を更新します。
{
  "containerDefinitions": [
    (...)
      "mountPoints": [
        (...)
        {
          "containerPath": "/sys/kernel/debug",
          "sourceVolume": "debug"
        },
        (...)
      ],
      "environment": [
        (...)
        {
          "name": "DD_SYSTEM_PROBE_NETWORK_ENABLED",
          "value": "true"
        }
      ],
      "linuxParameters": {
       "capabilities": {
         "add": [
           "SYS_ADMIN",
           "SYS_RESOURCE",
           "SYS_PTRACE",
           "NET_ADMIN",
           "NET_BROADCAST",
           "NET_RAW",
           "IPC_LOCK",
           "CHOWN"
         ]
       }
     },
  ],
  "requiresCompatibilities": [
   "EC2"
  ],
  "volumes": [
    (...)
    {
     "host": {
       "sourcePath": "/sys/kernel/debug"
     },
     "name": "debug"
    },
    (...)
  ],
  "family": "datadog-agent-task"
}

AWSVPC モード

Agent バージョン 6.10 以降は、ホストインスタンスのセキュリティグループが関連するポート上の適用可能なコンテナに到達できるよう、セキュリティグループが設定されている場合には、適用可能なコンテナに awsvpc モードが対応しています。

Agent を awsvpc モードで実行することは可能ですが、これは推奨されるセットアップではありません。Agent を DogStatsD メトリクスや APM トレースに到達させるための ENI IP を取得することが難しい可能性があるからです。

代わりに、ブリッジモードで Agent をポートマッピングとともに実行すると、メタデータサーバを介するホスト IP を簡単に取得できます。

GOVCLOUD 環境向け FIPS プロキシ

Datadog の GOVCLOUD データセンターにデータを送信するには、fips-proxy サイドカーコンテナを追加し、コンテナポートを開いて、サポートされている機能の適切な通信を確保します。

: この機能は、Linux でのみ使用可能です

 {
   "containerDefinitions": [
     (...)
          {
            "name": "fips-proxy",
            "image": "datadog/fips-proxy:1.1.3",
            "portMappings": [
                {
                    "containerPort": 9803,
                    "protocol": "tcp"
                },
                {
                    "containerPort": 9804,
                    "protocol": "tcp"
                },
                {
                    "containerPort": 9805,
                    "protocol": "tcp"
                },
                {
                    "containerPort": 9806,
                    "protocol": "tcp"
                },
                {
                    "containerPort": 9807,
                    "protocol": "tcp"
                },
                {
                    "containerPort": 9808,
                    "protocol": "tcp"
                },
                {
                    "containerPort": 9809,
                    "protocol": "tcp"
                },
                {
                    "containerPort": 9810,
                    "protocol": "tcp"
                },
                {
                    "containerPort": 9811,
                    "protocol": "tcp"
                },
                {
                    "containerPort": 9812,
                    "protocol": "tcp"
                },
                {
                    "containerPort": 9813,
                    "protocol": "tcp"
                },
                {
                    "containerPort": 9814,
                    "protocol": "tcp"
                },
                {
                    "containerPort": 9815,
                    "protocol": "tcp"
                },
                {
                    "containerPort": 9816,
                    "protocol": "tcp"
                },
                {
                    "containerPort": 9817,
                    "protocol": "tcp"
                },
                {
                    "containerPort": 9818,
                    "protocol": "tcp"
                }
            ],
            "essential": true,
            "environment": [
                {
                    "name": "DD_FIPS_PORT_RANGE_START",
                    "value": "9803"
                },
                {
                    "name": "DD_FIPS_LOCAL_ADDRESS",
                    "value": "127.0.0.1"
                }
            ]
        }
   ],
   "family": "datadog-agent-task"
}

また、Datadog Agent のコンテナの環境変数を更新して、FIPS プロキシを介したトラフィックの送信を可能にする必要があります。

{
    "containerDefinitions": [
        {
            "name": "datadog-agent",
            "image": "public.ecr.aws/datadog/agent:latest",
            (...)
            "environment": [
              (...)
                {
                    "name": "DD_FIPS_ENABLED",
                    "value": "true"
                },
                {
                    "name": "DD_FIPS_PORT_RANGE_START",
                    "value": "9803"
                },
                {
                    "name": "DD_FIPS_HTTPS",
                    "value": "false"
                },
             ],
        },
    ],
   "family": "datadog-agent-task"
}

トラブルシューティング

ご不明な点は、Datadog のサポートチームまでお問合せください。

その他の参考資料