WiseN

CloudWatch Logs 로그를 Lambda에서 구독해보았습니다

Mar 09,2018   |   AWS

작성자_김명수

페이스북 공유하기 트위터 공유하기
Blog thumbnail

여기서 다루는 내용


· CloudWatch Logs 간단 소개
· Lambda function준비
· Log Group 구독 설정
· 결과 확인
· 추가 : logstash 연동을 통한 Elasticsearch 적재


 

기본적으로 CloudWatch Logs에서 구독을 통한 로그 데이터 실시간 처리는 Kinesis, Lambda 또는 Kinesis Data Firehose에서 구독 필터가 가능합니다.

여기서 Lambda로 구독하여 S3에 저장되도록 해보았습니다.

※ 현재 서울 리전 Kinesis firehose 미지원  (2018.03 기준)


 




CloudWatch Logs 간단 소개







  • CloudWatch Logs 란?

    • Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스, AWS CloudTrail, Route 53 및 기타 소스에서 로그 파일을 모니터링

    • 로그 데이터 저장 및 액세스 가능

    • 로그 데이터 검색 및 필터링

    • 구독을 통한 로그 데이터 실시간 처리




 




Lambda function 준비






먼저 CloudWatch Logs의 로그 데이터를 받아 S3에 log 파일로 저장하는 Lambda function 을 생성합니다.

:: Execution role 설정




CloudWatch logs에서 발생되는 Event를 받을 Policy와  S3에 로그 파일을 저장하기 위한 Policy가 적용된 Lambda Role을 생성하여 설정합니다.


:: Function code 작성


아마존 공식 문서 예제 2: AWS Lambda에 대한 구독 필터 를 참조하여 코드를 작성합니다.

여기서는 Python 2.7로 작성하였고, Code는 여기서 확인 가능합니다.

전달 받은 Event 데이터의 awslogs.data 를 읽어서 gzip 압축을 풀어 json으로 읽어 logEvents 아래 id , timestamp,  message 로 받도록 작성하고 이를 임시 파일에 저장 후 S3에 업로드하였습니다.

 




Log Group Lambda 구독 설정






 

:: CloudWatch Logs 설정


CloudWatch Logs 콘솔 화면에서 해당 Log Group을 선택하고 아래 이미지 처럼 Stream to AWS Lambda를 눌러 Lamda 구독 설정 화면으로 넘어갑니다.





이어서 Log Format을 설정합니다.  현재 기본적으로 Amazon VPC Flow Logs, AWS CloudTrail, AWS Lambda에 대한 log format을 지원하고 있습니다.

로그 데이터 필터 및 패턴 구문 관련해서 아마존 공식 문서 여기 참고 바랍니다.

 



Other를 선택하고 Test Pattern을 눌러 데이터를 확인해보면 sample log가 일치하는 로그가 없다고 나옵니다.



Filter Pattern에 [] 를 입력해보면 공백 단위로 분리되어 나옵니다.  Log Format에서 제공하는 Space Delimited 와 동일합니다.



Filter Pattern을 [message] 를 입력하여 아래 이미지와 같이 하나의 메시지로 구분되도록 해보겠습니다.



Next를 누르고 Start Streaming을 눌러 아래 이미지와 같이 Lambda 구독 설정을 완료합니다.

Subscriptions 항목에 Lambda function 이 표시되는 것을 확인 할 수 있습니다.






결과 확인






:: 원본 로그 확인


로그 그룹에 추가된 로그는 아래와 같습니다.


:: S3 파일 확인


정상적으로 구독이 된다면 구독중인 Lambda function에서 위의 로그 이벤트를 받아 S3에 파일로 저장을 합니다.

해당 S3 bucket에 정상적으로 저장이 되는 것을 확인 할 수 있습니다.



이제 S3에 업로드된 파일을 다운로드 받아 확인해 보겠습니다.  Lambda function에서 지정한 형식  id|timestamp|message 으로 저장이 된 것을 확인할 수 있습니다.



 




추가 : logstash 연동을 통한 Elasticsearch 적재






Elasticsearch를 사용 중인 경우 위의 Lambda에서 직접 Elasticsearch로 적재를 시도해도 되지만 여기선 S3에 저장된 데이터를 logstash를 활용하여 수집하였습니다.

여기서 일부 logstash plugin을 사용했습니다.

S3 input plugin : input plugin으로 S3에 저장된 로그 파일을 가져옴




input { s3 {
    bucket => "yourbucketname"
    region => "ap-northeast-2"
    access_key_id => 'AAAAAAAAAAAAAAAAAAA'
    secret_access_key => 'BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB'
} }



 

dissect plugin : filter plugin으로  로그를 해부하여 필터




filter { dissect {
    mapping => {
        "message" => "%{id}|%{timestamp}|%{message}"
    }
} }



 

적재를 하고 해당 데이터가 적재가 이루어 지는 것을 kibana에서 확인해 보았습니다.


※ logstash에서 AWS Elstasticsearch에 적재를 하려면 awslab에서 제공하는 logstash-output-amazon-es plugin을 사용하면 됩니다.


 

 




마무리






Cloudwatch logs에 적재되는 특정 로그 그룹을  Lambda에서 구독하는 방식으로 S3에 자동으로 저장하는 것을 해보았고, 추가로 logstash를 활용하여 Elasticsearch로 적재를 해보았습니다.
이상 Amazon CloudWatch Logs의 로그를 Lambda에서 구독해보는 시간을 마무리합니다.