【入門】 Datadogの「Amazon ECS on AWS Fargate」統合を用いてCDKでFargate環境のメトリクス監視をやってみた

【入門】 Datadogの「Amazon ECS on AWS Fargate」統合を用いてCDKでFargate環境のメトリクス監視をやってみた

2025.10.05

はじめに

みなさんこんにちは、クラウド事業本部コンサルティング部の浅野です。

今回はDatadogの数ある統合機能の中から「Amazon ECS on AWS Fargate」統合を使用してAWS Fargateのメトリクス監視をCDKで構築してみました。

今回はメトリクス監視のみで、ログ収集は設定しません。
ログ収集に関しては以下のブログが参考になると思います!

https://dev.classmethod.jp/articles/ecs-fargate-datadog-logcollection-guide/

構成

2025-10-05-datadog-ecs-on-fargate-integration-01

AWS側では東京リージョンでFargateタスクを1つ起動し、サイドカーコンテナとしてDatadog Agentを含めたコンテナを用意し、メインである「nginx」コンテナ内メトリクスの監視を行います。

今回は諸事情でDatadogはUS1サイトを使用しています。

1タスク定義内に以下コンテナを定義

  • nginx コンテナ
  • Datadog Agentサイドカーコンテナ

※ 今回のFargate統合を使用するためには、Datadog Agentバージョン6.1.1以降 が必要です。

Fargate監視に関するDatadogの料金体系

構築に入る前にFargate監視に関するDatadogの料金体系を軽くまとめてみます。

料金ページを見てみるとプランごとにコンテナ内監視の無料枠が設定されています。

コンテナはどのように監視されますか。
Datadog Agent は、ホスト上の任意の数のコンテナと共にコンテナ内で実行されます。そこから、隣接するコンテナやホスト自体からメトリクスを収集することができます。プランによっては、各ホスト・ライセンスに対して 5 個または 10 個のコンテナを無料でモニタリングできます。追加のコンテナは、コンテナあたり 1 時間あたり $0.003 で請求されます。 さらに、プリペイドコンテナを 1 コンテナあたり月額 $1.25 で購入することができます。

上記説明のように、Proプランの場合だとホストあたり「5コンテナ/月」が無料枠で設定されており、超過した分のコンテナ1台につき「$0.003/h」かかります。

上記説明で抑えておきたいのは、Proプランの場合だと 「Datadogのアカウントあたり 5コンテナ/月 の無料枠」 ではなく、「1ホストあたりの無料枠が5コンテナ」 ということです。では「ホスト」とはどのように定義されているのでしょうか。

ホストとは、Datadog で監視する物理的または仮想の OS インスタンスであり、サーバー、VM、ノード (Kubernetes の場合)、App Service Plan インスタンス (Azure App Service の場合)、または Heroku dyno (Heroku プラットフォームの場合) などが含まれます。ホストには、Datadog Agent がインストールされたインスタンスのほか、Datadog インテグレーションを使用して監視されているすべての Amazon EC2、Google Cloud、Azure、vSphere VM が含まれます。Agent がインストールされている EC2 または VM は、1 つのインスタンスとしてカウントされます (二重課金はされません)。
報告を行っていないホスト (インフラストラクチャーリストでステータスが INACTIVE) は、課金の対象になりません。そのようなホストがインフラストラクチャーリストから除外されるまで、最大 2 時間かかることがあります。Datadog は、これらのホスト (有料アカウント) の履歴データを保持します。ホスト名またはタグがわかれば、メトリクスをダッシュボードでグラフ化できます。

と記載があり、Fargateの場合は起動するノード、どうやら1タスク = 1ホストと思って良さそうです。

つまりProプランの場合は1タスク定義あたり「5コンテナ/月」の監視まで無料枠の範囲ということです。

さらに「よくある質問」を眺めていると以下の記述を見つけました。

Datadog Agent コンテナは割り当てに対してカウントされますか?
いいえ。Datadog Agent コンテナは、5 (Pro ティア) または 10 (Enterprise ティア) の割り当てにはカウントされません。

つまり今回の構成の場合は「nginx」コンテナ分のみカウントされ、サイドカーコンテナであるDatadog Agentをインストールしたコンテナは使用量としてカウントされないということになります。

さらに、設定によってカスタムメトリクス数等によっても異なる料金体系が設定されていますので、詳しくは料金ページを参照ください。

やってみた

Datadogでは様々なサービスとの統合機能をデフォルトで揃えてくれています。

今回はそのうちの一つである「AWS ECS on AWS Fargate」インテグレーションを用いてFargate内のコンテナ監視を実現します。

https://docs.datadoghq.com/ja/integrations/ecs_fargate/?tab=webui

