インフラ

CDKを使ってECSにDatadogAgentコンテナを追加して監視してみた

datadog

CDKでECSにDatadogAgentコンテナを追加して、Datadog上からメトリクスを確認してみました。
ECS on Fargateで実施しました。

参考 DatadogをインストールしたECSのCFnテンプレート

Contents

CDKを使ってECSにDatadogAgentコンテナを追加

AWSインテグレーションの有効化

Datadog側でAWSインテグレーションを有効化します。
有効化することで、ECSサービスのタスク数などのメトリクスがDatadog上から確認できます。

Datadog Docs>Integration>AWS
DatadogでAWSインテグレーションのモニターを作成してみた

事前準備: DatadogのAPIキーをシークレットマネージャーに登録

DatadogのAPIキーをECSの環境変数にセットする必要があります。
直接書くこともできますが、シークレットマネージャーにDatadogのAPIキーを保存してECSはシークレットマネージャーからキーを取るようにします。

aws secretsmanager create-secret --name datadog-api-key --secret-string 

Datadog API キーとアプリケーションキー

CDKデプロイ

公式ドキュメントの内容にできるだけ合わせて、CDK書きました。
(コンテナレジストリがWeb UIの手順はGCRで、awscliの手順はECRなのが気になりました)
Datadog DOCS > INTEGRATIONS > Amazon Fargate


import { Duration, RemovalPolicy, Stack, StackProps } from "aws-cdk-lib"
import { Construct } from "constructs"
import * as ec2 from "aws-cdk-lib/aws-ec2"
import * as ssm from "aws-cdk-lib/aws-ssm"
import * as ecsPatterns from "aws-cdk-lib/aws-ecs-patterns"
import * as ecs from "aws-cdk-lib/aws-ecs"
import * as logs from "aws-cdk-lib/aws-logs"
import * as secretsmanager from 'aws-cdk-lib/aws-secretsmanager'

export class EcsAlbFargateServiceStack extends Stack {
  service: ecs.FargateService

  constructor(
    scope: Construct,
    id: string,
    props: StackProps
  ) {
    super(scope, id, props)

    // 任意の方法でVPC IDを取得する
    const vpcId = ssm.StringParameter.valueFromLookup(this, "/cdk/vpc/vpcId")
    const vpc = ec2.Vpc.fromLookup(this, "Vpc", { vpcId })

    const taskDef = new ecs.FargateTaskDefinition(this, "TaskDef", {
      cpu: 256,
      memoryLimitMiB: 512
    })

    // CloudwatchLogs
    const webLogGroup = new logs.LogGroup(this, "WebLogGroup", {
      logGroupName: "/ecs/demo-app/web",
      retention: logs.RetentionDays.SIX_MONTHS,
      removalPolicy: RemovalPolicy.DESTROY
    })
    const datadogLogGroup = new logs.LogGroup(this, "DatadogLogGroup", {
      logGroupName: "/ecs/demo-app/datadog",
      retention: logs.RetentionDays.SIX_MONTHS,
      removalPolicy: RemovalPolicy.DESTROY
    })

    // Web Container
    const webPort = 80

    const web = taskDef.addContainer("Web", {
      image: ecs.ContainerImage.fromRegistry("httpd:2.4"),
      containerName: "web",
      logging: new ecs.AwsLogDriver({
        streamPrefix: "web",
        logGroup: webLogGroup
      })
    })
    web.addPortMappings({
      containerPort: webPort,
      hostPort: webPort,
      protocol: ecs.Protocol.TCP
    })

    // Datadog Container
    const ddApiKey = ecs.Secret.fromSecretsManager(
      secretsmanager.Secret.fromSecretNameV2(this, "DatadogApiKey", "datadog-api-key"),
    )

    taskDef.addContainer("Datadog", {
      image: ecs.ContainerImage.fromRegistry("public.ecr.aws/datadog/agent:latest"),
      memoryLimitMiB: 256,
      containerName: "datadog",
      logging: ecs.LogDriver.awsLogs({
        streamPrefix: "datadog",
        logGroup: datadogLogGroup
      }),
      environment: {
        ECS_FARGATE: "true",
      },
      secrets: {
        DD_API_KEY: ddApiKey
      }
      
    })

    // Ecs Cluster
    const cluster = new ecs.Cluster(this, "Cluster", {
      vpc,
      containerInsights: true
    })

    // Alb FargateService
    const loadBalancedFargateService =
      new ecsPatterns.ApplicationLoadBalancedFargateService(
        this,
        "FargateService",
        {
          cluster,
          desiredCount: 1,
          taskDefinition: taskDef,
          taskSubnets: {
            subnets: vpc.privateSubnets
          },
          openListener: true,
          circuitBreaker: {
            rollback: true
          },
          // デモ用デプロイ時間短縮
          healthCheckGracePeriod: Duration.seconds(10)
        }
      )

    // デモ用デプロイ時間短縮
    loadBalancedFargateService.targetGroup.setAttribute(
      "deregistration_delay.timeout_seconds",
      "30"
    )
  }
}

Datadog上から確認する

上記をデプロイすると、Datadog上から確認できます。

Infrastructure > Containers

DatadogAgentを追加したことでコンテナごとのCPUやMemoryなどのメトリクスが確認できるようになりました。

まとめ

CDKでECSにDatadogAgentのコンテナを追加してみました。

Datadog日本語のドキュメントも充実していていいですね。
DatadogAgentコンテナの記述については使い回せると思うので、カスタムコンストラクト作っておくのもいいかと思います。

cdk
ブラウザでCDKを試せるツール「cdk-web」を使ってみたブラウザ上で、cdkを試せるツール「cdk-web」というツールがあります。 便利そうなので、ざっくり紹介します。 どんなツール? ...
外形監視
Cloudwatch,NewRelic,Datadog外形監視Saasを比較してみるこんにちは、ちゃりおです。 サービスの外形監視いれていますか。 可用性のモニタリングやエンドポイント監視に外形監視サービスが便利です。...
aws sso datadog
AWS SSOでDatadogにログインするこんにちは、ちゃりおです。 最近、Datadogを利用しています。 ユーザ管理どうしようか迷っていました。 漠然とSSOで行けたらい...