😇

[Fargate] context deadline exceeded Error in datadog-agent

2024/10/03に公開

概要

AWS ECS Fargateでサイドカーコンテナとしてdatadog-agentを利用していましたが、下記エラーによりdatadog-agentのhealth checkが通らずコンテナがkillされ、タスク自体が再起動ループに陥るという事象が発生していた。

error pulling from collector "ecs_fargate": Get "http://169.254.170.2/v2/metadata": context deadline exceeded (Client.Timeout exceeded while awaiting headers)

今回はその原因と対応(暫定)について記録する。

事象の整理と解決策

環境

  • AWS ECS Fargate (ap-northeast-1)
  • datadog-agent:7.56.2
  • datadog-agentをサイドカーコンテナとして常駐タスクを起動

タスクメタデータについて

まずFargateはざっくりAWSマネージドのCompute上にタスク単位でコンテナを立てるサービスなのでComputeの情報(ホストなど)はタスクメタデータとしてhttp経由で問い合わせを行う仕組みになっている。
その際のエンドポイントが"http://169.254.170.2/v2/metadata"である。
※参考: Amazon ECS タスクメタデータエンドポイントバージョン 2

起きていた事象

原因はGet "http://169.254.170.2/v2/metadata"のレスポンスがdatadogのヘルスチェックTimeoutを超えていたことだった。

解決策 -> 2024/10時点で根本原因の解決ではなかった

datadog-agentにはヘルスチェックを通すためのTimeoutやAttemptなどを設定できる設定値がある。
ECSのタスク定義上のコンテナ設定値を元々下記のような設定で、ヘルスチェックを5sにしていた。

{
  "cpu": 0,
  "environment": [
    ...
  ],
  "essential": true,
  "healthCheck": {
    "retries": 3,
    "command": ["CMD-SHELL","agent health"],
    "timeout": 5, <- ここ
    "interval": 30,
    "startPeriod": 15
  },
  "image": "public.ecr.aws/datadog/agent:7.56.2",
  "logConfiguration": {
    "logDriver": "awslogs",
    "options": {
      ...
    }
  },
  ...
}

今回、暫定対応としてTimeoutを10sに伸ばすことでレスポンスのタイムアウト超過を防ぐことで凌いだ。

{
  "cpu": 0,
  "environment": [
    ...
  ],
  "essential": true,
  "healthCheck": {
    "retries": 3,
    "command": ["CMD-SHELL","agent health"],
    "timeout": 10, <- ここ
    "interval": 30,
    "startPeriod": 15
  },
  "image": "public.ecr.aws/datadog/agent:7.56.2",
  "logConfiguration": {
    "logDriver": "awslogs",
    "options": {
      ...
    }
  },
  ...
}

根本原因

昨今datadog-agentのメモリリークやメモリ消費量が増加したことによりOut of Memoryになっていたことでcurlによるヘルスチェックが通っていなかった。
datadog-agentの割り当てメモリを増加させることで解消。

おわりに

教訓はdatadog-agentのメモリのハード占有をしない方がいいということ。

Discussion