Dash イベントで発表された新しいサーバーレス、ネットワーク、RUM などの機能をぜひご確認ください! Dash イベントで発表された新機能!

Amazon Elastic Container Service (ECS)

概要

Amazon Elastic Container Service (ECS) は、EC2 インスタンスで実行されるDockerコンテナ用の拡張性とパフォーマンスに優れたコンテナ管理サービスです。

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

  • [AWS ECS 向け Datadog コンテナエージェント v5 のセットアップ][2]
  • [オートディスカバリーを使用した Datadog Host Agent のセットアップ][3]

セットアップ

ECS コンテナおよびタスクを Datadog でモニタリングするには、ECS クラスターの各 EC2 インスタンスでエージェントをコンテナとして実行します。以下にセットアップ方法を説明します。

  1. ECS タスクを追加
  2. IAM ポリシーの作成と修正
  3. Datadog エージェントをDaeson サービスとしてスケジュール

稼働中の EC2 Container Service クラスターが構成されていない場合は、[ECS ドキュメント内の Getting Started セクション][4]を参照してください。

メトリクスの収集

ECS タスクの作成

このタスクにより Datadog コンテナが起動します。コンフィグレーションを変更するには、このタスクの定義を更新します(方法はこのガイドで後述)。APM、DogStatsD、ログを使用している場合は、タスク定義に適切なフラグを設定します。

  • APM を使用する場合は portMappings を設定し、ダウンストリームのコンテナからトレースデータがエージェントサービスに渡るようにします。APM はポート 8126TCP を使用してトレースを受け取るため、このポートを hostPort としてタスク定義内で設定します。なお、他のコンテナからトレースを収集するには、DD_APM_NON_LOCAL_TRAFFIC 環境変数を true に設定しておく必要があります。[APM とコンテナの詳細はこちら][5]を参照してください。

  • DogStatsD を使用している場合は、タスクの定義で 8125hostPortUDP に設定します。他のコンテナからDogStatsD のメトリクス収集を有効にするには、DD_DOGSTATSD_NON_LOCAL_TRAFFIC 環境変数を true に設定する必要があります。

  • ログを使用している場合は、ログ収集ドキュメントを参照してください。

EC2 インスタンスでセキュリティグループ設定を再度チェックします。これらのポートが非公開であること確認してください。Datadog では、プライベート IP アドレスを使用してトレースをコンテナからエージェントへ渡します。

タスクの設定には、[AWS CLI ツール][6]または Amazon Web コンソールを使用できます。

AWS CLI
  1. [datadog-agent-ecs.json]7 をダウンロードします。
  2. datadog-agent-ecs.json を編集し、アカウントの [Datadog API キー][9]を使用して <YOUR_DATADOG_API_KEY> を設定します。
  3. オプション - Datadog EU サイトをご利用の場合は、datadog-agent-ecs.json を編集して DD_SITEDD_SITE:datadoghq.eu に設定します。
  4. オプション - ログの収集を有効にするには、ログの収集ページを参照してください。
  5. オプション - プロセスの収集を有効にするには、プロセスの収集を参照してください。

  6. 次のコマンドを実行します。

    aws ecs register-task-definition --cli-input-json file://path/to/datadog-agent-ecs.json
    
