Amazon Fargate
Datadog の調査レポート: サーバーレスの状態 レポート: サーバーレスの状態

Amazon Fargate

Supported OS: Linux Mac OS Windows

概要

ECS Fargate で実行されているすべてのコンテナからメトリクスを取得します。

  • CPU/メモリ使用量および制限のメトリクス
  • Datadog インテグレーションまたはカスタムメトリクスを使用して、Fargate で実行されているアプリケーションを監視

Datadog Agent は、ECS のタスクメタデータエンドポイントからタスク定義のコンテナのメトリクスを取得します。このエンドポイントに関する ECS のドキュメントには、以下のように記載されています。

このエンドポイントは、タスクに関連付けられたすべてのコンテナの Docker 統計 JSON を返します。返される統計の詳細については、Docker API ドキュメント内の ContainerStats を参照してください。

タスクメタデータエンドポイントは、タスク定義自体の内部からのみ使用できます。このため、Datadog Agent をタスク定義内の追加コンテナとして実行する必要があります。

このメトリクスの収集を有効にするために必要な構成は、タスク定義内で環境変数 ECS_FARGATE"true" にすることだけです。

セットアップ

以下の手順では、AWS ECS Fargate 内で Datadog Container Agent をセットアップします。: Fargate インテグレーションを最大限活用するには、Datadog Agent バージョン 6.1.1 以降が必要です。

Datadog Agent を持たないタスクも Cloudwatch からメトリクスを報告しますが、Autodiscovery、詳細なコンテナメトリクス、トレーシングなどの機能には Agent が必要です。さらに、Cloudwatch メトリクスは粒度が低く、Datadog Agent から直接発送されるメトリクスより報告のレイテンシーが高くなります。

インストール

Datadog で ECS Fargate タスクを監視するには、アプリケーションと同じタスク定義内のコンテナとして Agent を実行します。Datadog でメトリクスを収集するには、各タスク定義にアプリケーションコンテナのほかに Datadog Agent コンテナを含める必要があります。以下のセットアップ手順を実行します。

  1. ECS Fargate タスクの追加
  2. IAM ポリシーの作成と修正
  3. Replica サービスとしてのタスクの実行

ECS Fargate タスクの作成

Fargate の主要な作業単位はタスクで、これはタスク定義内で設定されます。タスク定義は、Kubernetes のポッドに相当します。タスク定義には 1 つ以上のコンテナが含まれる必要があります。Datadog Agent を実行するには、アプリケーションコンテナおよび Datadog Agent コンテナを実行するためのタスク定義を作成します。

以下の手順は、AWS CLI ツールまたは Amazon Web Console を使用したタスクの構成方法を示します。

Web UI
  1. AWS Web Console にログインし、ECS セクションに移動します。
  2. 左メニューの Task Definitions をクリックし、Create new Task Definition ボタンをクリックします。
  3. 起動タイプとして Fargate を選択し、Next step ボタンをクリックします。
  4. Task Definition Name にタスク定義名を入力します (my-app-and-datadog など)。
  5. タスク実行 IAM ロールを選択します。下の IAM ポリシーの作成と修正セクションで、権限の要件を確認します。
  6. ニーズに合わせて Task memoryTask CPU を選択します。
  7. Add container ボタンをクリックします。
  8. Container namedatadog-agent と入力します。
  9. Imagedatadog/agent:latest と入力します。
  10. Memory Limits に、ソフト制限として 256 を入力します。
  11. Advanced container configuration セクションまでスクロールし、CPU units10 と入力します。
  12. Env Variablesキー DD_API_KEY を追加し、Datadog API キーを値として入力します。_シークレットを s3 に保存する場合は、ECS 構成ガイドを参照してください_。
  13. キー ECS_FARGATE と値 true を使用して、もう 1 つ環境変数を追加します。Add をクリックしてコンテナを追加します。
  14. (任意) datadog.eu をご利用の場合は、キー DD_SITE と値 datadoghq.eu を使用して別の環境変数を追加します。
  15. アプリなどの他のコンテナを追加します。インテグレーションメトリクスの収集の詳細については、ECS Fargate のインテグレーションセットアップを参照してください。
  16. Create をクリックしてタスク定義を作成します。
