AWS X-Ray

  • 애플리케이션이 제공하는 요청에 대한 데이터를 수집하고 해당 데이터를 보고, 필터링하고, 통찰력을 확보하여 문제와 최적화 기회를 식별하는데 사용할 수 있는 도구를 제공
    • 마이크로 서비스 아키텍처, 서버리스 같은 분산 애플리케이션 분석 및 디버깅
    • "성능 추적(Tracing) → 트레이스 저장 → 서비스 맵 보기 → 문제 분석 "
  • 장점:
    • 애플리케이션의 전반적인 과정을 추적할 수 있다
    • 애플리케이션의 문제를 시각적으로 확인이 가능하다
    • bottleneck이 어디서 걸리는지 알고 이를 성능 향상으로 이어지게 할 수 있다
  • X-Ray Daemon:
    • Amazon Linux AMI, RHEL, Ubuntu, OS X 및 윈도 서버 설치 가능
    • {서버 내부에 X-Ray SDK - (Localhost UDP) - X-Ray Daemon} - (HTTPS) - X-Ray API
  • 비용:
    • 프리티어(영구): 100,000개의 트레이스 저장 / 1,000,000개의 스캔 및 검색
    • 추가 요금: 1백만 트레이스 저장 당 $5 / 1백만 트레이스 스캔 및 검색 당 $0.5

  • Trace: 클라이언트 부터 전체 서비스 기록(최대 크기 500KB / 저장 기간 30일)
  • Segments: 개별 서비스에서 생성된 데이터
  • Sub-segments: 원격 호출이나 개별 서비스 내 데이터 처리
  • Annotations: 별도 필터로 추적가능한 사용자 정의 데이터
  • Metadata: 필터로 추적하지 않는 비즈니스 데이터
  • Errors: 정규화된 오류 메시지

DynamoDB 테이블 생성

  • Table name: x-ray-demo
  • Primary key = id (string)
  • 나머지는 default
  • create item 을 대충 해주자.

 

Lambda  함수 생성

  • Function name= x-ray-demo
  • Runtime = Node.js 12.x
const AWS = require('aws-sdk')
exports.handler =  function(event, context, callback) {
const dynamodb = new AWS.DynamoDB()
    var params = {
        TableName: 'x-ray-demo'
    }    
    var body
    dynamodb.scan(params, function(err, data) {
        
        if (err) {
            console.log("error")
            console.log(err, err.stack)
            callback(err)
        } else {
            const response = {
                statusCode: 200,
                body: JSON.stringify(data.Items)
            }
            callback(null, response)
        }
    })
}

 

Lambda 함수를 API Gateway와 연동

Lambda 역할에 DynamoDB의 권한을 추가적으로 부여해주자

후에 API endpoint 클릭하면 DynamoDB의 레코드를 확인할 수 있다.

 

X-Ray tracing

lambda 설정에서 tracing 활성화

그 다음에 API Endpoint로 여러번 접속한 뒤에 X-Ray 대시보드로 이동해 Service Map과 Traces 확인.

Service map
Traces

DynamoDB에 대한 정보는 보이지가 않는다..

 

Lambda Layer

해당 layer를 lambda 함수에 적용해주자

const AWSXRay = require('aws-xray-sdk');
const AWS = AWSXRay.captureAWS(require('aws-sdk'));

exports.handler = function(event, context, callback) {
const dynamodb = new AWS.DynamoDB()
    var params = {
        TableName: 'x-ray-demo'
    }    
    var body
    dynamodb.scan(params, function(err, data) {
        
        if (err) {
            console.log("error")
            console.log(err, err.stack)
            callback(err)
        } else {
            const response = {
                statusCode: 200,
                body: JSON.stringify(data.Items)
            }
            callback(null, response)
        }
    })
}

 

더보기

위의 코드로 Lambda 함수 코드 수정해준다.

(참고로 Layer 생성할 때 썼던 s3 버킷 안의 코드의 경우 아래와 같은 명령어로 생성)

mkdir nodejs
cd nodejs
npm install aws-xray-sdk
zip node-xray-sdk.zip ../nodejs -r

다시 API Endpoint 몇 번 호출하고 X-Ray에서 변경된 사항을 확인해보자.

Service map
Traces

 

만약 MySQL 데이터베이스라면 아래와 같은 코드로 정의하고 사용하면 된다..

const mysql = AWSXRay.captureMySQL(require('mysql'))

 


전체적으로 어렵거나 하는 부분은 없는 느낌..(개인적으로)

이 서비스를 얼마나 어디에 잘 사용하느냐가 중요한듯

서버리스로 구성하는 경우나 그럴 때 찍어서 지연 시간이나 오류 부분 찾는 것도 나쁘지 않은듯...?!

+ Recent posts