Web UI
  1. AWS コンソールにログインし、EC2 コンテナサービス セクションに移動します。
  2. Datadog を追加するクラスターをクリックします。
  3. 左側の Task Definitions をクリックし、Create new Task Definition ボタンをクリックします。
  4. Task Definition Name に入力します(例: datadog-agent-task)。
  5. Add volume リンクをクリックします。
  6. Namedocker_sockSource Path/var/run/docker.sock と入力し、Add をクリックします。
  7. ボリュームをもう 1 つ追加して、名前を proc、ソースパスを /proc/ にします。
  8. ボリュームをもう 1 つ追加して、名前を cgroup、ソースパスを /sys/fs/cgroup/ (オリジナルの Amazon Linux AMI を使用している場合は /cgroup/) に設定します。
  9. Add container ボタンをクリックします。
  10. Container namedatadog-agent と入力します。
  11. Imagedatadog/agent:latest と入力します。
  12. Maximum memory256 と入力します。: 多くのリソースを使用する場合は、メモリの上限を上げる必要があります。
  13. Advanced container configuration セクションが表示されるまでスクロールし、CPU units10 と入力します。
  14. Env Variables に、Key DD_API_KEY を追加し、値に Datadog API キーを入力します。こうした守秘性の高い情報を S3 に保管したい場合は、[ECS の構成ガイド][10]を参照してください。
  15. DD_TAGS キーを使用して、追加するタグに別の環境変数を追加します。
  16. Storage and Logging セクションまで下へスクロールします。
  17. Mount pointsdocker_sock ソースボリュームを選択し、コンテナのパスに /var/run/docker.sock と入力します。Read only のチェックボックスをオンにします。
  18. proc 用に別のマウントポイントを追加し、コンテナのパスに/host/proc/ と入力します。Read only チェックボックスをオンにします。
  19. cgroup 用に 3 つ目のマウントポイントを追加して、コンテナのパスに /host/sys/fs/cgroup と入力します。Read only チェックボックスをオンにします (オリジナルの Amazon Linux AMI を使用している場合は /host/cgroup/ を使用してください)。

: Datadog タスク定義で CPU を 10 台使用するように設定すると、service:datadog-agentaws.ecs.cpuutilization が 1000% と表示されることがあります。これは AWS が CPU 使用率を表示する際の独特な現象です。CPU の台数を増やすことで、グラフの歪曲を回避できます。

IAM ポリシーの作成と修正

  1. Amazon ECS のメトリクスを収集するために、次のアクセス許可を [Datadog IAM ポリシー][11]に追加します。ECS ポリシーの詳細については、[AWS Web サイトのガイドを参照][12]してください。

    AWS アクセス権限説明
    ecs:ListClusters利用可能なクラスターのリスト作成。
    ecs:ListContainerInstancesクラスターのインスタンスリストを作成。
    ecs:DescribeContainerInstancesリソースや実行中のタスクにメトリクスを追加するインスタンスを記述し、クラスタータグを EC2 インスタンスに追加。

エージェントを Daemon サービスとして実行

Datadog Agent は、各 EC2 インスタンス上の 1 つのコンテナで実行するのが理想的です。最も簡単なのは、Datadog Agent を[デーモンサービス][13]として実行する方法です。

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

実行中のサービスを動的に検出しモニタリング

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

AWSVPC モード

Agent v6.10 以上では、実際のコンテナと Agent コンテナの両方で awsvpc モードがサポートされていますが、以下の条件があります。

  1. awsvpc モードのアプリおよび Agent の場合は、セキュリティグループを以下のように設定する必要があります。
    • Agent のセキュリティグループが、関連するポートの該当するコンテナに到達できること。
    • Agent のセキュリティグループが、TCP ポート 51678 でホストインスタンスに到達できること。ECS Agent コンテナは、ホストネットワークモード (デフォルト) で実行されるか、ポートがホストに連結されている必要があります。

  2. アプリが awsvpc モードで Agent が bridge モードの場合は、ホストインスタンスのセキュリティグループが、関連するポートの該当するコンテナに到達できるようにセキュリティグループを設定する必要があります。

ログの収集

ECS コンテナ内で実行中のアプリケーションにより書き込まれるログをすべて収集し、Datadog アプリケーションに送信する方法は、以下のとおりです。

  1. 前述の手順に従い Datadog エージェントをインストールします。
  2. 次の構成で [datadog-agent-ecs.json][7] ファイル (オリジナルの Amazon Linux AMI を使用している場合は [datadog-agent-ecs1.json][8]) を更新します。
{
    "containerDefinitions": [
    (...)
      "mountPoints": [
        (...)
        {
          "containerPath": "/opt/datadog-agent/run",
          "sourceVolume": "pointdir",
          "readOnly": false
        },
        (...)
      ],
      "environment": [
        (...)
        {
          "name": "DD_LOGS_ENABLED",
          "value": "true"
        },
        {
          "name": "DD_LOGS_CONFIG_CONTAINER_COLLECT_ALL",
          "value": "true"
        },
        (...)
      ]
    }
  ],
  "volumes": [
    (...)
    {
      "host": {
        "sourcePath": "/opt/datadog-agent/run"
      },
      "name": "pointdir"
    },
    (...)
  ],
  "family": "datadog-agent-task"
}

