Datadog으로 AWS 서비스에서 발생하는 로그 데이터들을 모니터링하기 위해서는 로그들을 Datadog으로 쏴주는 과정이 필요하다.
로그를 쏴주는 방법에는 크게 2가지가 존재한다.
먼저, Datadog에서 AWS integration을 통해 AWS 계정 내에 Log forwarder라는 Lambda 함수를 생성해 지속적으로 로그를 쏴주는 방법이 있다.
AWS integration에 대한 설명은 이전 글에서 작성했으므로 여기서는 따로 설명하지 않는다.
다른 방법으로는 Kinesis Firehose 서비스를 통해 직접 Datadog으로 쏴주는 방법이 존재한다.
이 방법의 특징으로는 우선 AWS 계정과 직접적인 integration 작업을 하지 않아도 된다는 점이 있다. Datadog에서 API Key만 생성해주면 Kinesis Firehose에서 키를 등록해 해당 Datadog 계정으로 바로 로그를 전송할 수 있기 때문이다.
즉, 하나의 Datadog 계정을 두고 여러 AWS 계정의 여러 서비스들의 로그를 모니터링할 수 있다는 것이다. (중앙화된 로그)
이번에는 Cloudwatch Agent를 통해 인스턴스에서 로그를 전달받아 Log group에 저장하고, Kinesis Firehose를 거쳐서 Datadog으로 export까지 수행하는 아키텍쳐를 생성해본다.
Datadog API Key 생성
Datadog으로 데이터를 쏴주기 위해 Datadog 계정에서 API Key를 생성해야한다. (Application Key가 아닌 API Key다)
Organization Settings > Access > API Keys에서 현재 생성된 API Key 목록과 새로 Key를 생성할 수 있다.
키 이름 지정 후 생성하면 생성한 키의 id 값과 value를 확인할 수 있다.
Kinesis Firehose 생성
로그 데이터들을 Datadog으로 쏴줄 연결자에 해당하는 부분이다.
스트림을 생성하기 위해 우선 소스와 대상을 선택해야한다.
소스는 Firehose 스트림이 수신할 데이터가 타입을 지정하는 구간으로 Kinesis Data Streams와 Direct PUT이 존재한다.
Kinesis Data Streams를 사용하지 않는 이상 Direct PUT을 선택한다.
다음으로 대상은 Firehose 스트림이 데이터를 송신할 대상을 지정하는 구간으로, S3나 Opensearch를 비롯한 AWS 서비스 외에도 HTTP 엔드포인트가 존재하는 타사의 3rd party 서비스에도 전송할 수 있다.
우리는 Datadog을 통해 모니터링할 것이기 때문에 Datadog을 선택해준다.
송신할 HTTP 엔드포인트를 선택 후, 위에서 생성한 API Key를 입력한다.
Firehose는 전송한 데이터들에 대한 백업을 목적으로 S3 버킷에 전송한 데이터들을 저장한다.
하단의 백업 설정에서 Firehose에서 대상으로 전송한 데이터(모든 데이터) / 전송 실패한 데이터(실패한 데이터만)를 백업할 S3 버킷을 지정한다.
필수 설정인 구간으로 전송실패한 데이터만 백업하도록 설정한다.
Firehose 생성 후, 로그 연동을 위해 Cloudwatch 로그그룹과 연결하도록 한다.
Cloudwatch 구독필터 생성 & Firehose 연결
지난 글에서 EC2 서버에 Cloudwatch Agent를 설치했다.
이 Agent에서 가져온 로그그룹을 이용하도록하며, 해당 로그그룹에서 kinesis firehose 구독필터를 생성
대상으로는 앞서 생성한 Firehose 전송 스트림을 선택 후, 하단의 권한 부여에서 이 스트림에 로그 데이터를 넣을 권한을 cloudwatch log 그룹에 부여한다.
아래와 같이 IAM Role을 생성한다. 언제나 최소권한 유지
## 신뢰 정책
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Allow",
"Principal": {
"Service": "logs.amazonaws.com"
},
"Action": "sts:AssumeRole",
"Condition": {
"StringLike": {
"aws:SourceArn": "arn:aws:logs:[log그룹의 리전]:[계정ID]:*"
}
}
}
]
}
## 권한 정책(Policy)
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": "firehose:PutRecord",
"Resource": [
"arn:aws:firehose:[firehose의 리전]:[계정ID]:deliverystream/[스트림 이름]"
]
}
]
}
생성한 Role을 연결 후, 하단의 구독필터 패턴을 지정한다.
로그그룹의 모든로그를 Datadog으로 넘길것이므로 패턴은 빈값으로 지정한다.
패턴 테스트를 통해 지정한 패턴에 맞게 로그데이터들이 검색되는 지 확인 후 구독필터를 생성한다.
이렇게 kinesis firehose 구독필터까지 생성되면 이후 로그그룹에 전송된 데이터들이 구독필터를 거쳐 최종적으로 Datadog으로 흘러가는 구조를 확인할 수 있다.
Firehose 스트림의 메트릭을 확인해 스트림의 정상 동작을 확인할 수 있다.
또한 Datadog으로 흘러들어온 로그들도 확인가능한 것을 볼 수 있다.
이렇게 Cloudwatch 로그그룹에서 구독필터를 활용해 타사의 모니터링 서비스(Datadog)로 데이터를 전송해보았다.
스트리밍 데이터를 전송하는 Kinesis Firehose의 특징을 이용해 스트림 대상으로 편리하게 데이터 처리를 할 수 있는 점이 인상깊었다.