AWS X-Ray로 Lambda 함수 간접 호출 시각화 - AWS Lambda

AWS X-Ray로 Lambda 함수 간접 호출 시각화

AWS X-Ray를 사용하여 애플리케이션의 구성 요소를 시각화하고, 성능 병목 현상을 식별하고, 오류가 발생한 요청을 문제 해결할 수 있습니다. Lambda 함수는 추적 데이터를 X-Ray로 보내고, X-Ray는 데이터를 처리하여 서비스 맵과 검색 가능한 추적 요약을 생성합니다.

함수를 간접 호출하는 서비스에서 X-Ray 추적을 활성화한 경우 Lambda는 자동으로 추적을 X-Ray로 보냅니다. Amazon API Gateway와 같은 업스트림 서비스 또는 X-Ray SDK로 계측되는 Amazon EC2에서 호스팅되는 애플리케이션은 들어오는 요청을 샘플링하고 Lambda에게 추적 전송 여부를 지시하는 추적 헤더를 추가합니다. Amazon SQS와 같은 업스트림 메시지 생산자의 트레이스가 다운스트림 Lambda 함수의 트레이스에 자동으로 연결되므로 전체 애플리케이션을 종합적으로 파악할 수 있습니다. 자세한 내용은 AWS X-Ray 개발자 가이드에서 이벤트 중심 애플리케이션 추적을 참조하세요.

참고

X-Ray 트레이스는 현재 Amazon Managed Streaming for Apache Kafka(Amazon MSK), 자체 관리형 Apache Kafka, ActiveMQ 및 RabbitMQ를 사용하는 Amazon MQ 또는 Amazon DocumentDB 이벤트 소스 매핑을 사용하는 Lambda 함수에 대해 지원되지 않습니다.

콘솔을 사용하여 Lambda 함수에 대한 활성 추적을 전환하려면 다음 단계를 따르십시오.

활성 추적 켜기
  1. Lambda 콘솔의 함수 페이지를 엽니다.

  2. 함수를 선택합니다.

  3. 구성(Configuration)을 선택한 다음 모니터링 및 운영 도구(Monitoring and operations tools)를 선택합니다.

  4. 편집을 선택합니다.

  5. X-Ray에서 활성 추적을 켭니다.

  6. Save(저장)를 선택합니다.

함수에 추적 데이터를 X-Ray로 업로드할 권한이 있어야 합니다. Lambda 콘솔에서 추적을 활성화하면 Lambda가 필요한 권한을 함수의 실행 역할에 추가합니다. 그렇지 않으면 실행 역할에 AWSXRayDaemonWriteAccess 정책을 추가합니다.

X-Ray는 애플리케이션에 대한 모든 요청을 추적하지 않습니다. X-Ray는 모든 요청의 대표 샘플을 여전히 제공하면서 추적이 효율적으로 수행되도록 샘플링 알고리즘을 적용합니다. 샘플링 요율은 초당 요청이 1개이며 추가 요청의 5퍼센트입니다. 함수에 대해 X-Ray 샘플링 요율을 구성할 수 없습니다.

X-Ray 추적 이해

X-Ray에서 추적은 하나 이상의 서비스에서 처리되는 요청에 대한 정보를 기록합니다. Lambda는 각 추적에 대해 2개의 세그먼트를 기록하고, 이에 따라 서비스 그래프에 2개의 노드가 생성됩니다. 다음 이미지에서는 이 두 노드를 강조 표시합니다.

단일 함수의 X-Ray 서비스 맵.

왼쪽의 첫 번째 노드는 호출 요청을 수신하는 Lambda 서비스를 나타냅니다. 두 번째 노드는 특정 Lambda 함수를 나타냅니다.

Lambda 서비스인 AWS::Lambda에 대해 기록된 세그먼트는 Lambda 실행 환경을 준비하는 데 필요한 모든 단계를 다룹니다. 여기에는 MicroVM의 일정 예약, 구성한 리소스를 사용한 실행 환경의 생성이나 고정 해제 그리고 함수 코드와 모든 계층의 다운로드가 포함됩니다.

AWS::Lambda::Function 세그먼트는 함수가 수행한 작업을 위한 것입니다.

참고

AWS는 현재 Lambda 서비스에 대한 변경 사항을 구현하고 있습니다. 이러한 변경으로 인해, AWS 계정의 여러 Lambda 함수에서 내보내는 시스템 로그 메시지와 추적 세그먼트의 구조와 내용 간에 약간의 차이가 있을 수 있습니다.