AWS CLI
  1. datadog-agent-ecs-fargate.json をダウンロードします。
  2. TASK_NAME とご使用の Datadog API キーで JSON を更新します。環境変数 ECS_FARGATE は既に "true" に設定されています。
  3. アプリなどの他のコンテナを追加します。インテグレーションメトリクスの収集の詳細については、ECS Fargate のインテグレーションセットアップを参照してください。
  4. 次のコマンドを実行して ECS タスク定義を登録します。

    aws ecs register-task-definition --cli-input-json file://<ファイルへのパス>/datadog-agent-ecs-fargate.json

IAM ポリシーの作成と修正

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

AWS アクセス許可説明
ecs:ListClusters使用できるクラスターをリストします。
ecs:ListContainerInstancesクラスターのインスタンスをリストします。
ecs:DescribeContainerInstancesリソースおよび実行中のタスクに関するメトリクスを追加するためのインスタンスを記述します。

Replica サービスとしてのタスクの実行

ECS Fargate では、タスクを Replica サービスとして実行するオプションしかありません。Datadog Agent は、アプリケーションやインテグレーションコンテナと同じタスク定義内で実行されます。

AWS CLI

AWS CLI ツールを使用して次のコマンドを実行します。

: Fargate バージョン 1.1.0 以降が必要です。したがって、以下のコマンドでは、プラットフォームバージョンを指定します。

必要に応じてクラスターを作成します。

aws ecs create-cluster --cluster-name "<クラスター名>"

クラスターのサービスとしてタスクを実行します。

aws ecs run-task --cluster <クラスター名> \
--network-configuration "awsvpcConfiguration={subnets=["<プライベート_サブネット>"],securityGroups=["<セキュリティ_グループ>"]}" \
--task-definition arn:aws:ecs:us-east-1:<AWS_アカウント番号>:task-definition/<タスク名>:1 \
--region <AWS_リージョン> --launch-type FARGATE --platform-version 1.1.0
Web UI
  1. AWS Web Console にログインし、ECS セクションに移動します。必要に応じて、Networking only クラスターテンプレートを使用してクラスターを作成します。
  2. Datadog Agent を実行するクラスターを選択します。
  3. Services タブで、Create ボタンをクリックします。
  4. Launch type で、FARGATE を選択します。
  5. Task Definition で、先ほど作成したタスクを選択します。
  6. Service name に入力します。
  7. Number of tasks1 と入力し、Next step ボタンをクリックします。
  8. Cluster VPCSubnets、および Security Groups を選択します。
  9. Load balancingService discovery をオプションで設定します。
  10. Next step ボタンをクリックします。
  11. Auto Scaling は、オプションで設定します。
  12. Next step ボタンをクリックし、Create service ボタンをクリックします。

メトリクスの収集

上述のように Datadog Agent をセットアップすると、オートディスカバリーを有効にした状態で ecs_fargate チェックがメトリクスを収集します。その他のメトリクスを収集するには、同じタスク内の他のコンテナに Docker ラベルを追加します。

インテグレーションメトリクスの収集の詳細については、ECS Fargate のインテグレーションセットアップを参照してください。

DogStatsD

メトリクスは DogStatsD を使用して UDP ポート 8125 を介して収集されます。

他のコンテナからの DogStatsD パケットをリスニングすることによってカスタムメトリクスを送信するには、Datadog Agent コンテナ内の環境変数 DD_DOGSTATSD_NON_LOCAL_TRAFFICtrue に設定します。

ライブプロセスモニタリング

