팀에서 운영하는 프로젝트중 하나는 Serverless 기반으로 백엔드를 구성하여 서비스하고 있습니다. 이 서비스에서 Backend API별 호출 빈도를 확인하는 로직이 필요하게 되었고 모든 API가 람다로 구성되어 있기 때문에 각 API의 호출 빈도를 알기 위해서 CloudTrail을 통해 특정 람다 그룹의 호출 로그를 확보하여 CloudWatch로 전송후 CloudWatch Insight로 분석하는 아키텍쳐로 문제를 해결하였습니다.
우선 이 포스트에서는 특정 이름으로 시작되는(특정 프로젝트의) 람다의 CloudTrail 로깅을 설정하고 이를 CloudWatch로 전송하는 솔루션과 그 CloudFormation 템플릿을 공유하려 합니다.
AWS CloudTrail과 고급 이벤트 선택기(Advanced Event Selector)
CloudTrail은 기본적으로 AWS 대부분의 서비스의 사용 기록을 로깅하고 있습니다. 다만 S3의 액세스 로그와 람다의 호출 로그의 별도의 설정을 해야 로깅이 가능합니다. 이때 어떤 람다/S3를 로깅할지 선택을 해야 하는데 예전까지는 단 하나의 ARN 만을 설정할 수 있었습니다. 즉 원하는 규칙에 따라 다수의 람다를 로깅하기 위해서는 일일이 하나식 람다를 선택해주어야 했습니다.
2020년 12월 4일에 발표된 고급 이벤트 선택기(Advanced Event Selector)를 사용하면 정규식과 비슷하게 특정 문자열로 시작하는 ARN 혹은 이벤트 이름을 선별하여 로깅을 설정할 수 있습니다. 몇 가지 상황의 예를 적어보면
- S3에서 이름이 “twinny로 시작하고” “test”로 끝나는 이름을 제외한” 모든 버킷에 대해 “DeleteObject 이벤트만을” 로깅하기
- 람다 함수에서 “twinny로 시작하고” “prod”로 끝나면서” “twinny-prod-nolog” 라는 이름을 제외한 람다만 로깅하기
이런 식으로 여러 조건들을 조합해서 원하는 리소스만을 꼭 찝어서 로깅할 수 있습니다.
CloudTrail로 로그 설정하기
- 우선 CloudTrail 서비스로 진입하여 대시보드에 추적 생성을 클릭합니다.
- 추적의 이름과 CloudTrail의 추적을 저장할 버킷 이름 KMS의 이름(신규 생성시)을 입력합니다.
- CloudWatch Logs에 활성화를 체크하면 CloudWatch 관련 설정이 나타난다. 이때 전달할 로그 그룹의 이름과 새로 생성할 IAM역할을 지정합니다. 또 필요시 아래의 적절한 태그를 넣습니다.
- 다음으로 진입하면 로그 이벤트 선택 설정창으로 진입합니다. 이때 이벤트 유형에서 데이터 이벤트만을 선택합니다. 그리고 아래의 고급 이벤트 선택기로 전환 버튼을 누릅니다.
- 다음으로 진입하면 로그 이벤트 선택 설정창으로 진입합니다. 이때 이벤트 유형에서 데이터 이벤트만을 선택합니다. 그리고 아래의 고급 이벤트 선택기로 전환 버튼을 누릅니다.
고급 이벤트 선택기에서 이벤트 유형을 람다로 선택합니다. 로그 선택기 템플릿은 사용자 지정을 선택합니다.
아래에 나타난 필드에서 원하는 방법으로 리소스 선택기를 편집할 수 있습니다. 예시로 연산자를 다음으로 시작함을 선택하고 람다 특정 ARN(예:arn:aws:lambda:ap-northeast-2:12345679:function:spark)을 입력하면 해당 이름으로 시작하는 람다만을 선택해 로깅을 설정할 수 있습니다.
CloudFormation 템플릿
위의 모든 내용을 담아 Cloudformation 템플릿을 구성하였습니다. 아래 템플릿은
- 지정한 람다 고급 이벤트 선택기 규칙에 따라 람다 호출을 로깅하는 CloudTrail을 만들고
- 해당 로그를 CloudWatch로 전송합니다.
파라메터 값
- CWLogGroupName: CloudWatch Group 이름
- CTLogBucketName: CloudTrail을 저장할 버킷 명
- OperatorType: 고급 이벤트 선택기 규칙. “EndsWith”, “Equals”, “NotEndsWith”, “NotEquals”, “NotStartsWith”, “StartsWith” 중 하나를 선택해야 합니다.
- LambdaArn: 입력할 람다 ARN
예를들어 OperatorType로 EndsWith 를 선택하면 해당 ARN으로 끝나는 람다를 로깅합니다.
참고로 아직 CloudFormation 에서는 CloudTrail의 고급 이벤트 선택기를 지원하지 않기 때문에 Custom Resource로 해당 이벤트 선택기를 생성하는 람다 함수를 호출하여 고급 이벤트 선택기를 구현하였습니다.
마치며
확보된 로그는 ElasticSearch 혹은 CloudWatch Insight를 통해 시각화 및 분석이 가능합니다. 다음 시간에는 이러한 시각화 방법을 포스팅해보겠습니다.