API Gateway와 Lambda 로그

로깅은 백엔드 구축에서 필수적인 부분이며, 서버리스 API에서도 마찬가지입니다. 로깅은 들어오는 요청을 어떻게 처리하고 응답하는지에 대한 가시성을 제공합니다.

로그의 종류

모놀리식 환경에서 흔히 사용하는 로그는 크게 두 가지로 나뉩니다.

  • 서버 로그

    웹 서버 로그는 발생한 순서대로 요청 기록을 유지합니다. 각 로그 항목에는 클라이언트 IP 주소, 요청 날짜/시간, 요청 경로, HTTP 코드, 제공된 바이트 수, 사용자 에이전트 등 요청에 대한 정보가 포함됩니다.

  • 애플리케이션 로그

    애플리케이션 로그는 웹 애플리케이션이 기록한 이벤트 파일입니다. 일반적으로 오류, 경고, 정보 이벤트가 포함됩니다. 예상치 못한 함수 실패부터 사용자 행동을 이해하기 위한 주요 이벤트까지 모든 것이 기록될 수 있습니다.

서버리스 환경에서는 기본 인프라에 대한 제어권이 적기 때문에, 애플리케이션 성능을 파악하려면 로깅이 유일한 방법입니다. Amazon CloudWatch는 리소스에 대한 메트릭을 수집하고 추적하는 데 도움을 주는 모니터링 서비스입니다. 서버 로그와 애플리케이션 로그를 비유하자면, API Gateway 로그는 서버 로그로, Lambda 로그는 애플리케이션 로그로 생각할 수 있습니다.

이번 장에서는 다음 내용을 다룹니다.

시작해 보겠습니다.

API Gateway CloudWatch 로그 활성화

이 과정은 두 단계로 이루어집니다. 먼저 API Gateway가 CloudWatch에 로그를 쓸 수 있도록 IAM 역할을 생성해야 합니다. 그런 다음 API 프로젝트에 대한 로깅을 활성화해야 합니다.

먼저 AWS 콘솔에 로그인하고 서비스 목록에서 IAM을 선택합니다.

IAM 서비스 선택 스크린샷

왼쪽 메뉴에서 Roles를 선택합니다.

IAM 역할 선택 스크린샷

Create Role을 선택합니다.

IAM 역할 생성 선택 스크린샷

AWS service에서 API Gateway를 선택합니다.

API Gateway IAM 역할 선택 스크린샷

Next: Permissions를 클릭합니다.

IAM 역할 권한 부여 선택 스크린샷

Next: Review를 클릭합니다.

IAM 역할 검토 선택 스크린샷

Role name을 입력하고 Create role을 선택합니다. 여기서는 역할 이름을 APIGatewayCloudWatchLogs로 지정했습니다.

IAM 역할 정보 입력 스크린샷

방금 생성한 역할을 클릭합니다.

생성된 API Gateway IAM 역할 선택 스크린샷

Role ARN을 기록해 둡니다. 이 값은 나중에 필요합니다.

IAM Role ARN 스크린샷

이제 IAM 역할을 생성했으니, API Gateway 프로젝트에 대한 로깅을 활성화해 보겠습니다.

AWS 콘솔로 돌아가서 서비스 목록에서 API Gateway를 선택합니다.

API Gateway 서비스 선택 스크린샷

왼쪽 패널에서 Settings를 선택합니다.

API Gateway 설정 선택 스크린샷

방금 생성한 IAM 역할의 ARN을 CloudWatch log role ARN 필드에 입력하고 Save를 클릭합니다.

API Gateway CloudWatch 정보 입력 스크린샷

왼쪽 패널에서 API 프로젝트를 선택하고 Stages를 선택한 후 로깅을 활성화할 스테이지를 선택합니다. Notes App API의 경우 prod 스테이지에 배포했습니다.

API Gateway 스테이지 선택 스크린샷

Logs 탭에서:

  • Enable CloudWatch Logs를 체크합니다.
  • Log levelINFO로 설정하여 모든 요청을 로깅합니다.
  • Log full requests/responses data를 체크하여 요청 및 응답 본문 전체를 로그에 포함합니다.
  • Enable Detailed CloudWatch Metrics를 체크하여 CloudWatch 메트릭에서 지연 시간과 오류를 추적합니다.

API Gateway 로깅 정보 입력 스크린샷

페이지 하단으로 스크롤하여 Save Changes를 클릭합니다. 이제 API Gateway 요청이 CloudWatch를 통해 로깅됩니다.

