AWS Lambda에서 Ruby 코드 계측 - AWS Lambda

AWS Lambda에서 Ruby 코드 계측

Lambda는 AWS X-Ray와 통합되어 Lambda 애플리케이션을 추적, 디버깅 및 최적화할 수 있습니다. 프런트엔드 API에서 백엔드의 스토리지 및 데이터베이스에 이르기까지 애플리케이션의 리소스를 탐색할 때 X-Ray를 사용하여 요청을 추적할 수 있습니다. 빌드 구성에 X-Ray SDK 라이브러리를 추가하기만 하면 함수가 AWS 서비스에 대해 수행하는 모든 호출에 대한 오류 및 지연 시간을 기록할 수 있습니다.

X-Ray 서비스 맵에는 애플리케이션을 통한 요청 흐름이 표시됩니다. 오류 프로세서 샘플 애플리케이션의 다음 예제는 두 개의 함수가 있는 애플리케이션을 보여줍니다. 기본 함수는 이벤트를 처리하고 때로는 오류를 반환합니다. 두 번째 함수는 첫 번째 함수의 로그 그룹에 나타나는 오류를 처리하고 AWS SDK를 사용하여 X-Ray, Amazon S3 및 Amazon CloudWatch Logs를 호출합니다.


          Service map showing nodes for Lambda functions, X-Ray, Amazon S3 and CloudWatch Logs

추적 헤더가 없는 요청을 추적하려면 함수의 구성에서 적극 추적을 활성화합니다.

적극 추적을 활성화하려면

  1. Lambda 콘솔 함수 페이지를 엽니다.

  2. 함수를 선택합니다.

  3. AWS X-Ray에서 적극 추적을 선택합니다.

  4. 저장을 선택합니다.

요금

X-Ray에는 영구 프리 티어가 있습니다. 프리 티어 한도를 초과하면 추적 저장 및 검색에 대한 X-Ray 요금이 부과됩니다. 자세한 내용은 AWS X-Ray 요금을 참조하십시오.

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

X-Ray는 여전히 애플리케이션이 처리하는 요청에 대한 대표 샘플을 제공하면서 트레이스가 효율적일 수 있도록 샘플링 알고리즘을 적용합니다. 기본 샘플링 규칙은 초당 요청이 1개이며 추가 요청의 5퍼센트입니다.

적극 추적이 활성화되면 Lambda가 호출의 하위 집합에 대한 추적을 기록합니다. Lambda는 두 개의 세그먼트를 기록하여 서비스 맵에 두 개의 노드를 생성합니다. 첫 번째 노드는 호출 요청을 수신하는 Lambda 서비스를 나타냅니다. 두 번째 노드는 함수의 런타임에 의해 기록됩니다.


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

핸들러 코드를 계측하여 메타데이터를 기록하고 다운스트림 호출을 추적할 수 있습니다. 핸들러가 다른 리소스 및 서비스에 대해 수행하는 호출과 관련된 세부 정보를 기록하려면 Ruby용 X-Ray SDK를 사용합니다. SDK를 가져오려면 애플리케이션의 종속성에 aws-xray-sdk 패키지를 추가합니다.

blank-ruby/function/Gemfile

# Gemfile source 'https://rubygems.org' gem 'aws-xray-sdk', '0.11.4' gem 'aws-sdk-lambda', '1.39.0' gem 'test-unit', '3.3.5'

AWS SDK 클라이언트를 계측하려면 초기화 코드에 클라이언트를 생성한 후 aws-xray-sdk/lambda 모듈이 필요합니다.

blank-ruby/function/lambda_function.rb – AWS SDK 클라이언트 추적

# lambda_function.rb require 'logger' require 'json' require 'aws-sdk-lambda' $client = Aws::Lambda::Client.new() $client.get_account_settings() require 'aws-xray-sdk/lambda' def lambda_handler(event:, context:) logger = Logger.new($stdout) ...

다음 예제에서는 두 개의 세그먼트가 있는 추적을 보여줍니다. 둘 다 이름이 my-function이지만, 하나는 AWS::Lambda 형식이고 다른 하나는 AWS::Lambda::Function 형식입니다. 함수 세그먼트는 하위 세그먼트를 표시하도록 확장됩니다.

첫 번째 세그먼트는 Lambda 서비스에 의해 처리된 호출 요청을 나타냅니다. 두 번째 세그먼트는 함수에 의해 수행된 작업을 기록합니다. 함수 세그먼트에는 세 개의 하위 세그먼트가 있습니다.

  • Initialization(초기화) – 함수를 로드하고 초기화 코드를 실행하는 데 소요된 시간을 나타냅니다. 이 하위 세그먼트는 함수의 각 인스턴스에 의해 처리된 첫 번째 이벤트에 대해서만 표시됩니다.

  • Invocation(호출) – 핸들러 코드에 의해 수행된 작업을 나타냅니다. 코드를 계측하면 추가 하위 세그먼트를 통해 이 하위 세그먼트를 확장할 수 있습니다.

  • Overhead(오버헤드) – 다음 이벤트 처리를 준비하기 위해 Lambda 런타임에 의해 수행된 작업을 나타냅니다.

HTTP 클라이언트를 계측하고, SQL 쿼리를 기록하고, 주석 및 메타데이터가 있는 사용자 지정 하위 세그먼트를 생성할 수도 있습니다. 자세한 내용은 AWS X-Ray 개발자 안내서의 Ruby용 X-Ray SDK를 참조하십시오.

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 ...

계층에 런타임 종속성 저장

X-Ray SDK를 사용하여 AWS SDK 클라이언트를 계측하는 경우 함수 코드와 배포 패키지가 상당히 커질 수 있습니다. 함수 코드를 업데이트할 때마다 런타임 종속 항목을 업로드하지 않으려면 Lambda 계층으로 패키징하십시오.

다음 예제에서는 Ruby용 X-Ray SDK를 저장하는 AWS::Serverless::LayerVersion 리소스를 보여줍니다.

template.yml – 종속성 계층

Resources: function: Type: AWS::Serverless::Function Properties: CodeUri: function/. Tracing: Active Layers: - !Ref libs ... libs: Type: AWS::Serverless::LayerVersion Properties: LayerName: blank-ruby-lib Description: Dependencies for the blank-ruby sample app. ContentUri: lib/. CompatibleRuntimes: - ruby2.5

이 구성을 사용하면 런타임 종속성을 변경하는 경우 라이브러리 계층만 업데이트하면 됩니다. 함수 배포 패키지에는 코드만 포함됩니다. 함수 코드를 업데이트할 때 배포 패키지에 종속성을 포함하는 경우보다 업로드 시간이 훨씬 빠릅니다.

종속성 계층을 만들려면 배포 전에 계층 아카이브를 생성하기 위해 빌드를 변경해야 합니다. 사용 가능한 예제는 blank-ruby 샘플 애플리케이션을 참조하십시오.