この統合機能によって収集してくれるメトリクスは以下になります。

※上記ドキュメントから抜粋 原文ママ

メトリクス名 タイプ 説明 単位
ecs.fargate.cpu.limit gauge Soft limit (CPU Shares) in CPU Units. CPU Units
ecs.fargate.cpu.percent gauge Percentage of CPU used per container (Linux only). percent
ecs.fargate.cpu.system gauge System CPU time. nanocore
ecs.fargate.cpu.task.limit gauge Task CPU Limit (shared by all containers). nanocore
ecs.fargate.cpu.usage gauge Total CPU Usage. nanocore
ecs.fargate.cpu.user gauge User CPU time. nanocore
ecs.fargate.ephemeral_storage.reserved gauge The reserved ephemeral storage of this task. (Fargate 1.4.0+ required). mebibyte
ecs.fargate.ephemeral_storage.utilized gauge The current ephemeral storage usage of this task. (Fargate 1.4.0+ required). mebibyte
ecs.fargate.io.bytes.read gauge Number of bytes read on the disk. byte
ecs.fargate.io.bytes.write gauge Number of bytes written to the disk. byte
ecs.fargate.io.ops.read gauge Number of read operations on the disk. -
ecs.fargate.io.ops.write gauge Number of write operations to the disk. -
ecs.fargate.mem.active_anon gauge Number of bytes of anonymous and swap cache memory on active LRU list (Linux only). byte
ecs.fargate.mem.active_file gauge Number of bytes of file-backed memory on active LRU list (Linux only). byte
ecs.fargate.mem.cache gauge Number of bytes of page cache memory (Linux only). byte
ecs.fargate.mem.hierarchical_memory_limit gauge Number of bytes of memory limit with regard to hierarchy under which the memory cgroup is (Linux only). byte
ecs.fargate.mem.hierarchical_memsw_limit gauge Number of bytes of memory+swap limit with regard to hierarchy under which memory cgroup is (Linux only). byte
ecs.fargate.mem.inactive_file gauge Number of bytes of file-backed memory on inactive LRU list (Linux only). byte
ecs.fargate.mem.limit gauge Number of bytes memory limit (Linux only). byte
ecs.fargate.mem.mapped_file gauge Number of bytes of mapped file (includes tmpfs/shmem) (Linux only). byte
ecs.fargate.mem.max_usage gauge Show max memory usage recorded. byte
ecs.fargate.mem.pgfault gauge Number of page faults per second (Linux only). -
ecs.fargate.mem.pgmajfault gauge Number of major page faults per second (Linux only). -
ecs.fargate.mem.pgpgin gauge Number of charging events to the memory cgroup (Linux only). -
ecs.fargate.mem.pgpgout gauge Number of uncharging events to the memory cgroup (Linux only). -
ecs.fargate.mem.rss gauge Number of bytes of anonymous and swap cache memory (includes transparent hugepages) (Linux only). byte
ecs.fargate.mem.task.limit gauge Task Memory Limit (shared by all containers). byte
ecs.fargate.mem.usage gauge Number of bytes of memory used. byte
ecs.fargate.net.bytes_rcvd gauge Number of bytes received (Fargate 1.4.0+ required). byte
ecs.fargate.net.bytes_sent gauge Number of bytes sent (Fargate 1.4.0+ required). byte
ecs.fargate.net.packet.in_dropped gauge Number of ingoing packets dropped (Fargate 1.4.0+ required). packet
ecs.fargate.net.packet.out_dropped gauge Number of outgoing packets dropped (Fargate 1.4.0+ required). packet
ecs.fargate.net.rcvd_errors gauge Number of received errors (Fargate 1.4.0+ required). error
ecs.fargate.net.sent_errors gauge Number of sent errors (Fargate 1.4.0+ required). error

1. 統合ダッシュボードの有効化

まずDatadogのダッシュボード画面のサイドバーから「Integrations」を選択します。

2025-10-05-datadog-ecs-on-fargate-integration-02

検索画面からキーワードを入力し「Amazon ECS on AWS Fargate by Datadog」を探します。

2025-10-05-datadog-ecs-on-fargate-integration-03

「Install Integration」をクリックし、統合を有効にします。この設定で統合ダッシュボードが一覧に出てくるようになり、上記メトリクスが収集可能になります。

ステータスが「✔︎ INSTALLED」に切り替わればOK
2025-10-05-datadog-ecs-on-fargate-integration-04

2. Datadog APIキーをSecrets Managerへ保存する。

コンテナ内のDatadog AgentがデータをDatadog側に送信する際に認証としてAPIキーを使用します。
ECSのタスク定義に設定する必要があるので、事前にダッシュボードから出力しましょう。