Datadog Agent コンテナ内の環境変数 DD_PROCESS_AGENT_ENABLEDtrue に設定して、Datadog のプロセス Agent を有効にします。Amazon が Fargate の基底ホストを制御するため、ライブプロセスは Datadog Agent コンテナからしか収集できません。

その他の環境変数

Docker Agent コンテナと共に使用できる環境変数については、Docker Agent ページを参照してください。: 一部の変数は Fargate では使用できません。

グローバルなタグ付けには、DD_DOCKER_LABELS_AS_TAGS の使用をお勧めします。Agent は、この方法を使用して、Docker コンテナラベルからタグを取得します。それには、他の Docker コンテナに適切なラベルを追加する必要があります。ラベルは、タスク定義で直接追加できます。

Agent コンテナのフォーマット

{
  "name": "DD_DOCKER_LABELS_AS_TAGS",
  "value": "{\"<収集するラベル名>\":\"<DATADOG_用タグキー>\"}"
}

Agent コンテナの例

{
  "name": "DD_DOCKER_LABELS_AS_TAGS",
  "value": "{\"com.docker.compose.service\":\"service_name\"}"
}

: DD_HOSTNAME を使用しないでください。Fargate には、ユーザーに対するホストという概念がないからです。従来からホストタグを割り当てるために DD_TAGS が使用されていますが、Datadog Agent バージョン 6.13.0 では、環境変数を使用してインテグレーションメトリクスにグローバルタグを設定することもできます。

クローラーベースのメトリクス

Datadog Agent によって収集されるメトリクスのほかに、Datadog には CloudWatch ベースの ECS インテグレーションがあります。このインテグレーションは、Amazon ECS CloudWatch メトリクスを収集します。

そこに記載されているように、Fargate タスクも次のようにメトリクスを報告します。

使用できるメトリクスは、クラスター内のタスクとサービスの起動タイプによって異なります。サービスに Fargate 起動タイプを使用している場合は、サービスの監視に役立つように、CPU とメモリの使用率メトリクスが提供されます。

この方法は Datadog Agent を使用しないため、インテグレーションタイルで ECS をチェックすることで、Datadog の AWS インテグレーションを構成する必要があります。これで、自動的に Datadog アプリケーションが CloudWatch メトリクス (Datadog 内の aws.ecs.* ネームスペースを使用) を取得します。ドキュメントの 収集データ セクションを参照してください。

必要なメトリクスがこれだけの場合は、このインテグレーションに依存して CloudWatch メトリクスを収集できます。: CloudWatch データは粒度が低く (有効にした監視の種類に応じて 1-5 分)、Datadog への報告にも遅延があります。これは、Agent を使用して Datadog にデータをプッシュするのではなく、AWS の API 制限の範囲内で CloudWatch からデータを収集する必要があるためです。

Datadog のデフォルトの CloudWatch クローラーは、10 分ごとにメトリクスをポーリングします。クローリングスケジュールを速くする必要がある場合は、それが可能かどうかを Datadog のサポートチームにお問い合わせください。: CloudWatch の API 呼び出しは課金対象なので、AWS 側のコストが増大します。

ログの収集

Datadogs Fluentbit アウトプットプラグインに構築されている AWS FireLens インテグレーションを使用してログを Datadog に送信したり、awslogs ログドライバーと Lambda 関数を使用してログをルーティングしたりすることで、Fargate ログを監視できます。AWS FireLens を使用すると Fluent Bit を Fargate タスクで直接構成できるため、Datadog では AWS FireLens の使用をお勧めしています。

Fluent Bit と FireLens