インテグレーションのためのログ収集を有効にする

各コンテナに使用するインテグレーションを特定するには、source 属性を使用します。この属性をコンテナのラベルで直接上書きすれば、[ログのインテグレーション][15]が有効になります。このプロセスの詳細については、Datadog の[ログのオートディスカバリー ガイド][16]を参照してください。

プロセスの収集

以下の方法で、コンテナの処理情報を収集し Datadog に送信します。

  1. 前述の手順に従い Datadog エージェントをインストールします。
  2. 次の構成で [datadog-agent-ecs.json][7] ファイル (オリジナルの Amazon Linux AMI を使用している場合は [datadog-agent-ecs1.json][8]) を更新します。
{
  "containerDefinitions": [
    (...)
      "mountPoints": [
        (...)
        {
          "containerPath": "/etc/passwd",
          "sourceVolume": "passwd",
          "readOnly": true
        },
        (...)
      ],
      "environment": [
        (...)
        {
          "name": "DD_PROCESS_AGENT_ENABLED",
          "value": "true"
        }
      ]
    }
  ],
  "volumes": [
    (...)
    {
      "host": {
        "sourcePath": "/etc/passwd"
      },
      "name": "passwd"
    },
    (...)
  ],
  "family": "datadog-agent-task"
}

トレースの収集

Datadog Agent をインストールしたら、datadog/agent コンテナのタスク定義で次のパラメーターを設定し、[Datadog トレース Agent][17] を有効にします。

  • ポート マッピング : ホスト / コンテナ ポート 8126、プロトコル tcp
  • 環境変数 : DD_APM_ENABLED=trueDD_APM_NON_LOCAL_TRAFFIC=true (他のコンテナからのトレースの収集を有効にする)

アプリケーション コンテナ

[Amazon の EC2 のメタデータエンドポイント][18]では、コンテナを実行している各基盤インスタンスのプライベート IP アドレスを調べられます。この IP アドレスをアプリケーションコンテナ内でトレース Agent のホスト名に設定すると、トレースデータをエージェントに渡すことができます。

各ホストのプライベート IP アドレスを取得するには、次の URL に curl を実行し、APM に渡される各アプリケーション コンテナのトレースエージェント ホスト名の環境変数として結果を設定します。

curl http://169.254.169.254/latest/meta-data/local-ipv4
os.environ['DATADOG_TRACE_AGENT_HOSTNAME'] = <EC2_PRIVATE_IP>

ECS アプリケーションの変数が起動時に設定される場合は、ホスト名を環境変数として設定する必要があります。

あるいは、対象のホスト名をアプリケーションのソースコード内で設定することも可能です。たとえば、以下のとおりです。

import requests
from ddtrace import tracer


def get_aws_ip():
  r = requests.get('http://169.254.169.254/latest/meta-data/local-ipv4')
  return r.text

tracer.configure(hostname=get_aws_ip())
const tracer = require('dd-trace')
const request = require('request')

request('http://169.254.169.254/latest/meta-data/local-ipv4', function (error, resp, body){
  tracer.init({hostname: body})
})

別の言語で Agent ホスト名を設定する例については、Agent ホスト名の変更に関するドキュメントを参照してください。

収集データ

メトリクス

