AWS Lambda용 오류 처리자 샘플 애플리케이션 - AWS Lambda

AWS Lambda용 오류 처리자 샘플 애플리케이션

오류 처리자 샘플 애플리케이션은 AWS Lambda를 사용하여 Amazon CloudWatch Logs 구독의 이벤트를 처리하는 것을 보여 줍니다. CloudWatch Logs를 사용하여 로그 항목이 패턴과 일치할 때 Lambda 함수를 호출할 수 있습니다. 이 애플리케이션의 구독은 함수 로그 그룹에서 ERROR라는 단어를 포함하는 항목을 모니터링합니다. 그리고 응답으로 프로세서 Lambda 함수를 호출합니다. 처리자 함수는 전체 로그 스트림을 검색하여 오류를 야기한 요청의 데이터를 추적하고, 나중에 사용하기 위해 이를 저장합니다.

함수 코드는 다음 파일에서 사용할 수 있습니다.

AWS CLI와 AWS CloudFormation를 사용하여 단 몇 분 내에 샘플을 배포할 수 있습니다. 계정에서 샘플을 다운로드, 구성 및 배포하려면 README의 지침을 따릅니다.

아키텍처 및 이벤트 구조

샘플 애플리케이션은 다음과 같은 AWS 서비스를 사용합니다.

  • AWS Lambda – 함수 코드를 실행하여 CloudWatch Logs로 전송하고 추적 데이터를 X-Ray로 전송합니다.

  • Amazon CloudWatch Logs – 로그를 수집하고, 로그 항목이 필터 패턴과 일치하면 함수를 호출합니다.

  • AWS X-Ray – 추적 데이터를 수집하고, 검색을 위해 추적을 인덱스화하고, 서비스 맵을 생성합니다.

  • Amazon Simple Storage Service(Amazon S3) – 배포 결과물과 애플리케이션 출력을 저장합니다.

각 서비스마다 표준 요금이 적용됩니다.

애플리케이션의 Lambda 함수는 무작위로 오류를 생성합니다. CloudWatch Logs가 함수의 로그에서 ERROR라는 단어를 탐지하면 처리를 위해 이벤트를 처리자 함수로 전송합니다.

예 CloudWatch Logs 메시지 이벤트

{ "awslogs": { "data": "H4sIAAAAAAAAAHWQT0/DMAzFv0vEkbLYcdJkt4qVXmCDteIAm1DbZKjS+kdpB0Jo350MhsQFyVLsZ+unl/fJWjeO5asrPgbH5..." } }

디코딩할 경우, 데이터에는 로그 이벤트에 대한 세부 정보가 포함됩니다. 함수는 이 세부 정보를 사용하여 로그 스트림을 식별하고, 로그 메시지를 구문 분석하여 오류를 야기한 요청의 ID를 확인합니다.

예 디코딩된 CloudWatch Logs 이벤트 데이터

{ "messageType": "DATA_MESSAGE", "owner": "123456789012", "logGroup": "/aws/lambda/lambda-error-processor-randomerror-1GD4SSDNACNP4", "logStream": "2019/04/04/[$LATEST]63311769a9d742f19cedf8d2e38995b9", "subscriptionFilters": [ "lambda-error-processor-subscription-15OPDVQ59CG07" ], "logEvents": [ { "id": "34664632210239891980253245280462376874059932423703429141", "timestamp": 1554415868243, "message": "2019-04-04T22:11:08.243Z\t1d2c1444-efd1-43ec-b16e-8fb2d37508b8\tERROR\n" } ] }

처리자 함수는 CloudWatch Logs 이벤트의 정보를 사용하여, 오류를 야기한 요청에 대한 전체 로그 스트림과 X-Ray 추적을 다운로드하여 Amazon S3 버킷에 저장합니다. 로그 스트림과 추적 시간이 끝날 수 있도록. 함수는 데이터에 액세스하기 전에 잠깐 기다립니다.

AWS X-Ray를 사용하여 계측