Datadog の Fluent Bit アウトプットプラグインに組み込まれている AWS FireLens インテグレーションを構成して、監視している FireLens のログデータを Datadog ログと接続します。

  1. Fargate タスクの FireLens ログルーターコンテナで Fluent Bit を有効化します。 FireLens の有効化については、専用の AWS Firelens ドキュメントを参照してください。Fargate コンテナの定義については、AWS コンテナ定義ドキュメントを参照してください。AWS では、リージョン別 Docker イメージの使用を推奨しています。下記に、Fluent Bit イメージが構成されたタスク定義の例を示します。

    {
     "essential": true,
     "image": "amazon/aws-for-fluent-bit:latest",
     "name": "log_router",
     "firelensConfiguration": {
       "type": "fluentbit",
       "options": { "enable-ecs-log-metadata": "true" }
     }
    }

    コンテナがシリアル化された JSON ログを stdout 上で公開している場合は、ログが Datadog 内で正しくパースされるよう、次の 追加 Firelens コンフィギュレーションを使用する必要があります。

    {
     "essential": true,
     "image": "amazon/aws-for-fluent-bit:latest",
     "name": "log_router",
     "firelensConfiguration": {
       "type": "fluentbit",
       "options": {
         "enable-ecs-log-metadata": "true",
         "config-file-type": "file",
         "config-file-value": "/fluent-bit/configs/parse-json.conf"
       }
     }
    }

    これにより、シリアル化された JSON が log: フィールドから上位レベルのフィールドに変換されます。詳細については、JSON がシリアル化されたコンテナの stdout ログをパースしている AWS サンプルを参照してください。

  2. 次に、同じ Fargate タスクで、AWS FireLens をログドライバーとして使用し、Fluent Bit にデータが出力されるようにログコンフィギュレーションを定義します。下記に、ログドライバーに FireLens が使用され、Fluent Bit にデータを出力しているタスク定義の例を示します。

    {
     "logConfiguration": {
       "logDriver": "awsfirelens",
       "options": {
         "Name": "datadog",
         "apikey": "<DATADOG_API_KEY>",
         "Host": "http-intake.logs.datadoghq.com",
         "dd_service": "firelens-test",
         "dd_source": "redis",
         "dd_message_key": "log",
         "dd_tags": "project:fluentbit",
         "TLS": "on",
         "provider": "ecs"
       }
     }
    }

    : Datadog EU サイトのオーガニゼーションをご利用の場合は、代わりに Host オプションとして http-intake.logs.datadoghq.eu を使用してください。ご利用可能なパラメーターの全リストは Datadog Fluentbit ドキュメントに記載されています。

  3. これで、Fargate タスクの実行中は常に、Fargate タスクが管理するコンテナの情報を監視しながら、Fluent Bit から Datadog にコンテナログが送信されるようになります。生ログは Log Explorer ページLive Container ビューから確認できるほか、モニターを作成して確認することもできます。

AWS LogDriver

awslogs ログドライバーと Lambda 関数を使用して Fargate ログを監視し、Datadog にルーティングします。

  1. タスクで Fargate AwsLogDriver を定義します。手順については、AWS Fargate 開発者ガイドを参考にしてください。

  2. Fargate タスク定義は、ログ構成で awslogs ログドライバーのみをサポートします。これは、Fargate タスクがログ情報を Amazon CloudWatch Logs に送信するように構成します。次は、awslogs ログドライバーを構成するためのタスク定義のスニペットです。

    {
     "logConfiguration": {
       "logDriver": "awslogs",
       "options": {
         "awslogs-group": "/ecs/fargate-task-definition",
         "awslogs-region": "us-east-1",
         "awslogs-stream-prefix": "ecs"
       }
     }
    }

    タスク定義で awslogs ログドライバーを使用して、コンテナログを CloudWatch Logs に送信する方法については、awslogs ログドライバーを使用するを参照してください。このドライバーは、コンテナが生成したログを収集し、CloudWatch に直接送信します。

  3. 最後に、Lambda 関数を使用して CloudWatch からログを収集し、Datadog に送信します。

トレースの収集

  1. 上の手順に従って、タスク定義に Datadog Agent コンテナを追加し、追加の環境変数 DD_APM_ENABLEDtrue に設定します。

  2. 現在のセットアップに基づいてアプリケーションをインスツルメントします。

  3. アプリケーションが Datadog Agent コンテナと同じタスク定義内で実行されていることを確認します。

