goodbyegangsterのブログ

備忘録的な

DatadogでFargateを監視する

FargateをDatadogで監視してみます。前回調べたECSでは、ECS Container Instance(Docker Host)のDockerソケット等をコンテナ上にマウントして情報収集するという方法でしたが、Dockerホストが公開されていないFargateではどのように収集しているのか、併せて確認します。

公式のドキュメントはこちら。

ECS Fargate


作業

監視する方法ですが、監視対象とするタスク定義にて、Docker Anget用コンテナを一緒に起動しろ、との話です。タスク定義で追加する情報は公式で教えてくれており、下記となります。

  • 予約CPUユニット
    • 10
  • 予約Memoryサイズ
    • 256
  • Image
    • datadog/agent:latest
  • コンテナ環境変数
    • DD_API_KEY
      • 利用するDatadogのAPIキー
    • ECS_FARGATE
      • trueとしておく

CloudFormationで準備した場合は下記となります。CloudwatchLogsにログ出力する設定を合わせて入れています。

ContainerDefinitions:
  -
    # Command:
    #   - String
    Cpu: 10
    # DisableNetworking: Boolean
    # DnsSearchDomains:
    #   - String
    # DnsServers:
    #   - String
    # DockerLabels:
    #   文字列: String
    # DockerSecurityOptions:
    #   - String
    # EntryPoint:
    #   - String
    Environment:
      - Name: "DD_API_KEY"
        Value: "xxxxxxxxxxxxxxxxxxxxx"
      - Name: "ECS_FARGATE"
        Value: "true"
    Essential: "true"
    # ExtraHosts:
    #   - HostEntry
    # HealthCheck:
    #   HealthCheck
    # Hostname: String
    Image: "datadog/agent:latest"
    # Links:
    #   - 文字列
    # LinuxParameters:
    #   LinuxParameters
    LogConfiguration:
      LogDriver: "awslogs"
      Options:
        awslogs-create-group: true
        awslogs-group: "/fargate/datadog-agent"
        awslogs-region: !Ref "AWS::Region"
        awslogs-stream-prefix: "datadog-agent"
    # Memory: Integer
    MemoryReservation: 256
    # MountPoints:
    #   - MountPoint
    Name: "datadog-agent"
    # PortMappings:
    #   - PortMapping
    # Privileged: Boolean
    # ReadonlyRootFilesystem: Boolean
    # RepositoryCredentials:
    #   RepositoryCredentials
    # Ulimits:
    #   - Ulimit
    # User: String
    # VolumesFrom:
    #   - VolumeFrom
    # WorkingDirectory: String

IAMユーザの用意

利用するECS Task Roleで、以下のIAMポリシーを許可する必要があります。

  • ecs:ListClusters
  • ecs:ListContainerInstances
  • ecs:DescribeContainerInstances

サービス起動

で、作ったタスク定義を、サービスにしてFargateで動かせばDatadogで監視できるようになります。その際に、DatadogではFargateのIntegrationが自動でインストールされるようです。

取得できるメトリックスは下記となります。ECSで取得できるメトリックスとは異なっていますね。

ECS Fargate


どこから情報を取得しているのか

Datadog Agent コンテナは、どこから情報を取得しているのか。

それは タスクメタデータエンドポイント となります。最近のFargateやECSでは、DockerのStats情報を返してくれるHTTPエンドポイントが提供されています。

Amazon ECS コンテナエージェントのバージョン 1.17.0 から、さまざまなタスクメタデータおよび Docker 統計を、Amazon ECS コンテナエージェントによって指定される HTTP エンドポイントで awsvpc ネットワークモードを使用するタスクで利用できます。

awsvpc ネットワークモードで起動されたタスクに属するすべてのコンテナには、事前定義されたリンクローカルアドレス範囲内のローカル IPv4 アドレスが割り当てられます。コンテナがメタデータエンドポイントをクエリする場合、Amazon ECS コンテナエージェントによって、一意の IP アドレスに基づきコンテナが属するタスクが判別され、そのタスクのメタデータと統計が返されます。

タスクメタデータエンドポイントバージョン 2 - Amazon Elastic Container Service

エンドポイントには、以下4種類が用意されています。

  • 169.254.170.2/v2/metadata
    • タスクに関連付けられたすべてのコンテナのコンテナ ID および名前のリストを返す
  • 169.254.170.2/v2/metadata/<container-id>
  • 169.254.170.2/v2/stats
  • 169.254.170.2/v2/stats/<container-id>

実際に、sshdを動作するコンテナをFargate上で動かして、コンテナにssh接続してエンドポイントにアクセスすると、以下のように情報を取得できます。

# curl http://169.254.170.2/v2/metadata
{
    "Cluster": "arn:aws:ecs:ap-northeast-1:XXXXXXXXXX:cluster/fargate-sample",
        (略)
    "PullStoppedAt": "2019-04-04T05:09:05.532884872Z"
}

Datadog Agentは、この情報を収集してくれています訳ですね。