サイドバーのプロフィールから「API Keys」を選択します。

「+ New Key」を選択し名前をつけて出力すればOKです。

2025-10-05-datadog-ecs-on-fargate-integration-05

以下のコマンドで出力したAPIキーをSecrets Managerに保存します。

			
			aws secretsmanager create-secret --name demo-datadog-api-key --secret-string "********************" --region ap-northeast-1

{
    "ARN": "arn:aws:secretsmanager:ap-northeast-1:************:secret:demo-datadog-api-key-8yM5FT",
    "Name": "demo-datadog-api-key",
    "VersionId": "***********************"
}

		

Secrets Managerに保存したキーの「ARN」をCDKで参照するので、ローカル環境の環境変数として以下のように設定しておきます。参照のやり方は自由で大丈夫です。

			
			export DD_API_KEY_SECRET_ARN="arn:aws:secretsmanager:ap-northeast-1:*************:secret:demo-datadog-api-key-8yM5FT"

		

3. CDKプロジェクトの用意

ローカル環境でTypescriptでcdk init --language typescriptを実行し以下フォルダを用意しました。

			
			.
├── app
│   ├── Dockerfile
│   └── nginx.conf
├── bin
│   └── demo-fargate-datadog-sidecar.ts
├── cdk.json
├── jest.config.js
├── lib
│   └── demo-fargate-datadog-sidecar-stack.ts
├── node_modules
├── package-lock.json
├── package.json
└── tsconfig.json

		

app/Dockerfileにnginx周りの設定を追加しました。

app/
Dockerfile
			
			FROM nginx:alpine

# Copy nginx configuration
COPY nginx.conf /etc/nginx/nginx.conf

# Expose port
EXPOSE 80

# Start nginx
CMD ["nginx", "-g", "daemon off;"]


		
nginx.conf
			
			events {
    worker_connections 1024;
}

http {
    server {
        listen 80;
        server_name _;

        location / {
            return 200 "Hello from nginx\n";
            add_header Content-Type text/plain;
        }
    }
}


		

lib/demo-fargate-datadog-sidecar-stack.tsファイルに以下のリソースを定義しました。

  • VPC (10.0.0.0/16)

  • Public Subnet × 2

  • Private Subnet × 2

  • 各ルートテーブル & Association

  • NAT Gateway × 1

  • Internet Gateway

  • ALB用SG - インターネット→80番ポート許可

  • ECS用SG - ALB→80番ポート許可

  • ALB - Public Subnetに配置

    • ターゲットグループ - ヘルスチェックパス/
    • リスナー - HTTP:80
  • クラスター - demo-fargate-datadog-cluster

  • Fargateサービス - demo-fargate-datadog-service (Private Subnetに1タスク配置)

  • タスク定義

    • nginxコンテナ - ./appからビルド(AMD64)
  • CloudWatch Logs

    • /ecs/demo-fargate-datadog
CDKスタックの中身
demo-fargate-datadog-sidecar-stack.ts
			
			import * as cdk from 'aws-cdk-lib';
import * as ec2 from 'aws-cdk-lib/aws-ec2';
import * as ecs from 'aws-cdk-lib/aws-ecs';
import * as elbv2 from 'aws-cdk-lib/aws-elasticloadbalancingv2';
import * as logs from 'aws-cdk-lib/aws-logs';
import { Platform } from 'aws-cdk-lib/aws-ecr-assets';
import { Construct } from 'constructs';
import { DatadogECSFargate } from 'datadog-cdk-constructs-v2';

export class DemoFargateDatadogSidecarStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    // VPCの作成
    const vpc = new ec2.Vpc(this, 'DemoVpc', {
      vpcName: 'demo-fargate-datadog-vpc',
      ipAddresses: ec2.IpAddresses.cidr('10.0.0.0/16'),
      maxAzs: 2,
      natGateways: 1,
      subnetConfiguration: [
        {
          cidrMask: 24,
          name: 'Public',
          subnetType: ec2.SubnetType.PUBLIC,
        },
        {
          cidrMask: 24,
          name: 'Private',
          subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS,
        },
      ],
    });

    // VPCにタグを追加
    cdk.Tags.of(vpc).add('Name', 'demo-fargate-datadog-vpc');

    // ALB用セキュリティグループの作成
    const albSecurityGroup = new ec2.SecurityGroup(this, 'ALBSecurityGroup', {
      securityGroupName: 'demo-fargate-datadog-alb-sg',
      description: 'Security group for ALB',
      vpc: vpc,
      allowAllOutbound: true,
    });

    // インターネットからのHTTPアクセスを許可
    albSecurityGroup.addIngressRule(
      ec2.Peer.anyIpv4(),
      ec2.Port.tcp(80),
      'Allow HTTP from internet'
    );

    // ECSサービス用セキュリティグループの作成
    const ecsSecurityGroup = new ec2.SecurityGroup(this, 'ECSSecurityGroup', {
      securityGroupName: 'demo-fargate-datadog-ecs-sg',
      description: 'Security group for ECS Fargate tasks',
      vpc: vpc,
      allowAllOutbound: true,
    });

    // ALBからのHTTPアクセスを許可
    ecsSecurityGroup.addIngressRule(
      albSecurityGroup,
      ec2.Port.tcp(80),
      'Allow HTTP from ALB'
    );

    // ECSクラスターの作成
    const cluster = new ecs.Cluster(this, 'DemoCluster', {
      clusterName: 'demo-fargate-datadog-cluster',
      vpc: vpc,
    });

    // ALBの作成
    const alb = new elbv2.ApplicationLoadBalancer(this, 'DemoALB', {
      loadBalancerName: 'demo-fargate-datadog-alb',
      vpc: vpc,
      internetFacing: true,
      vpcSubnets: {
        subnetType: ec2.SubnetType.PUBLIC,
      },
      securityGroup: albSecurityGroup,
    });

    // ターゲットグループの作成
    const targetGroup = new elbv2.ApplicationTargetGroup(this, 'DemoTargetGroup', {
      targetGroupName: 'demo-fargate-tg',
      vpc: vpc,
      port: 80,
      protocol: elbv2.ApplicationProtocol.HTTP,
      targetType: elbv2.TargetType.IP,
      healthCheck: {
        path: '/',
        interval: cdk.Duration.seconds(30),
        timeout: cdk.Duration.seconds(5),
        healthyThresholdCount: 2,
        unhealthyThresholdCount: 3,
      },
      deregistrationDelay: cdk.Duration.seconds(30),
    });

    // リスナーの作成
    alb.addListener('DemoListener', {
      port: 80,
      protocol: elbv2.ApplicationProtocol.HTTP,
      defaultTargetGroups: [targetGroup],
    });

    // CloudWatch Logsロググループの作成
    const logGroup = new logs.LogGroup(this, 'DemoLogGroup', {
      logGroupName: '/ecs/demo-fargate-datadog',
      removalPolicy: cdk.RemovalPolicy.DESTROY,
      retention: logs.RetentionDays.ONE_WEEK,
    });

    // Datadog ECS Fargateコンストラクトの初期化
    const datadogECS = new DatadogECSFargate({
      apiKeySecretArn: process.env.DD_API_KEY_SECRET_ARN,
      site: 'datadoghq.com',
      imageVersion: '7-rc-full',
      env: 'demo',
      service: 'demo-nginx',
    });

    // Datadogコンストラクトを使用したタスク定義の作成
    const taskDefinition = datadogECS.fargateTaskDefinition(this, 'DemoTaskDef', {
      family: 'demo-fargate-datadog-task',
      cpu: 512,
      memoryLimitMiB: 1024,
    });

    // メインアプリケーションコンテナ(nginx)の追加
    taskDefinition.addContainer('nginx', {
      containerName: 'nginx',
      image: ecs.ContainerImage.fromAsset('./app', {
        platform: Platform.LINUX_AMD64,
      }),
      logging: ecs.LogDrivers.awsLogs({
        streamPrefix: 'nginx',
        logGroup: logGroup,
      }),
      portMappings: [
        {
          containerPort: 80,
          protocol: ecs.Protocol.TCP,
        },
      ],
      essential: true,
    });

    // Fargateサービスの作成
    const service = new ecs.FargateService(this, 'DemoService', {
      serviceName: 'demo-fargate-datadog-service',
      cluster: cluster,
      taskDefinition: taskDefinition,
      desiredCount: 1,
      minHealthyPercent: 100,
      maxHealthyPercent: 200,
      enableExecuteCommand: true,
      vpcSubnets: {
        subnetType: ec2.SubnetType.PRIVATE_WITH_EGRESS,
      },
      assignPublicIp: false,
      securityGroups: [ecsSecurityGroup],
      healthCheckGracePeriod: cdk.Duration.seconds(60),
    });

    // サービスをターゲットグループに登録
    service.attachToApplicationTargetGroup(targetGroup);
  }
}


		

「AWS ECS on AWS Fargate」統合のドキュメントでも説明されていますが、Datadog側でCDK上での設定を簡潔にするためにコンストラクトを用意してくれています。今回はそちらを使用しています。

https://github.com/datadog/datadog-cdk-constructs/

以下README.mdに使い方が詳しく記載されているのでお読みください。