収集データ

メトリクス

ecs.fargate.io.ops.write
(rate)
# write operations to the disk
ecs.fargate.io.bytes.write
(rate)
# bytes written to the disk
Shown as byte
ecs.fargate.io.ops.read
(rate)
# read operation on the disk
ecs.fargate.io.bytes.read
(rate)
# bytes read on the disk
Shown as byte
ecs.fargate.cpu.user
(gauge)
Total CPU time consumed per container
Shown as nanosecond
ecs.fargate.cpu.system
(gauge)
Total CPU time consumed by the system
Shown as nanosecond
ecs.fargate.cpu.limit
(gauge)
Limit in percent of the CPU usage
Shown as percent
ecs.fargate.cpu.percent
(gauge)
Percentage of CPU used per container
Shown as percent
ecs.fargate.mem.cache
(gauge)
# of bytes of page cache memory
Shown as byte
ecs.fargate.mem.active_file
(gauge)
# of bytes of file-backed memory on active LRU list
Shown as byte
ecs.fargate.mem.inactive_file
(gauge)
# of bytes of file-backed memory on inactive LRU list
Shown as byte
ecs.fargate.mem.limit
(gauge)
# of bytes memory limit
Shown as byte
ecs.fargate.mem.active_anon
(gauge)
# of bytes of anonymous and swap cache memory on active LRU list
Shown as byte
ecs.fargate.mem.usage
(gauge)
# of bytes of memory used
Shown as byte
ecs.fargate.mem.rss
(gauge)
# of bytes of anonymous and swap cache memory (includes transparent hugepages)
Shown as byte
ecs.fargate.mem.pgpgout
(rate)
# of uncharging events to the memory cgroup. The uncharging event happens each time a page is unaccounted from the cgroup
ecs.fargate.mem.pgpgin
(rate)
# of charging events to the memory cgroup. The charging event happens each time a page is accounted as either mapped anon page(RSS) or cache page(Page Cache) to the cgroup.
ecs.fargate.mem.pgfault
(rate)
# of page faults per second
ecs.fargate.mem.pgmajfault
(rate)
# of major page faults per second
ecs.fargate.mem.mapped_file
(gauge)
# of bytes of mapped file (includes tmpfs/shmem)
Shown as byte
ecs.fargate.mem.max_usage
(gauge)
Show max memory usage recorded
Shown as byte
ecs.fargate.mem.hierarchical_memory_limit
(gauge)
# of bytes of memory limit with regard to hierarchy under which the memory cgroup is
Shown as byte
ecs.fargate.mem.hierarchical_memsw_limit
(gauge)
# of bytes of memory+swap limit with regard to hierarchy under which memory cgroup is
Shown as byte
ecs.fargate.net.rcvd_errors
(gauge)
# received errors (Fargate 1.4.0+ required)
Shown as error
ecs.fargate.net.sent_errors
(gauge)
# sent errors (Fargate 1.4.0+ required)
Shown as error
ecs.fargate.net.packet.in_dropped
(gauge)
# ingoing packets dropped (Fargate 1.4.0+ required)
Shown as packet
ecs.fargate.net.packet.out_dropped
(gauge)
# outgoing packets dropped (Fargate 1.4.0+ required)
Shown as packet
ecs.fargate.net.bytes_rcvd
(rate)
# bytes received (Fargate 1.4.0+ required)
Shown as byte
ecs.fargate.net.bytes_sent
(rate)
# bytes sent (Fargate 1.4.0+ required)
Shown as byte

イベント

ECS Fargate チェックには、イベントは含まれません。

Service Checks

fargate_check
Agent が Fargate に接続できない場合は CRITICAL を返します。それ以外の場合は OK を返します。

トラブルシューティング

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

その他の参考資料