이러한 변경은 함수 세그먼트의 하위 세그먼트에 영향을 줍니다. 다음 단락들에서는 이러한 하위 세그먼트의 이전 형식과 새 형식을 모두 설명합니다.

이러한 변경 사항은 앞으로 몇 주 동안 구현되며, 중국 및 GovCloud 리전을 제외한 모든 AWS 리전의 모든 기능은 새로운 형식의 로그 메시지 및 추적 세그먼트를 사용하도록 전환됩니다.

이전 스타일 AWS X-Ray Lambda 세그먼트 구조

AWS::Lambda 세그먼트의 이전 스타일 X-Ray 구조는 다음과 같습니다.

간접 호출 세그먼트를 포함하는 이전 스타일 X-Ray 추적의 구조를 보여주는 다이어그램

이 형식에서 함수 세그먼트에는 Initialization, InvocationOverhead에 대한 하위 세그먼트가 있습니다. Lambda SnapStart의 경우에만 Restore 하위 세그먼트(이 다이어그램에는 표시되지 않음)도 있습니다.

Initialization 하위 세그먼트는 Lambda 실행 환경 수명 주기의 초기화 단계를 나타냅니다. 이 단계 중에 Lambda는 확장을 초기화하고, 런타임을 초기화하며, 함수의 초기화 코드를 실행합니다.

Invocation 하위 세그먼트는 Lambda가 함수 핸들러를 간접 호출하는 간접 호출 단계를 나타냅니다. 이것은 런타임 및 익스텐션 등록으로 시작되며 런타임에서 응답을 보낼 준비가 되면 끝납니다.

(Lambda SnapStart만 해당) Restore 하위 세그먼트는 Lambda가 스냅샷을 복원하고, 런타임(JVM)을 로드하고, 모든 afterRestore 런타임 후크를 실행하는 데 걸리는 시간을 보여줍니다. 스냅샷 복원 프로세스에는 microVM 외부 작업에 소요되는 시간이 포함될 수 있습니다. 이 시간은 Restore 하위 세그먼트에서 보고됩니다. 스냅샷을 복원하기 위해 microVM 외부에서 소요된 시간에 대한 요금은 부과되지 않습니다.

Overhead 하위 세그먼트는 런타임이 응답을 보내는 시간과 다음 간접 호출에 대한 신호 사이에 발생하는 위상을 나타냅니다. 이 시간 동안 런타임은 간접 호출과 관련된 모든 태스크를 완료하고 샌드박스를 고정할 준비를 합니다.

중요

다운스트림 호출, 주석 및 메타데이터를 위한 추가 하위 세그먼트로 Invocation 하위 세그먼트를 확장하기 위해 X-Ray SDK를 사용할 수 있습니다. 함수 세그먼트에 직접 액세스하거나 핸들러 호출 범위 외부에서 수행된 작업을 기록할 수 없습니다.

Lambda 실행 환경 단계에 대한 자세한 내용은 Lambda 실행 환경 수명 주기에 대한 이해를 참조하세요.

이전 스타일의 X-Ray 구조를 사용한 추적의 예는 다음 다이어그램에 나와 있습니다.

간접 호출 세그먼트를 포함하는 이전 스타일 X-Ray 추적의 예를 보여주는 다이어그램

위 예에서 2개의 세그먼트에 주목하세요. 둘 다 이름이 my-function 이지만 하나는 오리진이 AWS::Lambda이고 다른 하나는 오리진이 AWS::Lambda::Function입니다. AWS::Lambda 세그먼트에 오류가 표시되면 Lambda 서비스에 문제가 있는 것입니다. AWS::Lambda::Function 세그먼트에 오류가 표시되면 함수에 문제가 있는 것입니다.

참고

경우에 따라 X-Ray 트레이스에서 함수 초기화 단계와 호출 단계 사이의 간격이 크게 나타날 수 있습니다. 프로비저닝된 동시성을 사용하는 함수의 경우 이는 Lambda가 호출 전에 함수 인스턴스를 초기화하기 때문입니다. 예약되지 않은(온디맨드) 동시성을 사용하는 함수의 경우 호출이 없더라도 Lambda가 함수 인스턴스를 사전에 초기화할 수 있습니다. 시각적으로 이 두 경우 모두 초기화 단계와 호출 단계 사이의 시간 차이로 표시됩니다.

새 스타일 AWS X-Ray Lambda 세그먼트 구조

AWS::Lambda 세그먼트의 새 스타일 X-Ray 구조는 다음과 같습니다.

