自分datadogと相性悪いんじゃないかというくらいハマっている🤔
— adachin👾SRE (@adachin0817) April 14, 2020
最近Mackerelではなく、Datadogでの監視方法を勉強しまくっているのですが、なかなか理解不足と慣れないという言い訳により、かなりハマっております。今回はECS/Fargateのコンテナ監視を試してTerraform化をしたので、ブログします!
■Amazon Fargate – Datadog Docs
https://docs.datadoghq.com/ja/integrations/ecs_fargate/
Datadog で ECS Fargate タスクを監視するには、アプリケーションと同じタスク定義内のコンテナとして Agent を実行します
というわけで、現在動いているコンテナのタスク定義にdatadog-agentコンテナを動かすようにすればOK。
■Datadog
- add integrations
- add API Keys
■Terraform
- files/task-definitions/app.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 |
[ { "image": "xxxxxxxxxx.dkr.ecr.ap-northeast-1.amazonaws.com/adachin-app", "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/ecs/app", "awslogs-region": "ap-northeast-1", "awslogs-stream-prefix": "ecs" } }, "cpu": 1014, "memory": 1792, "mountPoints": [], "environment": [ { "name" : "RAILS_ENV", "value" : "pre" } ], "networkMode": "awsvpc", "name": "adachin-app", "essential": true, "dockerLabels": { "com.datadoghq.ad.instances": "[{\"host\": \"%%host%%\", \"port\": 80}]", "com.datadoghq.ad.check_names": "[\"nginx\"]", "com.datadoghq.ad.init_configs": "[{}]" }, "portMappings": [ { "hostPort": 80, "containerPort": 80, "protocol": "tcp" } ], "command": [ "/usr/bin/supervisord" ] }, { "image": "datadog/agent:latest", "logConfiguration": { "logDriver": "awslogs", "options": { "awslogs-group": "/ecs/datadog-agent", "awslogs-region": "ap-northeast-1", "awslogs-stream-prefix": "ecs" } }, "cpu": 10, "memory": 256, "mountPoints": [], "environment": [ { "name" : "ECS_FARGATE", "value" : "true" }, { "name" : "DD_PROCESS_AGENT_ENABLED", "value" : "true" }, { "name" : "DD_DOGSTATSD_NON_LOCAL_TRAFFIC", "value" : "true" } ], "networkMode": "awsvpc", "name": "datadog-agent" } ] |
タスク定義に追加している部分は 40行目
です。タスクサイズのスペックは cpu:1024
、 memory:2048
で、各コンテナのスペックは以下のように調整しています。
・app
- cpu:1014
- memory:1792
・datadog-agent
- cpu:10
- memory:256
環境変数はドキュメントの通り1つと、メトリックス収集(DOGSTATSD/ライブプロセスモニタリング)のため2つ指定しており、 DD_API_KEY : API Key
は手動で追加しています。
・ECS_FARGATE : true
・DD_PROCESS_AGENT_ENABLED : true
・DD_DOGSTATSD_NON_LOCAL_TRAFFIC : true
- files/assume_role_policy/datadog-agent.json
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
{ "Version": "2012-10-17", "Statement": [ { "Action": [ "ecs:ListClusters", "ecs:ListContainerInstances", "ecs:DescribeContainerInstances" ], "Effect": "Allow", "Resource": "*" } ] } |
- iam.tf
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
## datadog-agent-policy resource "aws_iam_policy" "datadog_agent_policy" { name = "datadog_agent_policy" path = "/" description = "datadog agent policy" policy = file("files/assume_role_policy/datadog-agent.json") } ## ECS resource "aws_iam_role" "adachin-ecstaskexecution-role" { name = "ecsTaskExecutionRole" assume_role_policy = file("files/assume_role_policy/ecs-task.json") } resource "aws_iam_role_policy_attachment" "adachin-ecstaskexecutionrole-attach" { role = aws_iam_role.adachin-ecstaskexecution-role.name policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy" } resource "aws_iam_role_policy_attachment" "adachin-ecstaskexecutionrole-datadog-attach" { role = aws_iam_role.adachin-ecstaskexecution-role.name policy_arn = aws_iam_policy.datadog_agent_policy.arn } ## ECS Scheduled Tasks resource "aws_iam_role" "ecsscheduledtasks_role" { name = "ecs-Scheduled-Tasks-Role" assume_role_policy = file("files/assume_role_policy/ecs-scheduled-tasks.json") } resource "aws_iam_role_policy_attachment" "ecsscheduledtasks_role_attach" { role = aws_iam_role.ecsscheduledtasks_role.name policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonEC2ContainerServiceEventsRole" } |
タスクの実行ロールにdatadog用のポリシーを追加しましょう。 1行目と20行目
にポリシーをアタッチしています。
■確認
- Infrastructure > Containers
- Infrastructure > Processes
- Dashboard
CPU、Memory、I/O、ネットワークトラフィック、プロセスが取れていればOK!!
■まとめ
datadog-agentコンテナ用のタスク定義を1つ作るのかと勘違いしてハマりましたが、Mackerelと同様にサービス1つに監視コンテナを作ればリソースが取れます。しかしドキュメントが見にくい….他にも細かくメトリックスが取れるので次回ブログします!
0件のコメント