Kinesis Data Stream으로 로그를 전송하는 기본적인 방법은 Kinesis Agent를 이용하는 것입니다. Kinesis Agent는 Kinesis Data Stream이나 Kinesis Data Firehose에 데이터를 전송할 수 있으며 CloudWatch Metrics로 지표도 보낼 수 있습니다.
1. 준비
Kinesis Data Stream 하나를 생성합니다. 데이터를 확인하기 위해 Kinesis Data Firehose까지 생성해도 좋습니다.
로그를 생성할 EC2 Instance(Amazon Linux) 하나를 생성합니다. EC2 Instance가 사용하는 IAM Role에 다음과 같은 Policy가 있어야 합니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"cloudwatch:PutMetricData",
"kinesis:PutRecords"
],
"Resource": "*"
}
]
}
2. 설치 & 설정
EC2 Instance에 SSH로 접속하여 yum을 사용해 Kinesis Agent를 설치합니다.
sudo yum install -y aws-kinesis-agent
Kinesis Agent 설정 파일을 vim을 통해 편집합니다.
sudo vim /etc/aws-kinesis/agent.json
설정 파일을 다음과 같이 작성합니다.
{
"cloudwatch.emitMetrics": true,
"cloudwatch.endpoint": "monitoring.ap-northeast-2.amazonaws.com",
"kinesis.endpoint": "kinesis.ap-northeast-2.amazonaws.com",
"flows": [
{
"filePattern": "/opt/app/app.log",
"kinesisStream": "demo-stream",
"dataProcessingOptions": [
{
"optionName": "LOGTOJSON",
"logFormat": "COMMONAPACHELOG",
"matchPattern": "^([^ ]*) - \\[([^\\]]*)\\] \\[([^\\]]*)\\] \"([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) \"([^ ]*)\"\"",
"customFieldNames": ["host", "time", "level", "method", "path", "http", "code", "micro", "agent"]
}
]
}
]
}
CloudWatch Metrics로 지표를 보내기 위해 true로 설정합니다.
"cloudwatch.emitMetrics": true,
CloudWatch와 Kinesis의 리전도 설정합니다. ap-northeast-2를 원하는 리전으로 변경합니다.
"cloudwatch.endpoint": "monitoring.ap-northeast-2.amazonaws.com",
"kinesis.endpoint": "kinesis.ap-northeast-2.amazonaws.com",
flows에서 로그의 위치와 Kinesis Data Stream의 이름을 설정합니다.
"filePattern": "/opt/app/app.log",
"kinesisStream": "demo-stream",
dataProcessingOptions로 원하는 형태로 로그를 프로세싱 할 수 있습니다.
- optionName을 "LOGTOJSON"으로 설정해 json 형태로 로그를 전송하도록 합니다.
- logFormat으로 로그 프로세싱 형태를 정합니다. matchPattern 옵션을 사용했기 때문에 현재 영향은 없습니다.
- matchPattern을 설정해 정규표현식으로 로그에서 값들을 추출할 수 있습니다. logFormat에서 원하는 포맷이 없을 때 사용합니다.
- customFieldNames를 설정해 matchPattern으로 추출된 값의 이름을 차례대로 정하거나, logFormat에 정의된 필드 이름을 재정의합니다.
"optionName": "LOGTOJSON",
"logFormat": "COMMONAPACHELOG",
"matchPattern": "^([^ ]*) - \\[([^\\]]*)\\] \\[([^\\]]*)\\] \"([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) ([^ ]*) \"([^ ]*)\"\"",
"customFieldNames": ["host", "time", "level", "method", "path", "http", "code", "micro", "agent"]
추가로 다른 설정도 사용하고 싶다면 공식 문서를 참고하면 됩니다.
https://docs.aws.amazon.com/streams/latest/dev/writing-with-agents.html
Writing to Amazon Kinesis Data Streams Using Kinesis Agent - Amazon Kinesis Data Streams
Writing to Amazon Kinesis Data Streams Using Kinesis Agent Kinesis Agent is a stand-alone Java software application that offers an easy way to collect and send data to Kinesis Data Streams. The agent continuously monitors a set of files and sends new data
docs.aws.amazon.com
3. 시작
Kinesis Agent를 시작하기 전, 로그 파일을 먼저 생성합니다.
sudo mkdir /opt/app
sudo touch /opt/app/app.log
Kinesis Agent를 시작합니다.
sudo service aws-kinesis-agent start
sudo chkconfig aws-kinesis-agent on
시작이 잘 되었다면, 로그 한 줄을 생성하겠습니다.
echo '10.0.0.245 - [2023-10-10T19:33:29Z] [INFO] "GET /v1/color/red HTTP/1.1 200 28.0 "curl/8.3.0""' | sudo tee -a /opt/app/app.log
Kinesis Agent 로그를 보면서, 로그가 잘 보내지는지 확인해봅시다.
tail -f /var/log/aws-kinesis-agent/aws-kinesis-agent.log
한 레코드가 파싱되었고, 성공적으로 목적지(Kinesis Data Stream)에 보내졌다고 나옵니다.
2023-10-10 20:03:48.297+0900 (FileTailer[kinesis:demo-stream:/opt/app/app.log].MetricsEmitter RUNNING) com.amazon.kinesis.streaming.agent.tailing.FileTailer [INFO] FileTailer[kinesis:demo-stream:/opt/app/app.log]: Tailer Progress: Tailer has parsed 1 records (94 bytes), transformed 1 records, skipped 0 records, and has successfully sent 1 records to destination.
부가적으로 생성한 Firehose를 통해 S3에 로그가 잘 보내졌습니다.
{"host":"10.0.0.245","time":"2023-10-10T19:33:29Z","level":"INFO","method":"GET","path":"/v1/color/red","http":"HTTP/1.1","code":"200","micro":"28.0","agent":"curl/8.3.0"}
CloudWatch Metrics에도 지표가 잘 보내졌습니다.
오늘의 글은 여기까지입니다. 감사합니다!
'AWS' 카테고리의 다른 글
[AWS] Athena에서 Table 생성부터 데이터 조회까지 (0) | 2023.10.12 |
---|---|
[AWS] RDS IAM database authentication (0) | 2023.10.11 |
[AWS] CloudFront with Lambda Function URL (1) | 2023.10.09 |
[AWS] Terraform VPC Module 사용 (0) | 2023.10.06 |
[AWS] Global Aurora (Cross Region Read Replica, Global Database) (0) | 2023.10.02 |