https://github.com/DataDog/datadog-cdk-constructs/blob/main/src/ecs/fargate/README.md

Datadog Agentのヘルスチェック構成やコンテナの依存関係(Datadog Agentサイドカーコンテナ → メインコンテナ)、メトリクスだけでなくログ収集に関する詳細な設定など様々なプロパティが用意されており、簡単に設定できるようになっています。

本記事では以下のようにインスタンスを初期化しています。

			
			// Datadog ECS Fargateコンストラクトの初期化
const datadogECS = new DatadogECSFargate({
    apiKeySecretArn: process.env.DD_API_KEY_SECRET_ARN,
    site: 'datadoghq.com',
    imageVersion: '7-rc-full',
    env: 'demo',
    service: 'demo-nginx',
});

		
  • あらかじめ環境変数に設定しておいたDatadog APIキー「DD_API_KEY_SECRET_ARN」を参照
  • 今回はメトリクスをDatadog AgentからUS1サイトのDatadog環境に送信する必要があるため「site: datadoghq.com」を定義
  • ECR内のDatadog公式イメージのバージョンを指定
  • 環境タグ、サービスタグを設定

環境タグやサービスタグはDatadogの「統合サービスタグ付け」として認識されます。詳しい機能は以下を参照してください。

https://docs.datadoghq.com/ja/getting_started/tagging/unified_service_tagging/?utm_source=chatgpt.com&tab=kubernetes

Datadogのサイトについては以下のドキュメントを参照ください。
https://docs.datadoghq.com/ja/getting_started/site/

Datadog Agent 公式コンテナイメージについては以下で確認できます。

https://gallery.ecr.aws/datadog/agent

4. デプロイ & AWS側設定確認

上記スタックでcdk deployを行いました。環境が作成され、設定したタスク定義は以下のようになりました。