실행 로그는 많은 양의 로그 데이터를 생성할 수 있으므로, 로깅을 계속 활성화해 두는 것은 권장하지 않습니다. 이 로그는 디버깅에 더 적합합니다. API Gateway는 액세스 로그도 지원하며, 이를 활성화해 두는 것을 권장합니다. API Gateway 프로젝트에 액세스 로그를 활성화하는 방법을 참고하세요.

Lambda CloudWatch 로그 활성화

Lambda CloudWatch 로그는 기본적으로 활성화되어 있습니다. 각 실행에 대한 지속 시간과 최대 메모리 사용량을 추적합니다. console.log를 통해 CloudWatch에 추가 정보를 기록할 수 있습니다. 예를 들어:

export function main(event, context, callback) {
  console.log("Hello world");
  callback(null, { body: "" });
}

API Gateway CloudWatch 로그 보기

CloudWatch는 로그 항목을 Log Groups로 그룹화하고, 이를 다시 Log Streams로 나눕니다. Log Groups와 Log Streams는 AWS 서비스마다 다른 의미를 가질 수 있습니다. API Gateway의 경우, API 프로젝트의 스테이지에서 로깅을 처음 활성화하면 API Gateway는 해당 스테이지에 대해 1개의 로그 그룹을 생성하고, 그룹 내에 300개의 로그 스트림을 만들어 로그 항목을 저장할 준비를 합니다. API Gateway는 들어오는 요청이 있을 때 이 스트림 중 하나를 선택합니다.

API Gateway 로그를 보려면 AWS 콘솔에 로그인하고 서비스 목록에서 CloudWatch를 선택하세요.

CloudWatch 서비스 선택 스크린샷

왼쪽 패널에서 Logs를 선택하세요.

CloudWatch 로그 선택 스크린샷

API-Gateway-Execution-Logs_로 시작하고 API Gateway ID가 뒤에 붙은 로그 그룹을 선택하세요.

CloudWatch API Gateway 로그 그룹 선택 스크린샷

마지막 이벤트 시간 순으로 정렬된 300개의 로그 스트림이 보일 것입니다. 이는 마지막으로 요청이 기록된 시간입니다. 첫 번째 스트림을 선택하세요.

CloudWatch API Gateway 로그 스트림 선택 스크린샷

이제 요청별로 그룹화된 로그 항목을 확인할 수 있습니다.

CloudWatch API Gateway 로그 항목 스크린샷

연속된 두 그룹의 로그가 반드시 실시간으로 연속된 두 요청을 의미하지는 않는다는 점에 유의하세요. 이는 이 두 요청 사이에 처리된 다른 요청이 다른 로그 스트림에 기록되었을 수 있기 때문입니다.

Lambda CloudWatch 로그 확인하기

Lambda의 경우, 각 함수마다 고유한 로그 그룹이 있습니다. 그리고 Lambda 함수의 새 버전이 배포되거나 일정 시간 동안 사용되지 않으면 로그 스트림이 교체됩니다.

Lambda 로그를 확인하려면, 왼쪽 패널에서 Logs를 다시 선택하세요. 그런 다음 /aws/lambda/로 시작하고 함수 이름이 뒤따르는 첫 번째 로그 그룹을 선택합니다.

CloudWatch Lambda 로그 그룹 선택 스크린샷

첫 번째 스트림을 선택하세요.

CloudWatch Lambda 로그 스트림 선택 스크린샷

각 함수 호출에 대한 기본 실행 정보와 함께 START, END, REPORT가 표시됩니다. 또한 Lambda 코드에서 console.log를 통해 기록된 내용도 확인할 수 있습니다.

CloudWatch Lambda 로그 항목 스크린샷

Serverless CLI를 사용하여 Lambda 함수의 CloudWatch 로그를 확인할 수도 있습니다.

프로젝트 루트에서 다음 명령어를 실행하세요.

$ serverless logs -f <func-name>

여기서 <func-name>은 찾고 있는 Lambda 함수의 이름입니다. 추가적으로 --tail 플래그를 사용하면 로그를 자동으로 콘솔에 스트리밍할 수 있습니다.

$ serverless logs -f <func-name> --tail

이 기능은 console.log 호출을 사용하여 함수를 디버깅할 때 개발 중에 매우 유용합니다.

이 가이드가 여러분의 API Gateway 및 Lambda 프로젝트에 CloudWatch 로깅을 설정하는 데 도움이 되었기를 바랍니다. 또한 AWS 콘솔을 사용하여 서버리스 로그를 읽는 방법에 대한 간단한 아이디어도 제공했기를 바랍니다.