Amazon Web Services 한국 블로그
CloudWatch Logs Subscription Consumer + Elasticsearch + Kibana를 통한 데이터 시각화
최근 여러개의 AWS 서비스를 결합하여 만드는 흥미로운 사례를 자주 소개하고 있습니다. 이 글도 그 중에 하나로 오늘은 모니터링을 위한 서비스 조합을 소개해 드리고자 합니다. 먼저 사용하는 서비스에 대해 간단하게 소개하겠습니다. (아직 AWS에 익숙하지 않는 분들을 위해서입니다.)
- Amazon Kinesis는 실시간 데이터 스트림을 처리하기 위한 관리형 서비스입니다. 자세한 사항은 Amazon Kinesis – Real-Time Processing of Streaming Big Data를 참고하세요.
- Kinesis Connector Library를 사용하면 다른 AWS 서비스 또는 AWS 이외의 서비스에서 Kinesis에 연결하는 데 도움이 됩니다.
- AWS CloudFormation 템플릿을 사용하여 AWS 리소스를 정의하고 관리하는 데 도움이 됩니다.
- CloudWatch Logs를 사용하면 운영 체제, 응용 프로그램 및 사용자 정의 로그 파일을 저장하고 모니터링 할 수 있습니다. 자세한 내용은 Store and Monitor OS & Application Log Files with Amazon CloudWatch를 참고하십시오.
- AWS Lambda는 이벤트 기반 클라우드 함수(현재 Node.js와 Java)를 실행합니다. 컴퓨팅 자원에 신경 쓸 필요가 없고 단순히 프로그래밍 코드 개발에 집중할 수 있습니다. 자세한 내용은 AWS Lambda –클라우드 기반 함수 실행을 참고하십시오. 많은 개발자들은 AWS Lambda을 Amazon API Gateway와 함께 이용하여 확장성이 뛰어난 마이크로 서비스(MicroServices)를 구축 할 수 있습니다.
- VPC Flow Logs를 사용하여 VPC와 VPC 서브넷 또는 Elastic Network Interface 관련 네트워크 트래픽에 접근할 수 있습니다.
- 마지막으로 AWS CloudTrai 계정의 AWS API 호출을 기록하고 로그 파일로 저장합니다. 자세한 사항은 AWS CloudTrail – Capture AWS API Activity을 참고하십시오.
위의 마지막 세가지는 매우 중요한 속성으로 각각 효율적으로 저장된 데이터를 시각화하기 위하여 이벤트 데이터의 방대한 스트림을 만들 수 있습니다.
이벤트 데이터 시각화
오늘은 Kinesis와 CloudWatch Logs Subscription Consumer의 이용 방법에 대해 소개합니다. CloudWatch Logs Subscription Consumers는 특정 Kinesis Stream을 받아줍니다. Elasticsearch와 S3를위한 내장 커넥터가 포함되어 있어 다른 방식의 확장도 가능합니다.
우리는 EC2에 Elasticsearch 클러스터를 구축하고, 이벤트 데이터를 Elasticsearch로 제공되도록 하여 Kibana 및 시각화 도구를 사용하여 대시 보드까지 구축 하는 CloudFormation Template을 만들었습니다. VPC Flow Log, Lambda, CloudTrail을 통한 대시 보드도 설정합니다. 필요에 따라 사용자 정의 혹은 자신의 CloudWatch Logs 로그 그룹에 새 계정을 만들 수도 있습니다.
이 템플릿을 통해 필요한 모든 자원을 만드는 데 약 10 분이 소요됩니다. 완료되고 나면, CloudFormation 콘솔의 Output 탭에 대시 보드 및 관리 도구의 URL이 표시됩니다.
현재 스택은 이전 버전의 샘플 대시 보드와 함께 Kibana 3.0 및 4.0으로 구축됩니다 (Kibana 4.0를 사용하는 경우는 약간 수동 설정을 해야 합니다). 첫 번째 샘플 대시 보드는 VPC Flow Log가 표시됩니다. 보시다시피 상당한 양의 정보가 포함되어 있습니다.
다음 예제는 람다 함수 자체에 의해 생성 된 Lambda Function 실행 정보가 표시되어 있습니다.
마지막 세 가지 열은 아래의 Lambda Function 코드로 작성되었습니다. Function에서 Kinesis 스트림을 처리 후 각 호출에 대한 정보를 로그에 기록합니다.
exports.handler = function(event, context) {
var start = new Date().getTime();
var bytesRead = 0;
event.Records.forEach(function(record) {
// Kinesis data is base64 encoded so decode here
payload = new Buffer(record.kinesis.data, 'base64').toString('ascii');
bytesRead += payload.length;
// log each record
console.log(JSON.stringify(record, null, 2));
});
// collect statistics on the function's activity and performance
console.log(JSON.stringify({
"recordsProcessed": event.Records.length,
"processTime": new Date().getTime() - start,
"bytesRead": bytesRead,
}, null, 2));
context.succeed("Successfully processed " + event.Records.length + " records.");
};
여기에는 약간 재미있는 것이 있습니다. 유효한 JSON 객체임을 판단하고 ElasticSearch 각각 값에 인덱스를 붙입니다. 이것은 매우 편리하고 간단한 방식으로, 디자인 패턴에 대해 연구하는 분은 여러분 시스템에 활용해 보실 수 있습니다. 더 자세한 것은 awslabs Github의 CloudWatch Logs Subscription Consumer를 참고해 보시기 바랍니다.
— Jeff;
이 글은 CloudWatch Logs Subscription Consumer + Elasticsearch + Kibana Dashboards의 한국어 번역글입니다.