aws.ecs.cpuutilization
(gauge)
Average percentage of CPU units that are used in the cluster or service.
Shown as percent
aws.ecs.cpuutilization.minimum
(gauge)
Minimum percentage of CPU units that are used in the cluster or service.
Shown as percent
aws.ecs.cpuutilization.maximum
(gauge)
Maximum percentage of CPU units that are used in the cluster or service.
Shown as percent
aws.ecs.memory_utilization
(gauge)
Average percentage of memory that is used in the cluster or service.
Shown as fraction
aws.ecs.memory_utilization.minimum
(gauge)
Minimum percentage of memory that is used in the cluster or service.
Shown as fraction
aws.ecs.memory_utilization.maximum
(gauge)
Maximum percentage of memory that is used in the cluster or service.
Shown as fraction
aws.ecs.service.cpuutilization
(gauge)
Average percentage of CPU units that are used in the service.
Shown as percent
aws.ecs.service.cpuutilization.minimum
(gauge)
Minimum percentage of CPU units that are used in the service.
Shown as percent
aws.ecs.service.cpuutilization.maximum
(gauge)
Maximum percentage of CPU units that are used in the service.
Shown as percent
aws.ecs.service.memory_utilization
(gauge)
Average percentage of memory that is used in the service.
Shown as fraction
aws.ecs.service.memory_utilization.minimum
(gauge)
Minimum percentage of memory that is used in the service.
Shown as fraction
aws.ecs.service.memory_utilization.maximum
(gauge)
Maximum percentage of memory that is used in the service.
Shown as fraction
aws.ecs.cluster.cpuutilization
(gauge)
Average percentage of CPU units that are used in the cluster.
Shown as percent
aws.ecs.cluster.cpuutilization.minimum
(gauge)
Minimum percentage of CPU units that are used in the cluster.
Shown as percent
aws.ecs.cluster.cpuutilization.maximum
(gauge)
Maximum percentage of CPU units that are used in the cluster.
Shown as percent
aws.ecs.cluster.memory_utilization
(gauge)
Average percentage of memory that is used in the cluster.
Shown as fraction
aws.ecs.cluster.memory_utilization.minimum
(gauge)
Minimum percentage of memory that is used in the cluster.
Shown as fraction
aws.ecs.cluster.memory_utilization.maximum
(gauge)
Maximum percentage of memory that is used in the cluster.
Shown as fraction
aws.ecs.cpureservation
(gauge)
Average percentage of CPU units that are reserved by running tasks in the cluster.
Shown as percent
aws.ecs.cpureservation.maximum
(gauge)
Maximum percentage of CPU units that are reserved by running tasks in the cluster.
Shown as percent
aws.ecs.cpureservation.minimum
(gauge)
Minimum percentage of CPU units that are reserved by running tasks in the cluster.
Shown as percent
aws.ecs.memory_reservation
(gauge)
Average percentage of memory that is reserved by running tasks in the cluster.
Shown as percent
aws.ecs.memory_reservation.minimum
(gauge)
Minimum percentage of memory that is reserved by running tasks in the cluster.
Shown as percent
aws.ecs.memory_reservation.maximum
(gauge)
Maximum percentage of memory that is reserved by running tasks in the cluster.
Shown as percent
aws.ecs.running_tasks_count
(gauge)
The number of tasks on the container instance that are in the RUNNING status.
aws.ecs.pending_tasks_count
(gauge)
The number of tasks on the container instance that are in the PENDING status.
aws.ecs.registered_cpu
(gauge)
The number of CPU units registered on the container instance
aws.ecs.remaining_cpu
(gauge)
The number of CPU units remaining on the container instance
aws.ecs.registered_memory
(gauge)
The number of Memory units registered on the container instance
aws.ecs.remaining_memory
(gauge)
The number of Memory units remaining on the container instance
aws.ecs.services
(gauge)
The number of services running per cluster
aws.ecs.service.pending
(gauge)
The number of containers pending per service
aws.ecs.service.desired
(gauge)
The number of containers desired per service
aws.ecs.service.running
(gauge)
The number of containers running per service

AWS から取得される各メトリクスには、ホスト名やセキュリティ グループなど、AWS コンソールに表示されるのと同じタグが割り当てられます。

イベント

ノイズを減らすため、AWS ECS とのインテグレーションには自動的にホワイトリストが作成され、次の単語を含むイベントのみを収集します。drainerrorfailinsufficient memorypendingrebootterminate。以下にイベントの例を示します。

ホワイトリストを削除し、Datadog AWS ECS インテグレーションからすべてのイベントを取得できるようにするには、Datadog のサポートチームまでお問い合わせください。

サービスのチェック

  • aws.ecs.agent_connected: Agent が接続できない場合は CRITICAL、それ以外の場合は OK を返します。

トラブルシューティング

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

その他の参考資料