Python 미들웨어용 X-Ray SDK로 수신 요청 추적하기 - AWS X-Ray

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

Python 미들웨어용 X-Ray SDK로 수신 요청 추적하기

미들웨어를 애플리케이션에 추가하고 세그먼트 이름을 구성하면 Python용 X-Ray SDK는 샘플링된 각 요청에 대해 세그먼트를 생성합니다. 이 세그먼트에는 HTTP 요청의 시간, 메서드 및 배치가 포함됩니다. 추가로 구성하면 이 세그먼트의 하위 세그먼트가 생성됩니다.

Python용 X-Ray SDK는 수신 HTTP 요청을 구성하기 위한 다음 미들웨어를 지원합니다.

  • Django

  • Flask

  • Bottle

참고

AWS Lambda 함수의 경우, Lambda는 샘플링되는 각 요청마다 세그먼트 하나를 생성합니다. 자세한 정보는 AWS Lambda 그리고 AWS X-Ray 섹션을 참조하세요.

Lambda로 계측된 Python 함수의 예는 작업자을 참조하십시오.

다른 프레임워크의 스크립트 또는 Python 애플리케이션의 경우, 세그먼트를 수동으로 만들 수 있습니다.

각 세그먼트에는 서비스 맵 안에서 애플리케이션을 식별하는 이름이 있습니다. 이 세그먼트의 이름이 정적으로 지정되도록 하거나, 수신 요청의 호스트 헤더를 기반으로 SDK가 동적으로 이름을 지정하도록 구성할 수 있습니다. 동적 이름 지정을 사용하면 요청의 도메인 이름에 따라 그룹을 추적하고 이름이 예상 패턴과 일치하지 않을 경우(예: 호스트 헤더가 위조된 경우) 기본 이름을 적용할 수 있습니다.

전달된 요청

로드 밸런서 또는 기타 중개자가 애플리케이션으로 요청을 전달하는 경우, X-Ray는 IP 패킷 내 소스 IP가 아니라 요청의 X-Forwarded-For 헤더로부터 클라이언트 IP를 가져옵니다. 전달된 요청에 대해 기록된 클라어언트 IP는 위조될 수 있으므로 신뢰하면 안 됩니다.

요청이 전달되면 SDK는 세그먼트에 추가 필드를 설정하여 이를 나타냅니다. 세그먼트에 x_forwarded_for로 설정된 true 필드가 포함된 경우 클라이언트 IP는 HTTP 요청의 X-Forwarded-For 헤더로부터 가져옵니다.

미들웨어는 다음 정보를 포함하는 http 블록으로 각 수신 요청에 대한 세그먼트를 생성합니다.

  • HTTP 메서드 – GET, POST, PUT, DELETE 등.

  • 클라이언트 주소 – 요청을 전송한 클라이언트의 IP 주소.

  • 응답 코드 – 완료된 요청의 HTTP 응답 코드.

  • 시간 – 시작 시간(요청 수신) 및 종료 시간(응답 전송).

  • 유저 에이전트 — 요청에서 가져온 user-agent입니다.

  • 콘텐츠 길이 — 응답의 content-length입니다.

애플리케이션(Django)에 미들웨어 추가

MIDDLEWARE 파일에서 settings.py 목록에 미들웨어를 추가합니다. 기타 미들웨어에서 실패한 요청이 레코딩되도록 X-Ray 미들웨어가 settings.py 파일에서 첫 번째 줄에 있어야 합니다.

예 settings.py - Python 미들웨어용 X-Ray SDK
MIDDLEWARE = [ 'aws_xray_sdk.ext.django.middleware.XRayMiddleware', 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.common.CommonMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'django.middleware.clickjacking.XFrameOptionsMiddleware' ]

settings.py 파일의 INSTALLED_APPS 목록에 X-Ray SDK Django 앱을 추가하세요. 이렇게 하면 앱을 시작하는 동안 X-Ray 레코더를 구성할 수 있습니다.

예 settings.py - Python Django 앱용 X-Ray SDK
INSTALLED_APPS = [ 'aws_xray_sdk.ext.django', 'django.contrib.admin', 'django.contrib.auth', 'django.contrib.contenttypes', 'django.contrib.sessions', 'django.contrib.messages', 'django.contrib.staticfiles', ]

settings.py 파일에서 세그먼트 이름을 구성합니다.

예 settings.py – 세그먼트 이름
XRAY_RECORDER = { 'AWS_XRAY_TRACING_NAME': 'My application', 'PLUGINS': ('EC2Plugin',), }

이는 X-Ray 레코더가 기본 샘플링 속도로 Django 애플리케이션에서 제공하는 요청을 추적하도록 지시합니다. 사용자 지정 샘플링 규칙을 적용하거나 기타 설정을 변경하도록 Django 설정 파일의 레코더를 구성할 수 있습니다.

참고

plugins는 튜플로 전달되므로 단일 플러그인을 지정할 때는 반드시 후행 ,를 포함해야 합니다. 예: plugins = ('EC2Plugin',)

애플리케이션(Flask)에 미들웨어 추가

Flask 애플리케이션을 구성하려면 먼저 xray_recorder에서 세그먼트 이름을 구성해야 합니다. 그런 다음 XRayMiddleware 함수를 사용하여 Flask 애플리케이션을 코드로 패치합니다.

예 app.py
from aws_xray_sdk.core import xray_recorder from aws_xray_sdk.ext.flask.middleware import XRayMiddleware app = Flask(__name__) xray_recorder.configure(service='My application') XRayMiddleware(app, xray_recorder)