task-definition.json
			
			{
  "compatibilities": [
    "EC2",
    "FARGATE"
  ],
  "containerDefinitions": [
    {
      "command": [],
      "cpu": 0,
      "credentialSpecs": [],
      "dnsSearchDomains": [],
      "dnsServers": [],
      "dockerLabels": {},
      "dockerSecurityOptions": [],
      "entryPoint": [],
      "environment": [
        {
          "name": "DD_DOGSTATSD_ORIGIN_DETECTION_CLIENT",
          "value": "true"
        },
        {
          "name": "DD_INSTALL_INFO_TOOL_VERSION",
          "value": "datadog-cdk-constructs"
        },
        {
          "name": "DD_ECS_TASK_COLLECTION_ENABLED",
          "value": "true"
        },
        {
          "name": "DD_DOGSTATSD_ORIGIN_DETECTION",
          "value": "true"
        },
        {
          "name": "DD_SITE",
          "value": "datadoghq.com"
        },
        {
          "name": "DD_INSTALL_INFO_INSTALLER_VERSION",
          "value": "3.2.2"
        },
        {
          "name": "ECS_FARGATE",
          "value": "true"
        },
        {
          "name": "DD_DOGSTATSD_TAG_CARDINALITY",
          "value": "orchestrator"
        },
        {
          "name": "DD_SERVICE",
          "value": "demo-nginx"
        },
        {
          "name": "DD_ENV",
          "value": "demo"
        },
        {
          "name": "DD_INSTALL_INFO_TOOL",
          "value": "cdk"
        }
      ],
      "environmentFiles": [],
      "essential": false,
      "extraHosts": [],
      "healthCheck": {
        "command": [
          "CMD-SHELL",
          "/probe.sh"
        ],
        "interval": 10,
        "retries": 3,
        "startPeriod": 60,
        "timeout": 5
      },
      "image": "public.ecr.aws/datadog/agent:7-rc-full",
      "links": [],
      "mountPoints": [
        {
          "containerPath": "/var/run/datadog",
          "readOnly": false,
          "sourceVolume": "dd-sockets"
        }
      ],
      "name": "datadog-agent",
      "portMappings": [
        {
          "containerPort": 8126,
          "hostPort": 8126,
          "protocol": "tcp"
        },
        {
          "containerPort": 8125,
          "hostPort": 8125,
          "protocol": "udp"
        }
      ],
      "secrets": [
        {
          "name": "DD_API_KEY",
          "valueFrom": "arn:aws:secretsmanager:ap-northeast-1:***************:secret:demo-datadog-api-key-8yM5FT"
        }
      ],
      "systemControls": [],
      "ulimits": [],
      "volumesFrom": []
    },
    {
      "command": [],
      "cpu": 0,
      "credentialSpecs": [],
      "dnsSearchDomains": [],
      "dnsServers": [],
      "dockerLabels": {
        "com.datadoghq.tags.service": "demo-nginx",
        "com.datadoghq.tags.env": "demo"
      },
      "dockerSecurityOptions": [],
      "entryPoint": [],
      "environment": [
        {
          "name": "DD_SERVICE",
          "value": "demo-nginx"
        },
        {
          "name": "DD_DOGSTATSD_URL",
          "value": "unix:///var/run/datadog/dsd.socket"
        },
        {
          "name": "DD_ENV",
          "value": "demo"
        },
        {
          "name": "DD_TRACE_INFERRED_PROXY_SERVICES_ENABLED",
          "value": "false"
        },
        {
          "name": "DD_TRACE_AGENT_URL",
          "value": "unix:///var/run/datadog/apm.socket"
        }
      ],
      "environmentFiles": [],
      "essential": true,
      "extraHosts": [],
      "image": "***************.dkr.ecr.ap-northeast-1.amazonaws.com/cdk-hnb659fds-container-assets-***************-ap-northeast-1:b2e04a5539d9c98b47d91057c269af8d73f54006**********",
      "links": [],
      "logConfiguration": {
        "logDriver": "awslogs",
        "options": {
          "awslogs-group": "/ecs/demo-fargate-datadog",
          "awslogs-region": "ap-northeast-1",
          "awslogs-stream-prefix": "nginx"
        },
        "secretOptions": []
      },
      "mountPoints": [
        {
          "containerPath": "/var/run/datadog",
          "readOnly": false,
          "sourceVolume": "dd-sockets"
        }
      ],
      "name": "nginx",
      "portMappings": [
        {
          "containerPort": 80,
          "hostPort": 80,
          "protocol": "tcp"
        }
      ],
      "secrets": [],
      "systemControls": [],
      "ulimits": [],
      "volumesFrom": []
    }
  ],
  "cpu": "512",
  "executionRoleArn": "arn:aws:iam::***************:role/DemoFargateDatadogSidecar-DemoTaskDefExecutionRole4-gMB39wyt768N",
  "family": "demo-fargate-datadog-task",
  "memory": "1024",
  "networkMode": "awsvpc",
  "placementConstraints": [],
  "registeredAt": "2025-10-05T05:24:33.948Z",
  "registeredBy": "arn:aws:sts::***************:assumed-role/cdk-hnb659fds-cfn-exec-role-***************-ap-northeast-1/AWSCloudFormation",
  "requiresAttributes": [
    {
      "name": "com.amazonaws.ecs.capability.logging-driver.awslogs"
    },
    {
      "name": "ecs.capability.execution-role-awslogs"
    },
    {
      "name": "com.amazonaws.ecs.capability.ecr-auth"
    },
    {
      "name": "com.amazonaws.ecs.capability.docker-remote-api.1.19"
    },
    {
      "name": "ecs.capability.secrets.asm.environment-variables"
    },
    {
      "name": "com.amazonaws.ecs.capability.docker-remote-api.1.17"
    },
    {
      "name": "com.amazonaws.ecs.capability.task-iam-role"
    },
    {
      "name": "ecs.capability.container-health-check"
    },
    {
      "name": "ecs.capability.execution-role-ecr-pull"
    },
    {
      "name": "com.amazonaws.ecs.capability.docker-remote-api.1.18"
    },
    {
      "name": "ecs.capability.task-eni"
    },
    {
      "name": "com.amazonaws.ecs.capability.docker-remote-api.1.29"
    }
  ],
  "requiresCompatibilities": [
    "FARGATE"
  ],
  "revision": 6,
  "status": "ACTIVE",
  "taskDefinitionArn": "arn:aws:ecs:ap-northeast-1:***************:task-definition/demo-fargate-datadog-task:6",
  "taskRoleArn": "arn:aws:iam::***************:role/DemoFargateDatadogSidecar-DemoTaskDefTaskRole560BAE-mHEsFunHn3GO",
  "volumes": [
    {
      "host": {},
      "name": "dd-sockets"
    }
  ],
  "tags": [
    {
      "key": "dd_cdk_construct",
      "value": "v3.2.2"
    }
  ]
}

		

起動したタスクの状況を確認してみましょう。
※アカウントIDやランダム値などは適宜ぼかしています。

			
			# サービス「demo-fargate-datadog-service」内のタスク一覧を出力
aws ecs list-tasks \
    --cluster demo-fargate-datadog-cluster \
    --service-name demo-fargate-datadog-service \
    --region ap-northeast-1

{
    "taskArns": [
        "arn:aws:ecs:ap-northeast-1:***************:task/demo-fargate-datadog-cluster/99a2a47221ce481b90ef42d652ff597d"
    ]
}

