AWS Lambda에서 Go 코드 계측하기

AWS Lambda에서 Go 코드 계측하기 (Instrumenting Go code in AWS Lambda)

Lambda는 AWS X-Ray와 통합되어 Lambda 애플리케이션을 추적·디버그·최적화하도록 도와줘요. X-Ray로 요청이 애플리케이션의 리소스(Lambda 함수와 다른 AWS 서비스 포함)를 통과하는 과정을 추적할 수 있어요.

X-Ray에 추적 데이터를 보내는 SDK 라이브러리는 두 가지 중 하나를 쓸 수 있어요.

두 SDK 모두 텔레메트리 데이터를 X-Ray 서비스로 보내는 방법을 제공해요. 그러면 X-Ray로 애플리케이션의 성능 지표를 보고, 필터링하고, 인사이트를 얻어 문제와 최적화 기회를 식별할 수 있어요.

중요 X-Ray 및 Powertools for AWS Lambda SDK는 AWS가 제공하는 긴밀하게 통합된 계측 솔루션의 일부예요. ADOT Lambda 레이어는 일반적으로 더 많은 데이터를 수집하지만 모든 사용 사례에 적합하지 않을 수 있는 산업 표준 추적 계측 방식의 일부예요. 두 솔루션 중 하나로 X-Ray에서 엔드투엔드 추적을 구현할 수 있어요. 둘 사이의 선택에 대해 알아보려면 AWS Distro for Open Telemetry와 X-Ray SDK 사이에서 선택하기를 참고하세요.

섹션

  • ADOT로 Go 함수 계측하기
  • X-Ray SDK로 Go 함수 계측하기
  • Lambda 콘솔로 추적 활성화하기
  • Lambda API로 추적 활성화하기
  • CloudFormation으로 추적 활성화하기
  • X-Ray 추적 해석하기

출처: AWS Lambda 개발자 안내서

본문

ADOT로 Go 함수 계측하기

ADOT는 OTel SDK로 텔레메트리 데이터를 수집하는 데 필요한 모든 것을 패키징한 완전 관리형 Lambda 레이어(layer)를 제공해요. 이 레이어를 사용하면 함수 코드를 전혀 수정하지 않고 Lambda 함수를 계측할 수 있어요. 레이어를 OTel의 커스텀 초기화를 하도록 구성할 수도 있어요. 자세한 내용은 ADOT 문서의 Lambda의 ADOT Collector 커스텀 구성을 참고하세요.

Go 런타임에서는 ADOT Go용 AWS 관리형 Lambda 레이어를 추가해 함수를 자동으로 계측할 수 있어요. 이 레이어를 추가하는 자세한 방법은 ADOT 문서의 AWS Distro for OpenTelemetry Lambda Support for Go를 참고하세요. Lambda Telemetry API 이벤트를 OpenTelemetry 스팬(span)으로 변환하는 방법은 Lambda Telemetry API 이벤트 객체를 OpenTelemetry 스팬으로 변환하기를 참고하세요.

X-Ray SDK로 Go 함수 계측하기

Lambda 함수가 애플리케이션의 다른 리소스에 하는 호출에 대한 세부 정보를 기록하려면 AWS X-Ray SDK for Go를 사용할 수도 있어요. SDK를 얻으려면 go get으로 GitHub 저장소에서 다운로드해요.

go get github.com/aws/aws-xray-sdk-go

AWS SDK 클라이언트를 계측하려면 클라이언트를 xray.AWS() 메서드에 전달해요. 그런 다음 메서드의 WithContext 버전을 사용해 호출을 추적할 수 있어요.

svc := s3.New(session.New())
xray.AWS(svc.Client)
...
svc.ListBucketsWithContext(ctx aws.Context, input *ListBucketsInput)

올바른 의존성을 추가하고 필요한 코드 변경을 마친 뒤에는 Lambda 콘솔이나 API를 통해 함수 구성에서 추적을 활성화해요.

Lambda 콘솔로 추적 활성화하기

콘솔로 Lambda 함수의 활성 추적을 켜려면 다음 단계를 따라요.

활성 추적을 켜려면

  1. Lambda 콘솔의 Functions 페이지를 열어요.
  2. 함수를 선택해요.
  3. Configuration을 선택한 다음 Monitoring and operations tools를 선택해요.
  4. Additional monitoring tools에서 Edit을 선택해요.
  5. CloudWatch Application Signals and AWS X-Ray에서 Lambda service traces에 대해 Enable을 선택해요.
  6. Save를 선택해요.

Lambda API로 추적 활성화하기

AWS CLI나 AWS SDK로 Lambda 함수에 추적을 구성하려면 다음 API 연산을 사용해요.

다음 AWS CLI 명령은 my-function이라는 함수에서 활성 추적을 활성화해요.

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

