Datadog 이란?
데이터독(datadog)은 모니터링 서비스로 SaaS 기반 데이터 분석 플랫폼을 통해 서버 및 클라우드 서비스 모니터링을 제공한다.
데이터독은 서버 상태를 모니터링하는 기능부터 AWS, Azure, GCP 등 서비스와 통합 기능도 제공하고 있으며 agent의 확장 기능을 통해 다양한 애플리케이션에 대한 추가적인 메트릭 수집 및 모니터링을 지원한다.
추가로 알람, 대시보드, 로그 수집, APM, 네트워크 트래픽과 엔드포인트 모니터링을 지원하며 종합 모니터링 서비스로 확장해나가고 있다.
Datadog 연동 방식
두 가지의 방식으로 datadog 연동을 진행해보겠다.
- Intergrations
- APM
APM 이란?
Application Performance Monitoring 의 약자로 구동 중인 애플리케이션의 대한 성능측정과 에러탐지 등, 전반적인 애플리케이션 라이프사이클의 정보를 수집해 모니터링하는 툴입니다.
보다 편리성을 위해서 다양하게 시각화한 Metrics, 그리고 API 테스트도 지원을 해줍니다.
여러 대의 애플리케이션에 설치가 가능하며 이를 한꺼번에 같은 UI 상에 보여주기 때문에 마이크로서비스 아키텍처 에도 유용하게 사용될 수 있다고 합니다.
이번 포스팅에서 Intergrations 방식으로 모니터링 연동을 진행해보겠다.
(오류 발생과 해결 방법이 나오므로, 무작정 따라하지는 마세요...)
Datadog AWS 모니터링 구현
로그인 시 가입한 계정은 리전 별로 적용이기 때문에 본인이 가입한 리전을 잘 선택해야한다.
(japan 리전에서 생성한 계정은 japan 리전에서만 사용 가능)
우측 하단 서비스 제공자를 선택한다. 혹은 왼쪽 메뉴바에서 Intergrations를 선택하여 진행할 수 있다.
Add AWS Account(s) 를 선택한다.
CloudFront를 이용한 자동 구축을 클릭한 뒤 리전,API key를 선택한다.
구축을 진행하면 자동으로 CloudFront 콘솔로 넘어간다.
key값은 자동으로 입력된다.
스택 생성을 진행한다.
스택 생성 중 에러가 발생했다.
The following resource(s) failed to delete: [DatadogAPICall].
해당 로그는 결국 datadog api키가 리소스를 삭제할 권한이 없다는 것인데,
어쩔수 없이 직접 IAM을 생성하여 Datadog 연동을 진행해보겠다.
Intergrations Manually
AWS External ID를 기록해놓는다.
이후 AWS IAM으로 이동하여 Datadog 권한 설정을 진행한다.
IAM → 역할 → 역할 생성으로 진입하여 AWS 계정을 선택 후 Datadog의 Account ID를 입력한다.
- Datadog Account ID :
464622532012
Datadog Account ID 입력을 완료하였으면 하단 외부 ID를 체크 후 Datadog에서 복사한 External ID를 입력한다.
정책 생성 창이 나타난다. 정책 생성을 진행한다.
정책 이름을 입력하고 JSON 탭으로 이동한다.
- JSON 정책
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"health:DescribeAffectedEntities",
"budgets:ViewBudget",
"logs:DeleteSubscriptionFilter",
"states:ListStateMachines",
"states:DescribeStateMachine",
"tag:GetTagValues",
"logs:DescribeSubscriptionFilters",
"cloudtrail:GetTrailStatus",
"codedeploy:List*",
"es:ListTags",
"cloudwatch:Describe*",
"elasticmapreduce:Describe*",
"dynamodb:Describe*",
"rds:Describe*",
"organizations:DescribeOrganization",
"route53:List*",
"elasticloadbalancing:Describe*",
"logs:FilterLogEvents",
"apigateway:GET",
"cloudfront:GetDistributionConfig",
"ses:Get*",
"cloudtrail:LookupEvents",
"fsx:ListTagsForResource",
"lambda:List*",
"dynamodb:List*",
"s3:GetBucketNotification",
"cloudtrail:DescribeTrails",
"s3:PutBucketNotification",
"logs:PutSubscriptionFilter",
"codedeploy:BatchGet*",
"fsx:DescribeFileSystems",
"kinesis:Describe*",
"autoscaling:Describe*",
"tag:GetResources",
"s3:GetBucketTagging",
"logs:DescribeLogStreams",
"rds:List*",
"s3:GetBucketLogging",
"tag:GetTagKeys",
"elasticmapreduce:List*",
"sns:Publish",
"elasticache:List*",
"redshift:DescribeLoggingStatus",
"cloudwatch:Get*",
"es:DescribeElasticsearchDomains",
"elasticfilesystem:DescribeFileSystems",
"ecs:List*",
"xray:GetTraceSummaries",
"health:DescribeEvents",
"sqs:ListQueues",
"logs:DescribeLogGroups",
"kinesis:List*",
"ecs:Describe*",
"health:DescribeEventDetails",
"cloudwatch:List*",
"logs:TestMetricFilter",
"elasticfilesystem:DescribeAccessPoints",
"elasticache:Describe*",
"support:*",
"sns:List*",
"xray:BatchGetTraces",
"ec2:Describe*",
"es:ListDomainNames",
"directconnect:Describe*",
"elasticfilesystem:DescribeTags",
"s3:ListAllMyBuckets",
"redshift:DescribeClusters",
"cloudfront:ListDistributions",
"s3:GetBucketLocation",
"lambda:GetPolicy"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
해당 정책 룰을 복사하여 입력하였다.
이후 생성한 권한 정책 룰을 이전에 생성한 cw-datadog-test 정책과 연결한다.
역할 생성을 마무리한다.
생성된 역할과 계정 ID를 복사하여 datadog Intergrations Manually
에 연결을 시도한다.
오류발생
- 기존
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"health:DescribeAffectedEntities",
"budgets:ViewBudget",
"logs:DeleteSubscriptionFilter",
"states:ListStateMachines",
"states:DescribeStateMachine",
"tag:GetTagValues",
"logs:DescribeSubscriptionFilters",
"cloudtrail:GetTrailStatus",
"codedeploy:List*",
"es:ListTags",
"cloudwatch:Describe*",
"elasticmapreduce:Describe*",
"dynamodb:Describe*",
"rds:Describe*",
"organizations:DescribeOrganization",
"route53:List*",
"elasticloadbalancing:Describe*",
"logs:FilterLogEvents",
"apigateway:GET",
"cloudfront:GetDistributionConfig",
"ses:Get*",
"cloudtrail:LookupEvents",
"fsx:ListTagsForResource",
"lambda:List*",
"dynamodb:List*",
"s3:GetBucketNotification",
"cloudtrail:DescribeTrails",
"s3:PutBucketNotification",
"logs:PutSubscriptionFilter",
"codedeploy:BatchGet*",
"fsx:DescribeFileSystems",
"kinesis:Describe*",
"autoscaling:Describe*",
"tag:GetResources",
"s3:GetBucketTagging",
"logs:DescribeLogStreams",
"rds:List*",
"s3:GetBucketLogging",
"tag:GetTagKeys",
"elasticmapreduce:List*",
"sns:Publish",
"elasticache:List*",
"redshift:DescribeLoggingStatus",
"cloudwatch:Get*",
"es:DescribeElasticsearchDomains",
"elasticfilesystem:DescribeFileSystems",
"ecs:List*",
"xray:GetTraceSummaries",
"health:DescribeEvents",
"sqs:ListQueues",
"logs:DescribeLogGroups",
"kinesis:List*",
"ecs:Describe*",
"health:DescribeEventDetails",
"cloudwatch:List*",
"logs:TestMetricFilter",
"elasticfilesystem:DescribeAccessPoints",
"elasticache:Describe*",
"support:*",
"sns:List*",
"xray:BatchGetTraces",
"ec2:Describe*",
"es:ListDomainNames",
"directconnect:Describe*",
"elasticfilesystem:DescribeTags",
"s3:ListAllMyBuckets",
"redshift:DescribeClusters",
"cloudfront:ListDistributions",
"s3:GetBucketLocation",
"lambda:GetPolicy"
],
"Effect": "Allow",
"Resource": "*"
}
]
}
- 변경
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"health:DescribeAffectedEntities",
"budgets:ViewBudget",
"logs:DeleteSubscriptionFilter",
"states:ListStateMachines",
"states:DescribeStateMachine",
"tag:GetTagValues",
"logs:DescribeSubscriptionFilters",
"cloudtrail:GetTrailStatus",
"codedeploy:List*",
"es:ListTags",
"cloudwatch:Describe*",
"elasticmapreduce:Describe*",
"dynamodb:Describe*",
"rds:Describe*",
"organizations:DescribeOrganization",
"route53:List*",
"elasticloadbalancing:Describe*",
"logs:FilterLogEvents",
"apigateway:GET",
"cloudfront:GetDistributionConfig",
"ses:Get*",
"cloudtrail:LookupEvents",
"fsx:ListTagsForResource",
"lambda:List*",
"dynamodb:List*",
"s3:GetBucketNotification",
"cloudtrail:DescribeTrails",
"s3:PutBucketNotification",
"logs:PutSubscriptionFilter",
"codedeploy:BatchGet*",
"fsx:DescribeFileSystems",
"kinesis:Describe*",
"autoscaling:Describe*",
"tag:GetResources",
"s3:GetBucketTagging",
"logs:DescribeLogStreams",
"rds:List*",
"s3:GetBucketLogging",
"tag:GetTagKeys",
"elasticmapreduce:List*",
"sns:Publish",
"elasticache:List*",
"redshift:DescribeLoggingStatus",
"cloudwatch:Get*",
"es:DescribeElasticsearchDomains",
"elasticfilesystem:DescribeFileSystems",
"ecs:List*",
"xray:GetTraceSummaries",
"health:DescribeEvents",
"sqs:ListQueues",
"logs:DescribeLogGroups",
"kinesis:List*",
"ecs:Describe*",
"health:DescribeEventDetails",
"cloudwatch:List*",
"logs:TestMetricFilter",
"elasticfilesystem:DescribeAccessPoints",
"elasticache:Describe*",
"support:*",
"sns:List*",
"xray:BatchGetTraces",
"ec2:Describe*",
"es:ListDomainNames",
"directconnect:Describe*",
"elasticfilesystem:DescribeTags",
"s3:ListAllMyBuckets",
"redshift:DescribeClusters",
"cloudfront:ListDistributions",
"s3:GetBucketLocation",
"lambda:GetPolicy"
],
"Resource": "*"
}
]
}
해결
Datadog Account ID 문제였다. 공식문서를 참조하여 진행하여 해결하였다.
417141415827
그리고 해당 account ID 부분은 datadog의 account ID 가 아닌 내 aws 계정 ID이다.
이는 역할 ARN에서 확인 가능하다.
정상적으로 생성되었다.
이후 ec2 모니터링을 확인해보겠다.
연동이 정상적으로 완료되었다.
'DevOps > Monitoring_모니터링' 카테고리의 다른 글
[모니터링] Grafana Slack 연동 (0) | 2023.11.16 |
---|---|
[모니터링] CloudWatch + Grafana 모니터링 구축 (0) | 2023.11.13 |
[AWS] CloudWatch (AWS 리소스 상태 모니터링) (0) | 2023.06.15 |
[ZABBIX] 자빅스 모니터링 시스템 구축하기 (0) | 2023.03.30 |
[Scouter] Scouter 설치 및 Agent 연동 (Linux) (0) | 2023.03.22 |