CDKでECSにDatadogAgentコンテナを追加して、Datadog上からメトリクスを確認してみました。
ECS on Fargateで実施しました。
参考 DatadogをインストールしたECSのCFnテンプレート
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
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上から確認できます。
DatadogAgentを追加したことでコンテナごとのCPUやMemoryなどのメトリクスが確認できるようになりました。
まとめ
CDKでECSにDatadogAgentのコンテナを追加してみました。
Datadog日本語のドキュメントも充実していていいですね。
DatadogAgentコンテナの記述については使い回せると思うので、カスタムコンストラクト作っておくのもいいかと思います。
ブラウザでCDKを試せるツール「cdk-web」を使ってみたブラウザ上で、cdkを試せるツール「cdk-web」というツールがあります。
便利そうなので、ざっくり紹介します。
どんなツール?
...
Cloudwatch,NewRelic,Datadog外形監視Saasを比較してみるこんにちは、ちゃりおです。
サービスの外形監視いれていますか。
可用性のモニタリングやエンドポイント監視に外形監視サービスが便利です。...
AWS SSOでDatadogにログインするこんにちは、ちゃりおです。
最近、Datadogを利用しています。
ユーザ管理どうしようか迷っていました。
漠然とSSOで行けたらい...