이는 X-Ray 레코더가 기본 샘플링 속도로 Flask 애플리케이션에서 제공하는 요청을 추적하도록 지시합니다. 사용자 지정 샘플링 규칙을 적용하거나 기타 설정을 변경하도록 레코더를 코드로 구성할 수 있습니다.

애플리케이션(Bottle)에 미들웨어 추가

Bottle 애플리케이션을 구성하려면 먼저 xray_recorder에서 세그먼트 이름을 구성해야 합니다. 그런 다음 XRayMiddleware 함수를 사용하여 Bottle 애플리케이션을 코드로 패치합니다.

예 app.py
from aws_xray_sdk.core import xray_recorder from aws_xray_sdk.ext.bottle.middleware import XRayMiddleware app = Bottle() xray_recorder.configure(service='fallback_name', dynamic_naming='My application') app.install(XRayMiddleware(xray_recorder))

이는 X-Ray 레코더가 기본 샘플링 속도로 Bottle 애플리케이션에서 제공하는 요청을 추적하도록 지시합니다. 사용자 지정 샘플링 규칙을 적용하거나 기타 설정을 변경하도록 레코더를 코드로 구성할 수 있습니다.

수동으로 Python 코드 구성

Django 또는 Flask를 사용하지 않는 경우 세그먼트를 수동으로 만들 수 있습니다. 각 수신 요청에 대해 세그먼트를 만들거나 패치된 HTTP 또는 AWS SDK 클라이언트 주변에 세그먼트를 만들어서 레코더에서 하위 세그먼트를 추가할 수 있는 컨텍스트를 제공할 수 있습니다.

예 main.py – 수동 구성
from aws_xray_sdk.core import xray_recorder # Start a segment segment = xray_recorder.begin_segment('segment_name') # Start a subsegment subsegment = xray_recorder.begin_subsegment('subsegment_name') # Add metadata and annotations segment.put_metadata('key', dict, 'namespace') subsegment.put_annotation('key', 'value') # Close the subsegment and segment xray_recorder.end_subsegment() xray_recorder.end_segment()

세그먼트 이름 지정 전략 구성

AWS X-Ray는 서비스 이름을 사용하여 사용자의 애플리케이션을 식별하고, 이를 다른 애플리케이션, 데이터베이스, 외부 API, 사용자의 애플리케이션에서 사용하는 AWS 리소스와 구별합니다. X-Ray SDK는 수신 요청에 대한 세그먼트를 생성할 때 해당 세그먼트의 이름 필드에 애플리케이션의 서비스 이름을 기록합니다.

X-Ray SDK는 HTTP 요청 헤더의 호스트 이름 뒤에 세그먼트를 지정할 수 있습니다. 그러나 이 헤더가 위조되면 서비스 맵에 예기치 않은 노드가 발생할 수 있습니다. 위조된 호스트 헤더가 포함된 요청으로 인해 SDK가 잘못된 세그먼트 이름을 지정하는 현상을 방지하려면 들어오는 요청의 기본 이름을 지정해야 합니다.

애플리케이션이 여러 도메인의 요청을 처리하는 경우, 동적 이름 지정 전략을 사용하여 이를 세그먼트 이름에 반영하도록 SDK를 구성할 수 있습니다. 동적 이름 지정 전략을 사용하면 SDK가 예상 패턴과 일치하는 요청에 호스트 이름을 사용하고, 그렇지 않은 요청에 기본 이름을 적용할 수 있습니다.

예를 들어, 하나의 애플리케이션이 세 개의 하위 도메인 (www.example.com, api.example.com, static.example.com) 에 요청을 전송할 수 있습니다. *.example.com 패턴으로 동적 이름 지정 전략을 사용하여 각 하위도메인의 세그먼트를 서로 다른 이름으로 표시하면 서비스 맵에 서비스 노드가 세 개 생깁니다. 이 패턴에 맞지 않는 호스트 이름의 요청이 애플리케이션에 수신되면, 사용자가 지정한 대체 이름의 네 번째 노드가 서비스 맵에 표시됩니다.

모든 요청 세그먼트에 같은 이름을 사용하려면 이전 섹션에 나온 것처럼 레코더를 구성할 때 애플리케이션 이름을 지정합니다.

동적 이름 지정 전략은 호스트 이름이 일치해야 하는 패턴 및 HTTP 요청의 호스트 이름이 패턴과 일치하지 않는 경우 사용할 기본 이름을 정의합니다. Django에서 동적으로 세그먼트에 이름을 지정하려면 DYNAMIC_NAMING 설정을 settings.py 파일에 추가합니다.

예 settings.py – 동적 이름 지정
XRAY_RECORDER = { 'AUTO_INSTRUMENT': True, 'AWS_XRAY_TRACING_NAME': 'My application', 'DYNAMIC_NAMING': '*.example.com', 'PLUGINS': ('ElasticBeanstalkPlugin', 'EC2Plugin') }

패턴에서 '*'를 사용하여 문자열을 일치시키거나 '?'를 사용하여 단일 문자를 일치시킬 수 있습니다. Flask의 경우 레코더를 코드로 구성합니다.

예 main.py – 세그먼트 이름
from aws_xray_sdk.core import xray_recorder xray_recorder.configure(service='My application') xray_recorder.configure(dynamic_naming='*.example.com')
참고

코드에 정의한 기본 서비스 이름을 AWS_XRAY_TRACING_NAME 환경 변수를 사용하여 재정의할 수 있습니다.