AWS Lambda에서 Ruby 코드 계측
Lambda는 AWS X-Ray와 통합되어 Lambda 애플리케이션을 추적, 디버깅 및 최적화할 수 있습니다. 프런트엔드 API에서 백엔드의 스토리지 및 데이터베이스에 이르기까지 애플리케이션의 리소스를 탐색할 때 X-Ray를 사용하여 요청을 추적할 수 있습니다. 빌드 구성에 X-Ray SDK 라이브러리를 추가하기만 하면 함수가 AWS 서비스에 대해 수행하는 모든 호출에 대한 오류 및 지연 시간을 기록할 수 있습니다.
활성 추적을 구성하면 애플리케이션을 통해 특정 요청을 관찰할 수 있습니다. X-Ray 서비스 그래프는 애플리케이션 및 모든 구성 요소에 대한 정보를 보여줍니다. 다음 예제에서는 2개의 함수가 있는 애플리케이션을 보여줍니다. 기본 함수는 이벤트를 처리하고 때로는 오류를 반환합니다. 맨 위의 두 번째 함수는 첫 번째의 로그 그룹에 나타나는 오류를 처리하고 AWS SDK를 사용하여 X-Ray, Amazon Simple Storage Service(Amazon S3), Amazon CloudWatch Logs를 호출합니다.
![X-Ray에서 2개의 개별 애플리케이션 및 각각의 서비스 맵을 보여주는 다이어그램](images/sample-errorprocessor-servicemap.png)
콘솔을 사용하여 Lambda 함수에 대한 활성 추적을 전환하려면 다음 단계를 따르십시오.
활성 추적 켜기
Lambda 콘솔의 함수 페이지
를 엽니다. -
함수를 선택합니다.
구성(Configuration)을 선택한 다음 모니터링 및 운영 도구(Monitoring and operations tools)를 선택합니다.
편집을 선택합니다.
-
X-Ray에서 활성 추적을 켭니다.
-
Save(저장)를 선택합니다.
요금
X-Ray 추적을 AWS 프리 티어의 일부로서 특정 한도까지 매월 무료로 사용할 수 있습니다. 해당 한도를 초과하면 추적 저장 및 검색에 대한 X-Ray 요금이 부과됩니다. 자세한 내용은 AWS X-Ray 요금
함수에 추적 데이터를 X-Ray로 업로드할 권한이 있어야 합니다. Lambda 콘솔에서 추적을 활성화하면 Lambda가 필요한 권한을 함수의 실행 역할에 추가합니다. 그렇지 않으면 실행 역할에 AWSXRayDaemonWriteAccess
X-Ray는 애플리케이션에 대한 모든 요청을 추적하지 않습니다. X-Ray는 모든 요청의 대표 샘플을 여전히 제공하면서 추적이 효율적으로 수행되도록 샘플링 알고리즘을 적용합니다. 샘플링 요율은 초당 요청이 1개이며 추가 요청의 5퍼센트입니다. 함수에 대해 X-Ray 샘플링 요율을 구성할 수 없습니다.
X-Ray에서 추적은 하나 이상의 서비스에서 처리되는 요청에 대한 정보를 기록합니다. Lambda는 각 추적에 대해 2개의 세그먼트를 기록하고, 이에 따라 서비스 그래프에 2개의 노드가 생성됩니다. 다음 이미지에서는 이 두 노드를 강조 표시합니다.
![단일 함수의 X-Ray 서비스 맵.](images/xray-servicemap-function.png)
왼쪽의 첫 번째 노드는 호출 요청을 수신하는 Lambda 서비스를 나타냅니다. 두 번째 노드는 특정 Lambda 함수를 나타냅니다. 다음 예에서는 이러한 2개의 세그먼트가 있는 추적을 보여줍니다. 둘 다 이름이 my-function 이지만 하나는 오리진이 AWS::Lambda
이고 다른 하나는 오리진이 AWS::Lambda::Function
입니다. AWS::Lambda
세그먼트에 오류가 표시되면 Lambda 서비스에 문제가 있는 것입니다. AWS::Lambda::Function
세그먼트에 오류가 표시되면 함수에 문제가 있는 것입니다.
![특정 Lambda 호출의 각 하위 세그먼트에서 지연 시간을 표시하는 X-Ray 추적입니다.](images/V2_sandbox_images/my-function-2-v1.png)
이 예제에서는 3개의 하위 세그먼트를 표시하도록 AWS::Lambda::Function
세그먼트를 확장합니다.
참고
AWS는 현재 Lambda 서비스에 대한 변경 사항을 구현하고 있습니다. 이러한 변경으로 인해, AWS 계정의 여러 Lambda 함수에서 내보내는 시스템 로그 메시지와 추적 세그먼트의 구조와 내용 간에 약간의 차이가 있을 수 있습니다.
여기에 표시된 예제 트레이스는 이전 스타일의 함수 세그먼트를 보여줍니다. 이전 스타일 세그먼트와 새로운 스타일 세그먼트의 차이점은 다음 단락들에 설명되어 있습니다.
이러한 변경 사항은 앞으로 몇 주 동안 구현되며, 중국 및 GovCloud 리전을 제외한 모든 AWS 리전의 모든 기능은 새로운 형식의 로그 메시지 및 추적 세그먼트를 사용하도록 전환됩니다.
이전 스타일의 함수 세그먼트에는 다음과 같은 하위 세그먼트가 포함됩니다.
-
초기화 – 함수를 로드하고 초기화 코드를 실행하는 데 소요된 시간을 나타냅니다. 이 하위 세그먼트는 함수의 각 인스턴스에서 처리하는 첫 번째 이벤트에 대해서만 표시됩니다.
-
호출— 핸들러 코드를 실행하는 데 소요된 시간을 나타냅니다.
-
오버헤드 – Lambda 런타임이 다음 이벤트를 처리하기 위해 준비하는 데 소비하는 시간을 나타냅니다.
새로운 스타일의 함수 세그먼트에는 Invocation
하위 세그먼트가 포함되지 않습니다. 대신, 고객 하위 세그먼트는 함수 세그먼트에 직접 연결됩니다. 이전 스타일과 새로운 스타일의 함수 세그먼트의 구조에 대한 자세한 내용은 X-Ray 추적 이해를 참조하세요.
핸들러 코드를 계측하여 메타데이터를 기록하고 다운스트림 호출을 추적할 수 있습니다. 핸들러가 다른 리소스 및 서비스에 대해 수행하는 호출과 관련된 세부 정보를 기록하려면 X-Ray SDK for Ruby를 사용합니다. 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) ...
X-Ray에서 추적은 하나 이상의 서비스에서 처리되는 요청에 대한 정보를 기록합니다. Lambda는 각 추적에 대해 2개의 세그먼트를 기록하고, 이에 따라 서비스 그래프에 2개의 노드가 생성됩니다. 다음 이미지에서는 이 두 노드를 강조 표시합니다.
![단일 함수의 X-Ray 서비스 맵.](images/xray-servicemap-function.png)
왼쪽의 첫 번째 노드는 호출 요청을 수신하는 Lambda 서비스를 나타냅니다. 두 번째 노드는 특정 Lambda 함수를 나타냅니다. 다음 예에서는 이러한 2개의 세그먼트가 있는 추적을 보여줍니다. 둘 다 이름이 my-function 이지만 하나는 오리진이 AWS::Lambda
이고 다른 하나는 오리진이 AWS::Lambda::Function
입니다. AWS::Lambda
세그먼트에 오류가 표시되면 Lambda 서비스에 문제가 있는 것입니다. AWS::Lambda::Function
세그먼트에 오류가 표시되면 함수에 문제가 있는 것입니다.
![특정 Lambda 호출의 각 하위 세그먼트에서 지연 시간을 표시하는 X-Ray 추적입니다.](images/V2_sandbox_images/my-function-2-v1.png)
이 예제에서는 3개의 하위 세그먼트를 표시하도록 AWS::Lambda::Function
세그먼트를 확장합니다.
참고
AWS는 현재 Lambda 서비스에 대한 변경 사항을 구현하고 있습니다. 이러한 변경으로 인해, AWS 계정의 여러 Lambda 함수에서 내보내는 시스템 로그 메시지와 추적 세그먼트의 구조와 내용 간에 약간의 차이가 있을 수 있습니다.
여기에 표시된 예제 트레이스는 이전 스타일의 함수 세그먼트를 보여줍니다. 이전 스타일 세그먼트와 새로운 스타일 세그먼트의 차이점은 다음 단락들에 설명되어 있습니다.
이러한 변경 사항은 앞으로 몇 주 동안 구현되며, 중국 및 GovCloud 리전을 제외한 모든 AWS 리전의 모든 기능은 새로운 형식의 로그 메시지 및 추적 세그먼트를 사용하도록 전환됩니다.
이전 스타일의 함수 세그먼트에는 다음과 같은 하위 세그먼트가 포함됩니다.
-
초기화 – 함수를 로드하고 초기화 코드를 실행하는 데 소요된 시간을 나타냅니다. 이 하위 세그먼트는 함수의 각 인스턴스에서 처리하는 첫 번째 이벤트에 대해서만 표시됩니다.
-
호출— 핸들러 코드를 실행하는 데 소요된 시간을 나타냅니다.
-
오버헤드 – Lambda 런타임이 다음 이벤트를 처리하기 위해 준비하는 데 소비하는 시간을 나타냅니다.
새로운 스타일의 함수 세그먼트에는 Invocation
하위 세그먼트가 포함되지 않습니다. 대신, 고객 하위 세그먼트는 함수 세그먼트에 직접 연결됩니다. 이전 스타일과 새로운 스타일의 함수 세그먼트의 구조에 대한 자세한 내용은 X-Ray 추적 이해를 참조하세요.
HTTP 클라이언트를 계측하고, SQL 쿼리를 기록하고, 주석 및 메타데이터가 있는 사용자 지정 하위 세그먼트를 생성할 수도 있습니다. 자세한 내용은 AWS X-Ray 개발자 안내서의 X-Ray SDK for Ruby를 참조하세요.
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 클라이언트를 계측하는 경우 함수 코드와 배포 패키지가 상당히 커질 수 있습니다. 함수 코드를 업데이트할 때마다 런타임 종속성을 업로드하지 않으려면 X-Ray SDK를 Lambda 계층에 패키징합니다.
다음 예제에서는 X-Ray SDK for Ruby를 저장하는 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