이 애플리케이션은 AWS X-Ray를 사용하여 함수 호출 및 AWS 서비스에 대한 함수의 호출을 추적합니다. X-Ray는 함수로부터 받은 추적 데이터를 사용하여 오류 식별에 도움이 되는 서비스 맵을 생성합니다. 다음 서비스 맵은 일부 요청에 대한 오류를 생성하는 무작위 오류 함수를 보여줍니다. 또한 X-Ray, CloudWatch Logs, Amazon S3(이)라고 하는 처리자 함수도 확인할 수 있습니다.

두 가지 Node.js 함수는 템플릿에서 활성 추적으로 구성되며, Node.js용 AWS X-Ray SDK를 사용하여 코드로 계측화됩니다. 활성 추적을 통해, Lambda 태그는 수신되는 요청에 추적 헤더를 추가하고, 추적을 시간 정보와 함께 X-Ray로 전송합니다. 또한 무작위 오류 함수는 X-Ray SDK를 사용하여 요청 ID와 사용자 정보를 주석에 기록합니다. 주석은 추적에 첨부되며, 이를 이용해 특정 요청에 대한 추적 위치를 찾을 수 있습니다.

처리자 함수는 CloudWatch Logs 이벤트로부터 요청 ID를 받은 후 AWS SDK for JavaScript를 사용하여 해당 요청에 대한 X-Ray를 검색합니다. 그리고 X-Ray SDK를 통해 계측한 AWS SDK 클라이언트를 사용하여 추적 및 로그 스트림을 다운로드합니다. 그런 다음 이를 출력 버킷에 저장합니다. X-Ray SDK는 이러한 호출을 기록하며, 기록된 호출은 추적에 하위 세그먼트로 나타납니다.

AWS CloudFormation 템플릿과 추가 리소스

이 애플리케이션은 두 개의 Node.js 모듈에서 구현되며, AWS CloudFormation 템플릿 및 셸 스크립트로 배포됩니다. 템플릿은 처리자 함수, 무작위 오류 함수 및 다음과 같은 지원 리소스를 생성합니다.

  • 실행 역할 – 다른 AWS 서비스에 대한 액세스 권한을 함수에 부여하는 IAM 역할입니다.

  • 프라이머(Primer) 함수 – 무작위 오류 함수를 호출하여 로그 그룹을 생성하는 추가 함수입니다.

  • 사용자 지정 리소스 – AWS CloudFormation 배포 중 프라이머 함수를 호출하여 로그 그룹이 존재하는지 확인하는 사용자 지정 리소스입니다.

  • CloudWatch Logs 구독 – ERROR라는 단어가 로깅되면 처리자 함수를 트리거하는 로그 스트림에 대한 구독입니다.

  • 리소스 기반 정책 – CloudWatch Logs가 함수를 호출할 수 있도록 허용하는 처리자 함수의 권한 명령문입니다.

  • Amazon S3 버킷 – 처리자 함수의 출력 저장 위치입니다.

GitHub에서 애플리케이션 템플릿을 확인합니다.

Lambda와 AWS CloudFormation의 통합 과정에서 발생하는 제한 문제를 해결하기 위해, 이 템플릿은 배포 중 실행하는 추가 함수를 생성합니다. 모든 Lambda 함수에는 함수 실행의 출력을 저장하는 CloudWatch Logs 로그 그룹이 제공됩니다. 하지만 로그 그룹은 함수가 처음 호출되기 전에는 생성되지 않습니다.

로그 그룹의 존재 여부에 따라 구독을 생성하기 위해 애플리케이션은 세 번째 Lambda 함수를 사용하여 무작위 오류 함수를 호출합니다. 템플릿에는 프라이머 함수에 대한 코드가 인라인으로 포함되어 있습니다. AWS CloudFormation 사용자 지정 리소스는 배포 중에 이를 호출합니다. DependsOn 속성은 로그 스트림과 리소스 기반 정책이 구독 중에 생성되도록 보장합니다.