# ARNからタスクの詳細を確認
aws ecs describe-tasks \
    --cluster demo-fargate-datadog-cluster \
    --tasks arn:aws:ecs:ap-northeast-1:***************:task/demo-fargate-datadog-cluster/99a2a47221ce481b90ef42d652ff597d \
    --region ap-northeast-1

{
      "tasks": [
          {
              "attachments": [
                  {
                      "id":
  "********-****-****-****-************",
                      "type":
  "ElasticNetworkInterface",
                      "status": "ATTACHED",
                      "details": [
                          {
                              "name": "subnetId",
                              "value":
  "subnet-*********************"
                          },
                          {
                              "name":
  "networkInterfaceId",
                              "value":
  "eni-*****************"
                          },
                          {
                              "name": "macAddress",
                              "value":
  "**:**:**:**:**:**"
                          },
                          {
                              "name":
  "privateDnsName",
                              "value":
  "ip-10-0-2-***.ap-northeast-1.compute.internal"
                          },
                          {
                              "name":
  "privateIPv4Address",
                              "value": "10.0.2.***"
                          }
                      ]
                  }
              ],
              "attributes": [
                  {
                      "name":
  "ecs.cpu-architecture",
                      "value": "x86_64"
                  }
              ],
              "availabilityZone":
  "ap-northeast-1a",
              "clusterArn":
  "arn:aws:ecs:ap-northeast-1:***************:clust
  er/demo-fargate-datadog-cluster",
              "connectivity": "CONNECTED",
              "connectivityAt":
  "2025-10-05T14:25:01.494000+09:00",
              "containers": [
                  {
                      "containerArn": "arn:aws:ecs:
  ap-northeast-1:***************:container/demo-far
  gate-datadog-cluster/****************************
  ****/********-****-****-****-************",
                      "taskArn": "arn:aws:ecs:ap-no
  rtheast-1:***************:task/demo-fargate-datad
  og-cluster/********************************",
                      "name": "datadog-agent",
                      "image":
  "public.ecr.aws/datadog/agent:7-rc-full",
                      "imageDigest":
  "sha256:*****************************************
  ***********************",
                      "runtimeId":
  "********************************-**********",
                      "lastStatus": "RUNNING",
                      "networkBindings": [],
                      "networkInterfaces": [
                          {
                              "attachmentId":
  "********-****-****-****-************",
                              "privateIpv4Address":
   "10.0.2.***"
                          }
                      ],
                      "healthStatus": "HEALTHY",
                      "managedAgents": [
                          {
                              "lastStartedAt":
  "2025-10-05T14:25:45.259000+09:00",
                              "name":
  "ExecuteCommandAgent",
                              "lastStatus":
  "RUNNING"
                          }
                      ],
                      "cpu": "0"
                  },
                  {
                      "containerArn": "arn:aws:ecs:
  ap-northeast-1:***************:container/demo-far
  gate-datadog-cluster/****************************
  ****/********-****-****-****-************",
                      "taskArn": "arn:aws:ecs:ap-no
  rtheast-1:***************:task/demo-fargate-datad
  og-cluster/********************************",
                      "name": "nginx",
                      "image":
  "***************.dkr.ecr.ap-northeast-1.amazonaws
  .com/cdk-hnb659fds-container-assets-*************
  **-ap-northeast-1:*******************************
  *********************************",
                      "imageDigest":
  "sha256:*****************************************
  ***********************",
                      "runtimeId":
  "********************************-**********",
                      "lastStatus": "RUNNING",
                      "networkBindings": [],
                      "networkInterfaces": [
                          {
                              "attachmentId":
  "********-****-****-****-************",
                              "privateIpv4Address":
   "10.0.2.***"
                          }
                      ],
                      "healthStatus": "UNKNOWN",
                      "managedAgents": [
                          {
                              "lastStartedAt":
  "2025-10-05T14:26:09.854000+09:00",
                              "name":
  "ExecuteCommandAgent",
                              "lastStatus":
  "RUNNING"
                          }
                      ],
                      "cpu": "0"
                  }
              ],
              "cpu": "512",
              "createdAt":
  "2025-10-05T14:24:56.470000+09:00",
              "desiredStatus": "RUNNING",
              "enableExecuteCommand": true,
              "group":
  "service:demo-fargate-datadog-service",
              "healthStatus": "UNKNOWN",
              "lastStatus": "RUNNING",
              "launchType": "FARGATE",
              "memory": "1024",
              "overrides": {
                  "containerOverrides": [
                      {
                          "name": "nginx"
                      },
                      {
                          "name": "datadog-agent"
                      }
                  ],
                  "inferenceAcceleratorOverrides":
  []
              },
              "platformVersion": "1.4.0",
              "platformFamily": "Linux",
              "pullStartedAt":
  "2025-10-05T14:25:08.783000+09:00",
              "pullStoppedAt":
  "2025-10-05T14:25:44.309000+09:00",
              "startedAt":
  "2025-10-05T14:26:04.842000+09:00",
              "startedBy":
  "ecs-svc/********************",
              "tags": [],
              "taskArn": "arn:aws:ecs:ap-northeast-
  1:***************:task/demo-fargate-datadog-clust
  er/********************************",
              "taskDefinitionArn":
  "arn:aws:ecs:ap-northeast-1:***************:task-
  definition/demo-fargate-datadog-task:6",
              "version": 5,
              "ephemeralStorage": {
                  "sizeInGiB": 20
              },
              "fargateEphemeralStorage": {
                  "sizeInGiB": 20
              }
          }
      ],
      "failures": []
  }

		

2つのコンテナ(datadog-agentとnginx)が共に「RUNNING状態」で起動していることが確認できました。

ブラウザからALB経由でWebサーバー(nginx)への疎通も以下のように確認できました。

2025-10-05-datadog-ecs-on-fargate-integration-06

5. Datadog側確認

AWS上での設定がうまくいったのでDatadog側を確認してみましょう。

Datadogダッシュボード画面のサイドバーから「Dashboards」>「Dashboard List」を選択します。
先ほどインテグレーションをインストールしたのでダッシュボード一覧に「Amazon Fargate Overview」が確認できるはずです。選択してみましょう。

2025-10-05-datadog-ecs-on-fargate-integration-07

下記のように立ち上げたコンテナIDで各種数値が確認できました。

2025-10-05-datadog-ecs-on-fargate-integration-08

上記の「AWS Fargate Overview」ダッシュボードでは以下の項目が用意されていました。

CPU 関連

  • コンテナあたりのCPU消費時間の合計
    単位: Millicores

  • コンテナあたりのCPU使用率
    単位: Percent

メモリ関連

  • コンテナあたりの平均メモリ使用量
    単位: Mebibytes

  • コンテナあたりの平均メモリキャッシュ
    単位: Mebibytes

  • mem cgroup への課金イベントの平均数
    単位: Per second

  • 匿名およびスワップキャッシュメモリの平均バイト数
    単位: Mebibytes

IO(入出力)関連

  • コンテナあたりの平均読み取り操作数

  • コンテナあたりの平均書き込み操作数

  • コンテナあたりの平均読み取りバイト数
    単位: Kibibytes

  • コンテナあたりの平均書き込みバイト数
    単位: Bytes

ネットワーク関連

  • コンテナあたりの平均送信バイト数
    単位: Kibibytes

  • コンテナあたりの平均受信バイト数
    単位: Kibibytes

  • コンテナによってドロップされた平均受信パケット数
    単位: Packets

  • コンテナによってドロップされた平均送信パケット数
    単位: Packets

  • コンテナ別の平均送信エラー数
    単位: Errors

  • コンテナごとの平均受信エラー数
    単位: Errors

一時ストレージ (Ephemeral Storage)

  • タスク・クラスターごとに予約された一時ストレージ量
    単位: Gibibytes

  • タスク・クラスターあたりの平均一時ストレージ使用量
    単位: Gibibytes

タスクリソース制限

  • タスクCPU制限(すべてのコンテナで共有)
    単位: Millicores

  • タスクメモリ制限(すべてのコンテナで共有)
    単位: Gibibytes

6. カスタムダッシュボードの用意

用意されている「AWS Fargate Overview」では統合時に収集したメトリクスを全て画面表示しているわけではないので、項目を増やしたり見やすく画面をカスタムしたい場合はダッシュボードを自作する必要があります。

例えば「AWS Fargate Overview」には以下のメトリクスが収集できます。

  • ecs.fargate.net.packet.in_dropped : 受信データのパケットロス数
  • ecs.fargate.net.packet.out_dropped : 送信データのパケットロス数

カスタムダッシュボードを作成すれば、統合で収集した上記メトリクスを使用して以下のように見やすい画面を簡単に構成できます。

2025-10-05-datadog-ecs-on-fargate-integration-09

最後に

今回はDatadogの「AWS ECS on AWS Fargate」統合機能を活用してFargate内のコンテナメトリクス監視をCDKで実現してみました。

今後はより調査を進めて、カスタムメトリクスの収集やログ収集も交えた見やすいダッシュボードの構築など便利な活用方法を検証していければと思います。

今回は以上です!

この記事をシェアする

FacebookHatena blogX

関連記事

【入門】 Datadogの「Amazon ECS on AWS Fargate」統合を用いてCDKでFargate環境のメトリクス監視をやってみた | DevelopersIO