간접 호출 세그먼트가 없는 새 스타일 X-Ray 추적의 구조를 보여주는 다이어그램

이러한 새 형식에서 Init 하위 세그먼트는 이전처럼 Lambda 실행 환경 수명 주기의 초기화 단계를 나타냅니다.

새 형식에는 간접 호출 세그먼트가 없습니다. 대신, 고객 하위 세그먼트는 AWS::Lambda::Function 세그먼트에 직접 연결됩니다. 이 세그먼트에는 다음의 지표가 주석으로 포함됩니다.

  • aws.responseLatency - 함수가 실행되는 데 걸린 시간

  • aws.responseDuration - 응답을 고객에게 전달하는 데 걸린 시간

  • aws.runtimeOverhead - 런타임이 완료하는 데 필요한 추가 시간의 양

  • aws.extensionOverhead - 확장이 완료하는 데 필요한 추가 시간의 양

새 스타일의 X-Ray 구조를 사용한 추적의 예는 다음 다이어그램에 나와 있습니다.

간접 호출 세그먼트가 없는 새 스타일 X-Ray 추적의 예를 보여주는 다이어그램

위 예에서 2개의 세그먼트에 주목하세요. 둘 다 이름이 my-function 이지만 하나는 오리진이 AWS::Lambda이고 다른 하나는 오리진이 AWS::Lambda::Function입니다. AWS::Lambda 세그먼트에 오류가 표시되면 Lambda 서비스에 문제가 있는 것입니다. AWS::Lambda::Function 세그먼트에 오류가 표시되면 함수에 문제가 있는 것입니다.

Lambda에서의 추적에 대한 언어별 소개는 다음 주제를 참조하세요.

활성 계측을 지원하는 서비스의 전체 목록은 AWS X-Ray 개발자 안내서의 Supported AWS 서비스를 참조하세요.

실행 역할 권한

X-Ray에 추적 데이터를 보내려면 Lambda에 다음 권한이 필요합니다. 이러한 권한을 함수의 실행 역할에 추가합니다.

이러한 권한은 AWSXRayDaemonWriteAccess 관리형 정책에 포함됩니다.

AWS X-Ray 데몬

X-Ray API로 추적 데이터를 직접 보내는 대신 X-Ray SDK는 데몬 프로세스를 사용합니다. AWS X-Ray 데몬은 Lambda 환경에서 실행되고 세그먼트 및 하위 세그먼트를 포함하는 UDP 트래픽을 수신하는 애플리케이션입니다. 수신 데이터를 버퍼링하고 배치로 X-Ray에 작성하여 호출을 추적하는 데 필요한 처리 및 메모리 오버헤드를 줄입니다.

Lambda 런타임을 사용하면 데몬이 함수에 구성된 메모리의 최대 3% 또는 16MB 중 더 큰 메모리를 사용할 수 있습니다. 호출 중에 함수의 메모리가 부족하면 런타임은 먼저 데몬 프로세스를 종료하여 메모리를 확보합니다.

데몬 프로세스는 Lambda에 의해 완전히 관리되며 사용자가 구성할 수 없습니다. 함수 호출에 의해 생성된 모든 세그먼트는 Lambda 함수와 동일한 계정에 기록됩니다. 데몬은 다른 계정으로 리디렉션하도록 구성할 수 없습니다.

자세한 내용은 X-Ray 개발자 안내서의 X-Ray 데몬을 참조하세요.

Lambda API로 활성 추적 활성화

AWS CLI 또는 AWS SDK를 사용하여 추적 구성을 관리하려면 다음 API 작업을 사용합니다.

다음 예제 AWS CLI 명령은 my-function이라는 함수에 대한 활성 추적을 사용 설정합니다.

aws lambda update-function-configuration --function-name my-function \ --tracing-config Mode=Active

추적 모드는 함수 버전을 게시할 때 버전별 구성의 일부입니다. 게시된 버전에 대한 추적 모드는 변경할 수 없습니다.

AWS CloudFormation으로 활성 추적 활성화

AWS CloudFormation 템플릿에서 AWS::Lambda::Function 리소스에 대한 추적을 활성화하려면 TracingConfig 속성을 사용합니다.

function-inline.yml – 추적 구성
Resources: function: Type: AWS::Lambda::Function Properties: TracingConfig: Mode: Active ...

AWS Serverless Application Model(AWS SAM) AWS::Serverless::Function 리소스의 경우 Tracing 속성을 사용합니다.

template.yml – 추적 구성
Resources: function: Type: AWS::Serverless::Function Properties: Tracing: Active ...