추적 모드는 함수 버전을 게시할 때 버전별 구성의 일부예요. 게시된 버전에서는 추적 모드를 변경할 수 없어요.

CloudFormation으로 추적 활성화하기

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 추적 해석하기

함수는 추적 데이터를 X-Ray에 업로드할 권한이 필요해요. Lambda 콘솔에서 추적을 활성화하면 Lambda가 함수의 실행 역할에 필요한 권한을 추가해요. 그 외에는 AWSXRayDaemonWriteAccess 정책을 실행 역할에 추가해요.

활성 추적을 구성한 뒤에는 애플리케이션을 통한 특정 요청을 관찰할 수 있어요. X-Ray 서비스 그래프(service graph)는 애플리케이션과 그 모든 구성 요소에 대한 정보를 보여줘요. 다음 예시는 함수 두 개가 있는 애플리케이션을 보여줘요. 기본 함수가 이벤트를 처리하고 때때로 오류를 반환해요. 위쪽의 두 번째 함수는 첫 번째 함수의 로그 그룹에 나타나는 오류를 처리하고, AWS SDK로 X-Ray·Amazon Simple Storage Service(Amazon S3)·Amazon CloudWatch Logs를 호출해요.

X-Ray는 애플리케이션에 대한 모든 요청을 추적하지 않아요. X-Ray는 샘플링 알고리즘을 적용해 모든 요청의 대표적인 샘플을 제공하면서도 추적이 효율적이도록 해요. 샘플링 비율은 초당 1건의 요청과 추가 요청의 5%예요. 함수의 X-Ray 샘플링 비율은 구성할 수 없어요.

X-Ray에서 추적(trace) 은 하나 이상의 서비스가 처리하는 요청에 대한 정보를 기록해요. Lambda는 추적당 2개의 세그먼트를 기록해서 서비스 그래프에 두 노드를 만들어요.

왼쪽의 첫 번째 노드는 호출 요청을 받는 Lambda 서비스를 나타내고, 두 번째 노드는 여러분의 특정 Lambda 함수를 나타내요. 다음 예시는 이 두 세그먼트가 있는 추적을 보여줘요. 둘 다 my-function이라는 이름이지만 하나는 origin이 AWS::Lambda이고 다른 하나는 origin이 AWS::Lambda::Function이에요. AWS::Lambda 세그먼트에 오류가 표시되면 Lambda 서비스에 문제가 있는 것이고, AWS::Lambda::Function 세그먼트에 오류가 표시되면 함수에 문제가 있는 거예요.

이 예시는 AWS::Lambda::Function 세그먼트를 펼쳐 그 세 개의 세그먼트를 보여줘요.

참고 AWS는 현재 Lambda 서비스에 변경을 구현하고 있어요. 이 변경 때문에 계정의 서로 다른 Lambda 함수가 내보내는 시스템 로그 메시지와 추적 세그먼트의 구조·내용에 약간의 차이가 보일 수 있어요. 여기 보여주는 예시 추적은 구식(old-style) 함수 세그먼트를 보여줘요. 구식과 신식(new-style) 세그먼트의 차이는 아래 단락에서 설명해요. 이 변경은 앞으로 몇 주에 걸쳐 구현될 예정이며, 중국과 GovCloud 리전을 제외한 모든 AWS 리전의 모든 함수가 새 형식의 로그 메시지와 추적 세그먼트로 전환돼요.

구식 함수 세그먼트는 다음 세그먼트들을 포함해요.

  • Initialization — 함수를 로드하고 초기화 코드를 실행하는 데 걸린 시간을 나타내요. 이 세그먼트는 함수의 각 인스턴스가 처리하는 첫 번째 이벤트에만 나타나요.
  • Invocation — 핸들러 코드를 실행하는 데 걸린 시간을 나타내요.
  • Overhead — Lambda 런타임이 다음 이벤트를 처리할 준비를 하는 데 소요한 시간을 나타내요.

신식 함수 세그먼트에는 Invocation 세그먼트가 없어요. 대신 고객 세그먼트가 함수 세그먼트에 직접 연결돼요. 구식과 신식 함수 세그먼트 구조에 대한 자세한 내용은 X-Ray 추적 이해하기를 참고하세요.

HTTP 클라이언트를 계측하고, SQL 쿼리를 기록하고, 주석(annotation)과 메타데이터로 커스텀 세그먼트를 만들 수도 있어요. 자세한 내용은 AWS X-Ray Developer Guide의 AWS X-Ray SDK for Go를 참고하세요.

가격

AWS Free Tier의 일부로 매월 일정 한도까지 X-Ray 추적을 무료로 사용할 수 있어요. 그 임계값을 넘으면 X-Ray가 추적 저장과 검색에 요금을 부과해요. 자세한 내용은 AWS X-Ray pricing을 참고하세요.

더 알아보기 (Learn more)