

# Python을 사용하여 Lambda 함수 빌드
<a name="lambda-python"></a>

AWS Lambda에서 Python 코드를 실행할 수 있습니다. Lambda는 이벤트 처리를 위해 코드를 실행하는 Python을 위한 [런타임](lambda-runtimes.md)을 제공합니다. 코드는 사용자가 관리하는 AWS Identity and Access Management(IAM) 역할의 자격 증명을 사용하여 SDK for Python(Boto3)이 포함된 환경에서 실행됩니다. Python 런타임에 포함된 SDK 버전에 대해 자세히 알아보려면 [런타임에 포함된 SDK 버전](#python-sdk-included) 섹션을 참조하세요.

Lambda는 다음과 같은 Python 런타임을 지원합니다.


| 이름 | 식별자 | 운영 체제 | 사용 중단 날짜 | 블록 함수 생성 | 블록 함수 업데이트 | 
| --- | --- | --- | --- | --- | --- | 
|  Python 3.14  |  `python3.14`  |  Amazon Linux 2023  |   2029년 6월 30일   |   2029년 7월 31일   |   2029년 8월 31일   | 
|  Python 3.13  |  `python3.13`  |  Amazon Linux 2023  |   2029년 6월 30일   |   2029년 7월 31일   |   2029년 8월 31일   | 
|  Python 3.12  |  `python3.12`  |  Amazon Linux 2023  |   2028년 10월 31일   |   2028년 11월 30일   |   2029년 1월 10일   | 
|  Python 3.11  |  `python3.11`  |  Amazon Linux 2  |   2027년 6월 30일   |   2027년 7월 31일   |   2027년 8월 31일   | 
|  Python 3.10  |  `python3.10`  |  Amazon Linux 2  |   2026년 10월 31일   |   2026년 11월 30일   |   2027년 1월 15일   | 

**Python 함수를 만들려면**

1. [Lambda 콘솔](https://console.aws.amazon.com/lambda)을 엽니다.

1. **함수 생성**을 선택합니다.

1. 다음 설정을 구성합니다:
   + **함수 이름**: 함수의 이름을 입력합니다.
   + **런타임**: **Python 3.14**를 선택합니다.

1. **함수 생성**을 선택합니다.

콘솔은 `lambda_function`(이)라는 단일 소스 파일로 Lambda 함수를 생성합니다. 이 파일을 편집하고 기본 제공 코드 편집기에서 더 많은 파일을 추가할 수 있습니다. **배포** 섹션에서 **배포**를 선택하여 함수의 코드를 업데이트하세요. 그런 다음, 코드를 실행하려면 **테스트 이벤트** 섹션에서 **테스트 이벤트 생성**을 선택합니다.

Lambda 함수는 CloudWatch Logs 로그 그룹을 함께 제공됩니다. 함수 런타임은 각 호출에 대한 세부 정보를 CloudWatch Logs에 보냅니다. 호출 중 [함수가 출력하는 로그](python-logging.md)를 전달합니다. 함수가 오류를 반환하면 Lambda은 오류에 서식을 지정한 후 이를 간접 호출자에게 반환합니다.

**Topics**
+ [런타임에 포함된 SDK 버전](#python-sdk-included)
+ [비활성화된 Python 기능](#python-disabled-features)
+ [응답 형식](#python-response-format)
+ [확장의 정상 종료](#python-graceful-shutdown)
+ [Python에서 Lambda 함수 핸들러 정의](python-handler.md)
+ [Python Lambda 함수에 대한 .zip 파일 아카이브 작업](python-package.md)
+ [컨테이너 이미지로 Python Lambda 함수 배포](python-image.md)
+ [Python Lambda 함수를 위한 계층 작업](python-layers.md)
+ [Lambda 컨텍스트 객체를 사용하여 Python 함수 정보 검색](python-context.md)
+ [Python Lambda 함수 로깅 및 모니터링](python-logging.md)
+ [Python에서 AWS Lambda 함수 테스트](python-testing.md)
+ [AWS Lambda에서 Python 코드 계측](python-tracing.md)

## 런타임에 포함된 SDK 버전
<a name="python-sdk-included"></a>

Python 런타임에 포함된 AWS SDK 버전은 런타임 버전 및 사용자의 AWS 리전에 따라 달라집니다. 사용 중인 런타임에 포함된 SDK 버전을 찾으려면 다음 코드를 사용하여 Lambda 함수를 생성합니다.

```
import boto3
import botocore

def lambda_handler(event, context):
   print(f'boto3 version: {boto3.__version__}')
   print(f'botocore version: {botocore.__version__}')
```

## 비활성화된 Python 기능
<a name="python-disabled-features"></a>

다음 표에는 Python용 Lambda 관리형 런타임 및 컨테이너 기본 이미지에서 비활성화된 Python 기능이 나열되어 있습니다. Python 런타임 실행 파일이 컴파일되고 execution-time 플래그를 사용하여 활성화될 수 없는 경우 이러한 기능이 활성화되어야 합니다. Lambda에서 이러한 기능을 사용하려면 [컨테이너 이미지](python-image.md#python-image-clients) 또는 [사용자 지정 런타임](runtimes-custom.md)을 사용하여 이러한 기능이 활성화된 자체 Python 런타임 빌드를 배포할 수 있습니다.


| Python 기능 | 영향을 받는 Python 버전 | Status | 
| --- | --- | --- | 
| Just-in-Time(JIT) 컴파일러 | Python 3.13 이상 | JIT 컴파일러는 실험 단계이며 프로덕션 워크로드에는 권장되지 않습니다. 따라서 Lambda Python 런타임에서 비활성화됩니다. | 
| 프리 스레딩 | Python 3.13 이상 | 단일 스레드 코드에 대한 성능 영향으로 인해 Lambda Python 빌드에서 프리 스레딩(전역 인터프리터 잠금을 비활성화하는 옵션)가 비활성화됩니다. | 

## 응답 형식
<a name="python-response-format"></a>

Python 3.12 이상 버전의 Python 런타임에서 함수는 JSON 응답의 일부로 유니코드 문자를 반환합니다. 이전 Python 런타임에서는 응답에 유니코드 문자의 이스케이프된 시퀀스를 반환했습니다. 예를 들어, Python 3.11에서 'こんにちは'와 같은 유니코드 문자열을 반환하는 경우 유니코드 문자를 이스케이프하고 '\$1u3053\$1u3093\$1u306b\$1u3061\$1u306f'를 반환합니다. Python 3.12 런타임은 원래 'こんにちは'를 반환합니다.

유니코드 응답을 사용하면 Lambda 응답 크기가 줄어들어 동기 함수에서 더 큰 응답을 최대 6MB의 페이로드 크기에 더 쉽게 맞출 수 있습니다. 이전 예제에서 이스케이프된 버전은 32바이트이며, 유니코드 문자열의 경우 17바이트입니다.

Python 3.12 이상 Python 런타임으로 업그레이드할 때 새 응답 형식을 고려하여 코드를 조정해야 할 수 있습니다. 직접 호출자에서 이스케이프된 유니코드를 예상하는 경우 반환 함수에 코드를 추가하여 유니코드를 수동으로 이스케이프하거나 직접 호출자가 유니코드 반환을 처리하도록 조정해야 합니다.

## 확장의 정상 종료
<a name="python-graceful-shutdown"></a>

Python 3.12 이상 버전의 Python 런타임에서는 [외부 확장](lambda-extensions.md)을 포함하는 함수에 대해 향상된 정상 종료 기능을 제공합니다. Lambda는 실행 환경을 종료할 때 `SIGTERM` 신호를 런타임에 전송한 다음, `SHUTDOWN` 이벤트를 등록된 각 외부 확장에 전송합니다. Lambda 함수에서 `SIGTERM` 신호를 포착하여 함수에서 생성된 데이터베이스 연결과 같은 리소스를 정리할 수 있습니다.

실행 환경 수명 주기에 대한 자세한 내용은 [Lambda 실행 환경 수명 주기 이해](lambda-runtime-environment.md) 섹션을 참조하세요. 확장과 함께 정상 종료를 사용하는 방법의 예제는 [AWS Samples GitHub repository](https://github.com/aws-samples/graceful-shutdown-with-aws-lambda)를 참조하세요.

# Python에서 Lambda 함수 핸들러 정의
<a name="python-handler"></a>

Lambda 함수의 *핸들러*는 이벤트를 처리하는 함수 코드의 메서드입니다. 함수가 간접 호출되면 Lambda는 핸들러 메서드를 실행합니다. 함수는 핸들러가 응답을 반환하거나 종료하거나 제한 시간이 초과될 때까지 실행됩니다.

이 페이지에서는 이름 지정 규칙, 유효한 핸들러 서명 및 코드 모범 사례를 포함하여 Python에서 Lambda 함수 핸들러를 사용하는 방법을 설명합니다. 이 페이지에는 주문에 대한 정보를 가져와서 텍스트 파일 영수증을 생성하고 해당 파일을 Amazon Simple Storage Service(Amazon S3) 버킷에 넣는 Python Lambda 함수의 예제도 포함되어 있습니다.

**Topics**
+ [Python Lambda 함수 코드 예제](#python-handler-example)
+ [핸들러 이름 지정 규칙](#python-handler-naming)
+ [Lambda 이벤트 객체 사용](#python-handler-event)
+ [Lambda 컨텍스트 객체 액세스 및 사용](#python-handler-context)
+ [Python 핸들러에 대해 유효한 핸들러 서명](#python-handler-signature)
+ [값 반환](#python-handler-return)
+ [핸들러에서 AWS SDK for Python (Boto3) 사용](#python-handler-sdk)
+ [환경 변수에 액세스](#python-handler-env-vars)
+ [Python Lambda 함수의 코드 모범 사례](#python-handler-best-practices)

## Python Lambda 함수 코드 예제
<a name="python-handler-example"></a>

다음 예제 Python Lambda 함수 코드는 주문에 대한 정보를 입력으로 가져와서 텍스트 파일 영수증을 생성하고 해당 파일을 Amazon S3 버킷에 넣습니다.

**Example Python Lambda 함수**  

```
import json
import os
import logging
import boto3

# Initialize the S3 client outside of the handler
s3_client = boto3.client('s3')

# Initialize the logger
logger = logging.getLogger()
logger.setLevel("INFO")

def upload_receipt_to_s3(bucket_name, key, receipt_content):
    """Helper function to upload receipt to S3"""
    
    try:
        s3_client.put_object(
            Bucket=bucket_name,
            Key=key,
            Body=receipt_content
        )
    except Exception as e:
        logger.error(f"Failed to upload receipt to S3: {str(e)}")
        raise

def lambda_handler(event, context):
    """
    Main Lambda handler function
    Parameters:
        event: Dict containing the Lambda function event data
        context: Lambda runtime context
    Returns:
        Dict containing status message
    """
    try:
        # Parse the input event
        order_id = event['Order_id']
        amount = event['Amount']
        item = event['Item']
        
        # Access environment variables
        bucket_name = os.environ.get('RECEIPT_BUCKET')
        if not bucket_name:
            raise ValueError("Missing required environment variable RECEIPT_BUCKET")

        # Create the receipt content and key destination
        receipt_content = (
            f"OrderID: {order_id}\n"
            f"Amount: ${amount}\n"
            f"Item: {item}"
        )
        key = f"receipts/{order_id}.txt"

        # Upload the receipt to S3
        upload_receipt_to_s3(bucket_name, key, receipt_content)

        logger.info(f"Successfully processed order {order_id} and stored receipt in S3 bucket {bucket_name}")
        
        return {
            "statusCode": 200,
            "message": "Receipt processed successfully"
        }

    except Exception as e:
        logger.error(f"Error processing order: {str(e)}")
        raise
```

 파일은 다음 코드 섹션을 포함하고 있습니다.
+ `import` 블록: 이 블록을 사용하여 Lambda 함수에 필요한 라이브러리를 포함합니다.
+ SDK 클라이언트 및 로거의 전역 초기화: 핸들러 외부에 초기화 코드를 포함하면 [실행 환경](lambda-runtime-environment.md) 재사용을 활용하여 함수 성능을 개선할 수 있습니다. 자세한 내용은 [Python Lambda 함수의 코드 모범 사례](#python-handler-best-practices) 섹션을 참조하세요.
+ `def upload_receipt_to_s3(bucket_name, key, receipt_content):` 이 함수는 기본 `lambda_handler` 함수에서 직접적으로 호출하는 도우미 함수입니다.
+ `def lambda_handler(event, context):` 기본 애플리케이션 논리를 포함한 코드의 **기본 핸들러 함수**입니다. Lambda가 함수 핸들러를 간접적으로 호출하면 [Lambda 런타임](concepts-basics.md#gettingstarted-concepts-runtime)은 함수에 두 개의 인수, 즉 함수가 처리할 데이터가 포함된 [이벤트 객체](#python-handler-event)와 함수 간접 호출에 대한 정보가 포함된 [컨텍스트 객체](#python-handler-context)를 전달합니다.

## 핸들러 이름 지정 규칙
<a name="python-handler-naming"></a>

Lambda 함수를 생성할 때 정의된 함수 핸들러 이름은 다음에서 파생됩니다.
+ Lambda 핸들러 함수가 있는 파일의 이름.
+ Python 핸들러 함수의 이름.

위 예제에서 파일의 이름이 `lambda_function.py`인 경우 핸들러는 `lambda_function.lambda_handler`로 지정됩니다. 이는 Lambda 콘솔을 사용하여 생성한 함수에 지정되는 기본 핸들러 이름입니다.

콘솔에서 다른 파일 이름 또는 함수 핸들러 이름을 사용하여 함수를 생성하는 경우 기본 핸들러 이름을 편집해야 합니다.

**함수 핸들러 이름 변경(콘솔)**

1. Lambda 콘솔의 [함수](https://console.aws.amazon.com/lambda/home#/functions) 페이지를 열고 함수를 선택합니다.

1. **Code**(코드) 탭을 선택합니다.

1. 아래로 스크롤하여 **런타임 설정** 창으로 이동한 다음 **편집**을 선택합니다.

1. **핸들러**에서 함수 핸들러의 새 이름을 입력합니다.

1. **저장**을 선택합니다.

## Lambda 이벤트 객체 사용
<a name="python-handler-event"></a>

Lambda는 함수를 간접적으로 호출할 때 [이벤트 객체](concepts-basics.md#gettingstarted-concepts-event) 인수를 함수 핸들러에 전달합니다. JSON 객체는 Lambda 함수의 가장 일반적인 이벤트 형식입니다. 이전 섹션의 코드 예제에서 함수는 다음 형식의 입력을 예상합니다.

```
{
    "Order_id": "12345",
    "Amount": 199.99,
    "Item": "Wireless Headphones"
}
```

함수가 다른 AWS 서비스에 의해 간접적으로 호출되는 경우 입력 이벤트도 JSON 객체입니다. 이벤트 객체의 정확한 형식은 함수를 간접적으로 호출하는 서비스에 따라 달라집니다. 특정 서비스의 이벤트 형식을 확인하려면 [다른 AWS 서비스의 이벤트로 Lambda 간접 호출](lambda-services.md) 장의 해당 페이지를 참조하세요.

입력 이벤트가 JSON 객체의 형태인 경우 Lambda 런타임은 객체를 Python 딕셔너리로 변환합니다. 코드의 변수에 입력 JSON의 값을 할당하려면 예제 코드에 나와 있는 것처럼 표준 Python 딕셔너리 메서드를 사용합니다.

데이터를 함수에 JSON 배열 또는 다른 유효한 JSON 데이터 유형으로 전달할 수도 있습니다. 다음 표에는 Python 런타임이 이러한 JSON 유형을 변환하는 방법이 정의되어 있습니다.


| JSON 데이터 유형 | Python 데이터 형식 | 
| --- | --- | 
| 객체 | 딕셔너리(dict) | 
| array | 리스트(list) | 
| 숫자 | 정수(int) 또는 부동 소수점 숫자(float) | 
| 문자열 | 문자열(str) | 
| 불 | 불(bool) | 
| null | NoneType(NoneType) | 

## Lambda 컨텍스트 객체 액세스 및 사용
<a name="python-handler-context"></a>

Lambda 컨텍스트 객체에는 함수 간접 호출 및 실행 환경에 관한 정보가 포함되어 있습니다. Lambda는 간접적으로 호출될 때 컨텍스트 객체를 함수에 자동으로 전달합니다. 컨텍스트 객체를 사용하여 모니터링 목적으로 함수의 간접 호출에 대한 정보를 출력할 수 있습니다.

컨텍스트 객체는 [Lambda 런타임 인터페이스 클라이언트](https://github.com/aws/aws-lambda-python-runtime-interface-client/blob/main/awslambdaric/lambda_context.py)에 정의된 Python 클래스입니다. 컨텍스트 객체 속성의 값을 반환하려면 컨텍스트 객체에서 해당 메서드를 사용합니다. 예를 들어, 다음 코드 조각은 `aws_request_id` 속성 값(간접 호출 요청의 식별자)을 `request`라는 변수에 할당합니다.

```
request = context.aws_request_id
```

Lambda 컨텍스트 객체 사용에 대해 자세히 알아보고 사용 가능한 메서드 및 속성의 전체 목록을 보려면 [Lambda 컨텍스트 객체를 사용하여 Python 함수 정보 검색](python-context.md) 섹션을 참조하세요.

## Python 핸들러에 대해 유효한 핸들러 서명
<a name="python-handler-signature"></a>

Python에서 핸들러 함수를 정의할 때 함수에는 두 개의 인수가 필요합니다. 첫 번째 인수는 Lambda [이벤트 객체](#python-handler-event)이고 두 번째 인수는 Lambda [컨텍스트 객체](#python-handler-context)입니다. 일반적으로 이러한 입력 인수의 이름은 `event` 및 `context`이지만 원하는 이름을 지정할 수 있습니다. 단일 입력 인수로 핸들러 함수를 선언하면 Lambda가 함수 실행을 시도할 때 오류가 발생합니다. Python에서 핸들러 함수를 선언하는 가장 일반적인 방법은 다음과 같습니다.

```
def lambda_handler(event, context):
```

다음 예제와 같이 함수 선언에서 Python 유형 힌트를 사용할 수도 있습니다.

```
from typing import Dict, Any
      
def lambda_handler(event: Dict[str, Any], context: Any) -> Dict[str, Any]:
```

다른 AWS 서비스에서 생성된 이벤트 및 컨텍스트 객체에 대해 특정 AWS 유형 지정을 사용하려면 함수의 배포 패키지에 `aws-lambda-typing` 패키지를 추가합니다. 개발 환경에서 `pip install aws-lambda-typing`을 실행하여 이 라이브러리를 설치할 수 있습니다. 다음 코드 조각은 AWS 특정 유형 힌트를 사용하는 방법을 보여줍니다. 이 예제에서 예상되는 이벤트는 Amazon S3 이벤트입니다.

```
from aws_lambda_typing.events import S3Event
from aws_lambda_typing.context import Context
from typing import Dict, Any

def lambda_handler(event: S3Event, context: Context) -> Dict[str, Any]:
```

핸들러 함수에는 Python `async` 함수 유형을 사용할 수 없습니다.

## 값 반환
<a name="python-handler-return"></a>

선택적으로 핸들러는 값을 반환할 수 있지만, 이러한 값은 JSON 직렬화가 가능해야 합니다. 일반적인 반환 유형에는 `dict`, `list`, `str`, `int`, `float` 및 `bool`이 포함됩니다.

반환된 값은 함수를 간접 호출한 [간접 호출 유형](lambda-invocation.md) 및 [서비스](lambda-services.md)에 따라 달라집니다. 예:
+ `RequestResponse` 간접 호출 유형을 사용하여 [Lambda 함수를 동기적으로 간접 호출](invocation-sync.md)하는 경우에는 Lambda가 Python 함수 직접 호출의 결과를 Lambda 함수를 간접 호출하는 클라이언트에 반환합니다(간접 호출 요청에 대한 HTTP 응답에서 JSON으로 직렬화됨). 예를 들어 AWS Lambda 콘솔은 `RequestResponse` 간접 호출 유형을 사용하기 때문에 콘솔에서 함수를 간접 호출할 때 콘솔에 반환 값이 표시됩니다.
+ 핸들러가 `json.dumps`로 직렬화가 불가능한 객체를 반환하는 경우 런타임에서 오류를 반환하게 됩니다.
+ `None` 문이 포함되지 않은 Python 함수가 묵시적으로 하는 것처럼 핸들러가 `return`을 반환하는 경우, 런타임은 `null`을 반환하게 됩니다.
+ `Event` 호출 유형([비동기식 호출](invocation-async.md))을 사용하는 경우에는 해당 값이 폐기됩니다.

예제 코드에서 핸들러는 다음과 같은 Python 딕셔너리를 반환합니다.

```
{
  "statusCode": 200,
  "message": "Receipt processed successfully"
}
```

Lambda 런타임은 이 딕셔너리를 직렬화하고 함수를 간접적으로 호출한 클라이언트에 JSON 문자열로 반환합니다.

**참고**  
Python 3.9 이상 릴리스에서 Lambda는 호출의 requestId를 오류 응답에 포함합니다.

## 핸들러에서 AWS SDK for Python (Boto3) 사용
<a name="python-handler-sdk"></a>

종종 Lambda 함수를 사용하여 다른 AWS 서비스 및 리소스와 상호 작용하는 경우가 있습니다. 이러한 리소스와 상호 작용하는 가장 간단한 방법은 AWS SDK for Python (Boto3)을 사용하는 것입니다. 모든 [지원되는 Lambda Python 런타임](lambda-runtimes.md#runtimes-supported)에는 SDK for Python 버전이 포함되어 있습니다. 그러나 코드에서 SDK를 사용해야 하는 경우 함수의 배포 패키지에 SDK를 포함하는 것이 좋습니다. 배포 패키지에 SDK를 포함하면 종속성을 완벽하게 제어할 수 있으며 다른 라이브러리와 버전이 일치하지 않는 문제가 발생할 위험이 줄어듭니다. 자세한 내용은 [Python의 런타임 종속 항목](python-package.md#python-package-dependencies) 및 [이전 버전과의 호환성](runtimes-update.md#runtime-update-compatibility)를 참조하세요.

Lambda 함수에서 SDK for Python을 사용하려면 함수 코드 시작 부분에 있는 가져오기 블록에 다음 문을 추가합니다.

```
import boto3
```

`pip install` 명령을 사용하여 함수의 배포 패키지에 `boto3` 라이브러리를 추가합니다. .zip 배포 패키지에 종속성을 추가하는 방법에 대한 자세한 지침은 [종속 항목이 있는 .zip 배포 패키지 생성](python-package.md#python-package-create-dependencies) 섹션을 참조하세요. 컨테이너 이미지로 배포된 Lambda 함수에 종속성을 추가하는 것에 대해 자세히 알아보려면 [기본 이미지에서 이미지 생성](python-image.md#python-image-create) 또는 [대체 기본 이미지에서 이미지 생성](python-image.md#python-alt-create) 섹션을 참조하세요.

코드에서 `boto3`을 사용하는 경우 클라이언트를 초기화하기 위해 자격 증명을 제공할 필요가 없습니다. 예를 들어, 예제 코드에서 다음 코드 줄을 사용하여 Amazon S3 클라이언트를 초기화합니다.

```
# Initialize the S3 client outside of the handler
s3_client = boto3.client('s3')
```

Python을 사용하면 Lambda가 자격 증명을 사용하여 환경 변수를 자동으로 생성합니다. `boto3` SDK는 초기화 중에 함수의 환경 변수에서 이러한 자격 증명을 확인합니다.

## 환경 변수에 액세스
<a name="python-handler-env-vars"></a>

핸들러 코드에서 `os.environ.get` 메서드를 사용하여 [환경 변수](configuration-envvars.md)를 참조할 수 있습니다. 예제 코드에서는 다음 코드 줄을 사용하여 정의된 `RECEIPT_BUCKET` 환경 변수를 참조합니다.

```
# Access environment variables
bucket_name = os.environ.get('RECEIPT_BUCKET')
```

코드 시작 부분에 있는 가져오기 블록에 `import os` 문을 포함하는 것을 잊지 마세요.

## Python Lambda 함수의 코드 모범 사례
<a name="python-handler-best-practices"></a>

Lambda 함수를 구축할 때 코딩 모범 사례를 사용하려면 다음 목록의 지침을 준수하세요.
+ **핵심 로직에서 Lambda 핸들러를 분리합니다.** 이를 통해 단위 테스트를 수행할 수 있는 더 많은 함수를 만들 수 있습니다. 예를 들어, Python에서 이는 다음과 같이 표시될 수 있습니다.

  ```
  def lambda_handler(event, context):
      foo = event['foo']
      bar = event['bar']      
      result = my_lambda_function(foo, bar)
  
  def my_lambda_function(foo, bar):
      // MyLambdaFunction logic here
  ```
+ **함수 배포 패키지의 종속성을 제어합니다.** AWS Lambda 실행 환경에는 여러 라이브러리가 포함되어 있습니다. Node.js 및 Python 런타임의 경우, 여기에는 AWS SDK가 포함됩니다. 최신 기능 및 보안 업데이트를 활성화하려면 Lambda가 주기적으로 이러한 라이브러리를 업데이트해야 합니다. 이러한 업데이트는 Lambda 함수의 동작에 사소한 변화를 가져올 수 있습니다. 함수가 사용하는 종속성을 완전히 제어하려면 모든 종속성을 배포 패키지로 패키징하세요.
+ **종속성의 복잡성을 최소화합니다.** [실행 환경](lambda-runtime-environment.md) 시작 시 빠르게 로드되는 더 단순한 프레임워크가 권장됩니다.
+ **배포 패키지 크기를 런타임 필요에 따라 최소화합니다.** 이렇게 하면 호출 전에 배포 패키지를 다운로드하고 압축을 풀 때 걸리는 시간이 단축됩니다.

**실행 환경 재사용을 활용하여 함수 성능을 향상시킵니다.** 함수 핸들러 외부에서 SDK 클라이언트 및 데이터베이스 연결을 초기화하고 정적 자산을 `/tmp` 디렉토리에 로컬로 캐시합니다. 동일한 함수 인스턴스에서 처리하는 후속 간접 호출은 이러한 리소스를 재사용할 수 있습니다. 이를 통해 함수 실행 시간을 줄여 비용을 절감합니다.

호출에서 발생할 수 있는 데이터 유출을 방지하려면 실행 환경을 사용하여 사용자 데이터, 이벤트 또는 보안과 관련된 기타 정보를 저장하지 마세요. 함수가 핸들러 내부 메모리에 저장할 수 없는 변경 가능한 상태에 의존하는 경우 각 사용자에 대해 별도의 함수 또는 별도의 함수 버전을 생성하는 것이 좋습니다.

**연결 유지 지시문을 사용하여 지속적인 연결을 유지하세요.** Lambda는 시간이 지남에 따라 유휴 연결을 제거합니다. 함수를 호출할 때 유휴 연결을 재사용하려고 하면 연결 오류가 발생합니다. 지속적인 연결을 유지하려면 런타임과 관련된 연결 유지 지시문을 사용하세요. 예를 들어, [Node.js에서 연결 유지를 이용해 연결 재사용](https://docs.aws.amazon.com/sdk-for-javascript/v3/developer-guide/node-reusing-connections.html)을 참조하세요.

** [환경 변수](configuration-envvars.md)를 사용하여 함수에 운영 파라미터를 전달합니다.** 예를 들어, Amazon S3 버킷에 기록하는 경우 기록하고 있는 버킷 이름을 하드 코딩하는 대신 환경 변수로 구성합니다.

Lambda 함수에서 함수가 자기 자신을 간접적으로 간접 호출하거나 함수를 다시 간접적으로 간접 호출할 수 있는 프로세스를 시작하는 **재귀적 간접 호출을 사용하지 마세요**. 리커시브 코드를 사용할 경우, 의도하지 않은 함수 호출이 증가하고 비용이 상승할 수 있습니다. 의도치 않게 간접 호출이 대량으로 발생하는 경우 함수의 예약된 동시성을 즉시 `0`으로 설정하여 코드를 업데이트하는 동안 해당 함수에 대한 모든 간접 호출을 제한합니다.

Lambda 함수 코드에는 **문서화되지 않은 비공개 API를 사용하지 마세요.** AWS Lambda 관리형 런타임의 경우, Lambda는 주기적으로 보안 및 기능 업데이트를 Lambda의 내부 API에 적용합니다. 이러한 내부 API 업데이트는 이전 버전과 호환되지 않으므로 함수가 이러한 비공개 API에 종속성을 갖는 경우 호출 실패와 같은 의도하지 않은 결과를 초래할 수 있습니다. 공개적으로 사용 가능한 API의 목록은 [API 레퍼런스](https://docs.aws.amazon.com/lambda/latest/api/welcome.html)를 참조하세요.

**멱등성 코드를 작성합니다.** 함수에 멱등성 코드를 작성하면 중복 이벤트가 동일한 방식으로 처리됩니다. 코드는 이벤트를 올바르게 검증하고 중복 이벤트를 정상적으로 처리해야 합니다. 자세한 내용은 [멱등성 Lambda 함수를 만들려면 어떻게 해야 합니까?](https://aws.amazon.com/premiumsupport/knowledge-center/lambda-function-idempotent/) 단원을 참조하십시오.

# Python Lambda 함수에 대한 .zip 파일 아카이브 작업
<a name="python-package"></a>

 AWS Lambda 함수의 코드는 함수의 핸들러 코드가 포함된 .py 파일과 코드가 의존하는 추가 패키지 및 모듈로 구성됩니다. Lambda에 이 함수 코드를 배포하려면 *배포 패키지*를 사용합니다. 이 패키지는 .zip 파일 아카이브 또는 컨테이너 이미지일 수 있습니다. Python에서 컨테이너 이미지를 사용하는 방법에 대한 자세한 내용은 [컨테이너 이미지로 Python Lambda 함수 배포](https://docs.aws.amazon.com/lambda/latest/dg/python-image.html)를 참조하세요.

 배포 패키지를 .zip 파일 아카이브로 생성하려면 명령줄 도구의 기본 제공 .zip 파일 아카이브 유틸리티 또는 [7zip](https://www.7-zip.org/download.html)과 같은 기타 .zip 파일 유틸리티를 사용합니다. 다음 섹션에 표시된 예제에서는 Linux 또는 MacOS 환경에서 명령줄 `zip` 도구를 사용한다고 가정합니다. Windows에서 동일한 명령을 사용하려면 [Windows Subsystem for Linux를 설치](https://docs.microsoft.com/en-us/windows/wsl/install-win10)하여 Ubuntu 및 Bash의 Windows 통합 버전을 가져옵니다.

 Lambda는 POSIX 파일 권한을 사용하므로 .zip 파일 아카이브를 생성하기 전에 [배포 패키지 폴더에 대한 권한을 설정](https://aws.amazon.com/premiumsupport/knowledge-center/lambda-deployment-package-errors/)해야 할 수 있습니다.

**Topics**
+ [Python의 런타임 종속 항목](#python-package-dependencies)
+ [종속 항목이 없는 .zip 배포 패키지 생성](#python-package-create-no-dependencies)
+ [종속 항목이 있는 .zip 배포 패키지 생성](#python-package-create-dependencies)
+ [종속 항목 검색 경로 및 런타임 포함 라이브러리](#python-package-searchpath)
+ [\$1\$1pycache\$1\$1 폴더 사용](#python-package-pycache)
+ [네이티브 라이브러리로 .zip 배포 패키지 생성](#python-package-native-libraries)
+ [.zip 파일을 사용하여 Python Lambda 함수 생성 및 업데이트](#python-package-create-update)

## Python의 런타임 종속 항목
<a name="python-package-dependencies"></a>

Python 런타임을 사용하는 Lambda 함수의 경우 종속 항목은 모든 Python 패키지 또는 모듈일 수 있습니다. .zip 아카이브를 사용하여 함수를 배포할 때 이러한 종속 항목을 함수 코드와 함께 .zip 파일에 추가하거나 [Lambda 계층](chapter-layers.md)을 사용할 수 있습니다. 계층은 추가 코드 또는 기타 콘텐츠를 포함할 수 있는 별도의 .zip 파일입니다. Python에서의 Lambda 계층 사용에 대해 자세히 알아보려면 [Python Lambda 함수를 위한 계층 작업](python-layers.md) 섹션을 참조하세요.

Lambda Python 런타임에는 AWS SDK for Python (Boto3)과 해당 종속 항목이 포함됩니다. Lambda는 자체 종속 항목을 추가할 수 없는 배포 시나리오를 위해 런타임에 SDK를 제공합니다. 이러한 시나리오에는 기본 제공 코드 편집기를 사용하여 콘솔에서 함수를 생성하거나 AWS Serverless Application Model(AWS SAM) 또는 CloudFormation 템플릿에서 인라인 함수를 사용하는 것이 포함됩니다.

Lambda는 최신 업데이트 및 보안 패치를 포함하도록 Python 런타임의 라이브러리를 주기적으로 업데이트합니다. 함수가 런타임에 포함된 Boto3 SDK 버전을 사용하지만 배포 패키지에 SDK 종속 항목이 포함된 경우 버전 불일치 문제가 발생할 수 있습니다. 예를 들어, 배포 패키지에 SDK 종속 항목 urllib3이 포함될 수 있습니다. Lambda가 런타임에 SDK를 업데이트할 때 런타임의 새 버전과 배포 패키지의 urllib3 버전 간 호환성 문제로 인해 함수가 실패할 수 있습니다.

**중요**  
종속 항목을 완전히 제어하고 버전 불일치 문제를 방지하려면 Lambda 런타임에 종속 항목의 버전이 포함되어 있더라도 배포 패키지에 함수의 모든 종속 항목을 추가하는 것이 좋습니다. 여기에는 Boto3 SDK도 포함됩니다.

사용 중인 런타임에 포함된 SDK for Python(Boto3) 버전을 찾으려면 [런타임에 포함된 SDK 버전](lambda-python.md#python-sdk-included) 섹션을 참조하세요.

 [AWS Shared Responsibility Model](https://docs.aws.amazon.com/whitepapers/latest/aws-risk-and-compliance/shared-responsibility-model.html)에서는 사용자가 함수의 배포 패키지에 있는 모든 종속 항목을 관리해야 합니다. 여기에는 업데이트 및 보안 패치 적용이 포함됩니다. 함수의 배포 패키지에서 종속 항목을 업데이트하려면 먼저 새 .zip 파일을 생성한 다음 Lambda에 업로드합니다. 자세한 내용은 [종속 항목이 있는 .zip 배포 패키지 생성](#python-package-create-dependencies) 및 [.zip 파일을 사용하여 Python Lambda 함수 생성 및 업데이트](#python-package-create-update) 섹션을 참조하세요.

## 종속 항목이 없는 .zip 배포 패키지 생성
<a name="python-package-create-no-dependencies"></a>

 함수 코드에 종속 항목이 없는 경우 .zip 파일에는 함수의 핸들러 코드가 있는 .py 파일만 포함됩니다. 선호하는 zip 유틸리티를 사용하여 루트에 .py 파일이 있는 .zip 파일을 생성합니다. .py 파일이.zip 파일의 루트에 없는 경우 Lambda는 코드를 실행할 수 없습니다.

 .zip 파일을 배포하여 새 Lambda 함수를 생성하거나 기존 함수를 업데이트하는 방법을 알아보려면 [.zip 파일을 사용하여 Python Lambda 함수 생성 및 업데이트](#python-package-create-update) 섹션을 참조하세요.

## 종속 항목이 있는 .zip 배포 패키지 생성
<a name="python-package-create-dependencies"></a>

 함수 코드가 추가 패키지 또는 모듈에 의존하는 경우 이러한 종속 항목을 함수 코드와 함께 .zip 파일에 추가하거나 [Lambda 계층을 사용](python-layers.md)할 수 있습니다. 이 섹션의 지침에서는 .zip 배포 패키지에 종속 항목을 포함하는 방법을 보여줍니다. Lambda에서 코드를 실행하려면 핸들러 코드와 함수의 모든 종속 항목을 포함하는 .py 파일을 .zip 파일의 루트에 설치해야 합니다.

 함수 코드가 `lambda_function.py`라는 파일에 저장되어 있다고 가정해 보겠습니다. 다음 예제 CLI 명령은 함수 코드와 해당 종속 항목을 포함하는 `my_deployment_package.zip`라는 .zip 파일을 생성합니다. 프로젝트 디렉터리의 폴더에 직접 종속 항목을 설치하거나 Python 가상 환경을 사용할 수 있습니다.

**배포 패키지 생성(프로젝트 디렉터리)**

1. `lambda_function.py` 소스 코드 파일이 들어 있는 프로젝트 디렉터리로 이동합니다. 이 예에서 디렉터리 이름은 `my_function`입니다.

   ```
   cd my_function
   ```

1. 종속 항목을 설치할 package라는 새 디렉터리를 생성합니다.

   ```
   mkdir package
   ```

   .zip 배포 패키지의 경우 Lambda는 소스 코드와 해당 종속 항목이 모두 .zip 파일의 루트에 있을 것으로 예상합니다. 그러나 프로젝트 디렉터리에 종속 항목을 직접 설치하면 많은 수의 새 파일과 폴더가 생겨서 IDE 탐색이 어려워질 수 있습니다. 여기에 별도의 `package` 디렉터리를 생성하여 종속 항목을 소스 코드와 별도로 유지합니다.

1. `package` 디렉터리에 종속 항목을 설치합니다. 아래 예제에서는 pip를 사용하여 Python 패키지 인덱스에서 Boto3 SDK를 설치합니다. 함수 코드에서 사용자가 직접 생성한 Python 패키지를 사용하는 경우 `package` 디렉터리에 해당 Python 패키지를 저장합니다.

   ```
   pip install --target ./package boto3
   ```

1. 설치된 라이브러리가 포함된 .zip 파일을 루트에 생성합니다.

   ```
   cd package
   zip -r ../my_deployment_package.zip .
   ```

   그러면 프로젝트 디렉터리에 `my_deployment_package.zip` 파일이 생성됩니다.

1. .zip 파일의 루트에 lambda\$1function.py 파일을 추가합니다.

   ```
   cd ..
   zip my_deployment_package.zip lambda_function.py
   ```

   .zip 파일은 다음과 같이 함수의 핸들러 코드와 모든 종속 항목 폴더가 루트에 설치된 플랫 디렉터리 구조여야 합니다.

   ```
   my_deployment_package.zip
   |- bin
   |  |-jp.py
   |- boto3
   |  |-compat.py
   |  |-data
   |  |-docs
   ...
   |- lambda_function.py
   ```

   함수의 핸들러 코드를 포함하는 .py 파일이.zip 파일의 루트에 없는 경우 Lambda는 코드를 실행할 수 없습니다.

**배포 패키지 생성(가상 환경)**

1. 프로젝트 디렉터리에 가상 환경을 생성하고 활성화합니다. 이 예제에서 프로젝트 디렉터리 이름은 `my_function`입니다.

   ```
   ~$ cd my_function
   ~/my_function$ python3.14 -m venv my_virtual_env
   ~/my_function$ source ./my_virtual_env/bin/activate
   ```

1. pip를 사용하여 필요한 라이브러리를 설치합니다. 다음 예제에서는 Boto3 SDK를 설치합니다.

   ```
   (my_virtual_env) ~/my_function$ pip install boto3
   ```

1. `pip show`를 사용하여 가상 환경에서 pip가 종속 항목을 설치한 위치를 찾습니다.

   ```
   (my_virtual_env) ~/my_function$ pip show <package_name>
   ```

   pip가 라이브러리를 설치하는 폴더의 이름은 `site-packages` 또는 `dist-packages`일 수 있습니다. 이 폴더는 `lib/python3.x` 또는 `lib64/python3.x` 디렉터리에 있을 수 있습니다(여기서 python3.x는 사용 중인 Python 버전을 나타냄).

1. 가상 환경 비활성화

   ```
   (my_virtual_env) ~/my_function$ deactivate
   ```

1. pip를 사용하여 설치한 종속 항목이 포함된 디렉터리로 이동하고 루트에 설치된 종속 항목이 있는 프로젝트 디렉터리에 .zip 파일을 생성합니다. 이 예제에서 pip는 `my_virtual_env/lib/python3.14/site-packages` 디렉터리에 종속 항목을 설치했습니다.

   ```
   ~/my_function$ cd my_virtual_env/lib/python3.14/site-packages
   ~/my_function/my_virtual_env/lib/python3.14/site-packages$ zip -r ../../../../my_deployment_package.zip .
   ```

1. 핸들러 코드가 포함된 .py 파일이 있는 프로젝트 디렉터리의 루트로 이동하고 해당 파일을 .zip 패키지의 루트에 추가합니다. 이 예제에서 함수 코드 파일의 이름은 `lambda_function.py`입니다.

   ```
   ~/my_function/my_virtual_env/lib/python3.14/site-packages$ cd ../../../../
   ~/my_function$ zip my_deployment_package.zip lambda_function.py
   ```

## 종속 항목 검색 경로 및 런타임 포함 라이브러리
<a name="python-package-searchpath"></a>

 코드에서 `import` 문을 사용하면 Python 런타임은 모듈 또는 패키지를 찾을 때까지 검색 경로의 디렉터리를 검색합니다. 기본적으로 런타임에서 검색하는 첫 번째 위치는.zip 배포 패키지가 압축 해제되고 탑재되는 디렉터리입니다(`/var/task`). 배포 패키지에 런타임 포함 라이브러리 버전을 포함하는 경우 이 버전이 런타임에 포함된 버전보다 우선합니다. 배포 패키지의 종속 항목도 계층의 종속 항목보다 우선합니다.

 계층에 종속 항목을 추가하면 Lambda는 이 종속 항목을 `/opt/python/lib/python3.x/site-packages`로 추출합니다. 여기서 `python3.x`는 사용 중인 런타임의 버전 또는 `/opt/python`을 나타냅니다. 검색 경로에서 이러한 디렉터리는 런타임 포함 라이브러리와 pip 설치 라이브러리(`/var/runtime` 및 `/var/lang/lib/python3.x/site-packages`)가 포함된 디렉터리보다 우선합니다. 따라서 함수 계층의 라이브러리는 런타임에 포함된 버전보다 우선합니다.

**참고**  
Python 3.11 관리형 런타임 및 기본 이미지에서 AWS SDK와 해당 종속 항목은 `/var/lang/lib/python3.11/site-packages` 디렉터리에 설치됩니다.

 다음 코드 조각을 추가하여 Lambda 함수에 대한 전체 검색 경로를 볼 수 있습니다.

```
import sys
      
search_path = sys.path
print(search_path)
```

**참고**  
배포 패키지 또는 계층의 종속 항목이 런타임 포함 라이브러리보다 우선하므로 SDK도 포함하지 않고 패키지에 urllib3과 같은 SDK 종속 항목을 포함하면 버전 불일치 문제가 발생할 수 있습니다. 자체 버전의 Boto3 종속 항목을 배포하는 경우 Boto3도 배포 패키지에 종속 항목으로 배포해야 합니다. 런타임에 해당 버전이 포함되어 있더라도 함수의 모든 종속 항목을 패키징하는 것이 좋습니다.

 .zip 패키지 내의 별도 폴더에 종속 항목을 추가할 수도 있습니다. 예를 들어 `common`이라는 .zip 패키지의 폴더에 Boto3 SDK 버전을 추가할 수 있습니다. .zip 패키지를 압축 해제하고 탑재하면 `/var/task` 디렉터리 내에 이 폴더가 배치됩니다. 코드에서 .zip 배포 패키지의 폴더에 있는 종속 항목을 사용하려면 `import from` 문을 사용합니다. 예를 들어, .zip 패키지의 `common` 폴더에 있는 Boto3 버전을 사용하려면 다음 문을 사용합니다.

```
from common import boto3
```

## \$1\$1pycache\$1\$1 폴더 사용
<a name="python-package-pycache"></a>

 함수의 배포 패키지에 `__pycache__` 폴더를 포함하지 않는 것이 좋습니다. 다른 아키텍처나 운영 체제의 빌드 시스템에서 컴파일된 Python 바이트 코드는 Lambda 실행 환경과 호환되지 않을 수 있습니다.

## 네이티브 라이브러리로 .zip 배포 패키지 생성
<a name="python-package-native-libraries"></a>

 함수가 순수 Python 패키지 및 모듈만 사용하는 경우 `pip install` 명령을 사용하여 로컬 빌드 시스템에 종속 항목을 설치하고 .zip 파일을 생성할 수 있습니다. NumPy와 Pandas를 비롯한 많은 인기 Python 라이브러리는 순수 Python이 아니며 C 또는 C\$1\$1로 작성된 코드를 포함합니다. 배포 패키지에 C/C\$1\$1 코드가 포함된 라이브러리를 추가할 때 패키지가 Lambda 실행 환경과 호환되도록 패키지를 올바르게 빌드해야 합니다.

 Python 패키지 인덱스([PyPI](https://pypi.org/))에서 사용할 수 있는 대부분의 패키지는 '휠'(.whl 파일)로 사용할 수 있습니다. .whl 파일은 특정 운영 체제와 명령 세트 아키텍처용으로 미리 컴파일된 바이너리가 포함된 빌드된 배포판을 포함하는 일종의 ZIP 파일입니다. 배포 패키지가 Lambda와 호환되도록 하려면 Linux 운영 체제용 휠과 함수의 명령 세트 아키텍처를 설치합니다.

 일부 패키지는 소스 배포판으로만 사용할 수 있습니다. 이러한 패키지의 경우 C/C\$1\$1 구성 요소를 직접 컴파일하고 빌드해야 합니다.

 필요한 패키지에 사용할 수 있는 배포판을 확인하려면 다음을 수행하세요.

1. [Python Package Index 기본 페이지](https://pypi.org/)에서 패키지 이름을 검색합니다.

1. 사용할 패키지의 버전을 선택합니다.

1. **Download files**를 선택합니다.

### 빌드된 배포판 작업(휠)
<a name="python-package-wheels"></a>

 Lambda와 호환되는 휠을 다운로드하려면 pip `--platform` 옵션을 사용합니다.

 Lambda 함수가 **x86\$164** 명령 세트 아키텍처를 사용하는 경우 다음 `pip install` 명령을 실행하여 `package` 디렉터리에 호환되는 휠을 설치합니다. `--python 3.x`를 사용 중인 Python 런타임 버전으로 바꿉니다.

```
pip install \
--platform manylinux2014_x86_64 \
--target=package \
--implementation cp \
--python-version 3.x \
--only-binary=:all: --upgrade \
<package_name>
```

 함수에서 **arm64** 명령 세트 아키텍처를 사용하는 경우 다음 명령을 실행합니다. `--python 3.x`를 사용 중인 Python 런타임 버전으로 바꿉니다.

```
pip install \
--platform manylinux2014_aarch64 \
--target=package \
--implementation cp \
--python-version 3.x \
--only-binary=:all: --upgrade \
<package_name>
```

### 소스 배포판 작업
<a name="python-package-source-dist"></a>

 패키지를 소스 배포판으로만 사용할 수 있는 경우 C/C\$1\$1 라이브러리를 직접 빌드해야 합니다. 패키지가 Lambda 실행 환경과 호환되도록 하려면 동일한 Amazon Linux 운영 체제를 사용하는 환경에서 패키지를 빌드해야 합니다. Amazon Elastic Compute Cloud(Amazon EC2) Linux 인스턴스에서 패키지를 빌드하여 이 작업을 수행할 수 있습니다.

 Amazon EC2 Linux 인스턴스를 시작하고 연결하는 방법을 알아보려면 *Amazon EC2 사용 설명서*의 [Amazon EC2 시작하기](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EC2_GetStarted.html)를 참조하세요.

## .zip 파일을 사용하여 Python Lambda 함수 생성 및 업데이트
<a name="python-package-create-update"></a>

 .zip 배포 패키지를 생성한 후 이를 사용하여 새 Lambda 함수를 생성하거나 기존 함수를 업데이트할 수 있습니다. Lambda 콘솔, AWS Command Line Interface 및 Lambda API를 사용하여 .zip 패키지를 배포할 수 있습니다. AWS Serverless Application Model(AWS SAM) 및 CloudFormation을 사용하여 Lambda 함수를 생성하고 업데이트할 수도 있습니다.

Lambda용 .zip 배포 패키지의 최대 크기는 250MB(압축 해제됨)입니다. 이 제한은 Lambda 계층을 포함하여 업로드하는 모든 파일의 합산 크기에 적용됩니다.

Lambda 런타임은 배포 패키지의 파일을 읽을 수 있는 권한이 필요합니다. Linux 권한 8진수 표기법에서는 Lambda에 실행 불가능한 파일(rw-r--r--)에 대한 644개의 권한과 디렉터리 및 실행 파일에 대한 755개의 권한(rwxr-xr-x)이 필요합니다.

Linux 및 MacOS에서는 `chmod` 명령을 사용하여 배포 패키지의 파일 및 디렉터리에 대한 파일 권한을 변경합니다. 예를 들어 실행 불가능한 파일에 올바른 권한을 부여하려면 다음 명령을 실행합니다.

```
chmod 644 <filepath>
```

Windows에서 파일 권한을 변경하려면 Microsoft Windows 설명서의 [Set, View, Change, or Remove Permissions on an Object](https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2008-R2-and-2008/cc731667(v=ws.10))를 참조하세요.

**참고**  
배포 패키지의 디렉터리에 액세스하는 데 필요한 권한을 Lambda에 부여하지 않으면 Lambda는 해당 디렉터리에 대한 권한을 755(rwxr-xr-x)로 설정합니다.

### 콘솔을 사용하여.zip 파일로 함수 생성 및 업데이트
<a name="python-package-create-console"></a>

 새 함수를 생성하려면 먼저 콘솔에서 함수를 생성한 다음.zip 아카이브를 업로드해야 합니다. 기존 함수를 업데이트하려면 함수에 대한 페이지를 연 다음 동일한 절차에 따라 업데이트된 .zip 파일을 추가합니다.

 .zip 파일이 50MB 미만인 경우 로컬 컴퓨터에서 직접 파일을 업로드하여 함수를 생성하거나 업데이트할 수 있습니다. 50MB보다 큰 .zip 파일의 경우 먼저 패키지를 Amazon S3 버킷에 업로드해야 합니다. AWS Management Console을 사용하여 Amazon S3 버킷에 파일을 업로드하는 방법에 대한 지침은 [Amazon S3 시작하기](https://docs.aws.amazon.com/AmazonS3/latest/userguide/GetStartedWithS3.html)를 참조하세요. AWS CLI를 사용하여 파일을 업로드하려면 **AWS CLI 사용 설명서의 [객체 이동](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-managing-objects-move)을 참조하세요.

**참고**  
기존 함수의 [배포 패키지 유형](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html#lambda-CreateFunction-request-PackageType)(.zip 또는 컨테이너 이미지)은 변경할 수 없습니다. 예를 들어 .zip 파일 아카이브를 사용하도록 컨테이너 이미지 함수를 변환할 수는 없습니다. 새로운 함수를 생성해야 합니다.

**새 함수 생성(콘솔)**

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 열고 **함수 생성**을 선택합니다.

1. **새로 작성**을 선택합니다.

1. **기본 정보**에서 다음과 같이 합니다.

   1. **함수 이름**에 함수 이름을 입력합니다.

   1. **런타임**에서 사용할 런타임을 선택합니다.

   1. (선택 사항) **아키텍처**에서 함수에 대한 명령 세트 아키텍처를 선택합니다. 기본 아키텍처는 x86\$164입니다. 함수에 대한 .zip 배포 패키지가 선택한 명령 세트 아키텍처와 호환되는지 확인합니다.

1. (선택 사항) **권한(Permissions)**에서 **기본 실행 역할 변경(Change default execution role)**을 확장합니다. 새로운 **실행 역할**을 생성하거나 기존 실행 역할을 사용할 수 있습니다.

1. **함수 생성**을 선택합니다. Lambda에서 선택한 런타임을 사용하여 기본 'Hello World' 함수를 생성합니다.

**로컬 시스템에서 .zip 아카이브 업로드(콘솔)**

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)에서.zip 파일을 업로드할 함수를 선택합니다.

1. **코드** 탭을 선택합니다.

1. **코드 소스** 창에서 **에서 업로드**를 선택합니다.

1. **.zip 파일**을 선택합니다.

1. .zip 파일을 업로드하려면 다음을 수행합니다.

   1. **업로드**를 선택한 다음 파일 선택기에서.zip 파일을 선택합니다.

   1. **Open**을 선택합니다.

   1. **저장**을 선택합니다.

**Amazon S3 버킷에서.zip 아카이브 업로드(콘솔)**

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)에서 새 .zip 파일을 업로드할 함수를 선택합니다.

1. **코드** 탭을 선택합니다.

1. **코드 소스** 창에서 **에서 업로드**를 선택합니다.

1. **Amazon S3 위치**를 선택합니다.

1. .zip 파일의 Amazon S3 링크 URL을 붙여 넣고 **저장**을 선택합니다.

### 콘솔 코드 편집기를 사용하여.zip 파일 함수 업데이트
<a name="python-package-console-edit"></a>

 .zip 배포 패키지를 사용하는 일부 함수의 경우 Lambda 콘솔의 기본 제공 코드 편집기를 사용하여 함수 코드를 직접 업데이트할 수 있습니다. 이 기능을 사용하려면 함수가 다음 조건을 충족해야 합니다.
+ 함수에서 해석된 언어 런타임(Python, Node.js 또는 Ruby) 중 하나를 사용해야 합니다.
+ 함수의 배포 패키지가 50MB(압축 해제)보다 작아야 합니다.

컨테이너 이미지 배포 패키지가 있는 함수의 함수 코드는 콘솔에서 직접 편집할 수 없습니다.

**콘솔 코드 편집기를 사용하여 함수 코드 업데이트**

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 열고 함수를 선택합니다.

1. **코드** 탭을 선택합니다.

1. **코드 소스** 창에서 소스 코드 파일을 선택하고 통합 코드 편집기에서 편집합니다.

1. **배포** 섹션에서 **배포**를 선택하여 함수의 코드를 업데이트하세요.  
![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/getting-started-tutorial/deploy-console.png)

### AWS CLI를 사용하여.zip 파일로 함수 생성 및 업데이트
<a name="python-package-create-cli"></a>

 [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)를 사용하여 새 함수를 생성하거나.zip 파일로 기존 함수를 업데이트할 수 있습니다. [create-function](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-function.html) 및 [update-function-code](https://docs.aws.amazon.com/cli/latest/reference/lambda/create-function.html) 명령을 사용하여 .zip 패키지를 배포합니다. .zip 파일이 50MB보다 작은 경우 로컬 빌드 시스템의 파일 위치에서 .zip 패키지를 업로드할 수 있습니다. 더 큰 파일의 경우 Amazon S3 버킷에서 .zip 패키지를 업로드해야 합니다. AWS CLI를 사용하여 Amazon S3 버킷에 파일을 업로드하는 방법에 대한 지침은 **AWS CLI 사용 설명서의 [객체 이동](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-managing-objects-move)을 참조하세요.

**참고**  
AWS CLI를 사용하여 Amazon S3 버킷에서 .zip 파일을 업로드하는 경우 버킷은 함수와 동일한 AWS 리전에 있어야 합니다.

 AWS CLI에서 .zip 파일을 사용하여 새 함수를 생성하려면 다음을 지정해야 합니다.
+ 함수의 이름(`--function-name`)
+ 함수의 런타임(`--runtime`)
+ 함수의 [실행 역할](https://docs.aws.amazon.com/lambda/latest/dg/lambda-intro-execution-role.html)(`--role`)의 Amazon 리소스 이름(ARN)
+ 함수 코드에 있는 핸들러 메서드의 이름(`--handler`)

 .zip 파일의 위치도 지정해야 합니다. .zip 파일이 로컬 빌드 시스템의 폴더에 있는 경우 다음 예제 명령과 같이 `--zip-file` 옵션을 사용하여 파일 경로를 지정합니다.

```
aws lambda create-function --function-name myFunction \
--runtime python3.14 --handler lambda_function.lambda_handler \
--role arn:aws:iam::111122223333:role/service-role/my-lambda-role \
--zip-file fileb://myFunction.zip
```

 Amazon S3 버킷에서 .zip 파일의 위치를 지정하려면 다음 예제 명령과 같이 `--code` 옵션을 사용합니다. 버전이 지정된 객체에만 `S3ObjectVersion` 파라미터를 사용해야 합니다.

```
aws lambda create-function --function-name myFunction \
--runtime python3.14 --handler lambda_function.lambda_handler \
--role arn:aws:iam::111122223333:role/service-role/my-lambda-role \
--code S3Bucket=amzn-s3-demo-bucket,S3Key=myFileName.zip,S3ObjectVersion=myObjectVersion
```

 CLI를 사용하여 기존 함수를 업데이트하려면 `--function-name` 파라미터를 사용하여 함수 이름을 지정합니다. 함수 코드를 업데이트하는 데 사용할.zip 파일의 위치도 지정해야 합니다. .zip 파일이 로컬 빌드 시스템의 폴더에 있는 경우 다음 예제 명령과 같이 `--zip-file` 옵션을 사용하여 파일 경로를 지정합니다.

```
aws lambda update-function-code --function-name myFunction \
--zip-file fileb://myFunction.zip
```

 Amazon S3 버킷에서 .zip 파일의 위치를 지정하려면 다음 예제 명령과 같이 `--s3-bucket` 및 `--s3-key` 옵션을 사용합니다. 버전이 지정된 객체에만 `--s3-object-version` 파라미터를 사용해야 합니다.

```
aws lambda update-function-code --function-name myFunction \
--s3-bucket amzn-s3-demo-bucket --s3-key myFileName.zip --s3-object-version myObject Version
```

### Lambda API를 사용하여.zip 파일로 함수 생성 및 업데이트
<a name="python-package-create-api"></a>

 .zip 파일 아카이브를 사용하여 함수를 생성하고 업데이트하려면 다음 API 작업을 사용합니다.
+ [CreateFunction](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html)
+ [UpdateFunctionCode](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionCode.html)

### AWS SAM을 사용하여.zip 파일로 함수 생성 및 업데이트
<a name="python-package-create-sam"></a>

 AWS Serverless Application Model(AWS SAM)은 AWS에서 서버리스 애플리케이션을 빌드하고 실행하는 프로세스를 간소화하는 데 도움이 되는 도구 키트입니다. YAML 또는 JSON 템플릿에서 애플리케이션의 리소스를 정의하고 AWS SAM Command Line Interface(AWS SAM CLI)를 사용하여 애플리케이션을 빌드, 패키징 및 배포합니다. AWS SAM 템플릿에서 Lambda 함수를 빌드하면 AWS SAM은 함수 코드와 사용자가 지정하는 종속 항목을 사용하여 .zip 배포 패키지 또는 컨테이너 이미지를 자동으로 생성합니다. AWS SAM을 사용하여 Lambda 함수를 빌드하고 배포하는 방법에 대해 자세히 알아보려면 **AWS Serverless Application Model 개발자 안내서의 [Getting started with AWS SAM](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-getting-started.html)을 참조하세요.

AWS SAM을 사용하여 기존 .zip 파일 아카이브로 Lambda 함수를 생성할 수도 있습니다. AWS SAM을 사용하여 Lambda 함수를 생성하려면 Amazon S3 버킷 또는 빌드 시스템의 로컬 폴더에 .zip 파일을 저장할 수 있습니다. AWS CLI를 사용하여 Amazon S3 버킷에 파일을 업로드하는 방법에 대한 지침은 **AWS CLI 사용 설명서의 [객체 이동](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-managing-objects-move)을 참조하세요.

 AWS SAM 템플릿에서 `AWS::Serverless::Function` 리소스는 Lambda 함수를 지정합니다. 이 리소스에서 다음 속성을 설정하여 .zip 파일 아카이브로 함수를 생성합니다.
+ `PackageType` - `Zip`으로 설정됨
+ `CodeUri` - 함수 코드의 Amazon S3 URI, 로컬 폴더 경로 또는 [FunctionCode](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-property-function-functioncode.html) 객체로 설정됨
+ `Runtime` - 선택한 런타임으로 설정됨

 AWS SAM을 사용하면 .zip 파일이 50MB보다 큰 경우 Amazon S3 버킷에 먼저 파일을 업로드할 필요가 없습니다. AWS SAM은 로컬 빌드 시스템의 위치에서 허용되는 최대 크기 250MB(압축 해제)까지 .zip 패키지를 업로드할 수 있습니다.

 AWS SAM에서 .zip 파일을 사용하여 함수를 배포하는 방법에 대해 자세히 알아보려면 **AWS SAM 개발자 안내서의 [AWS::Serverless::Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html)을 참조하세요.

### CloudFormation을 사용하여.zip 파일로 함수 생성 및 업데이트
<a name="python-package-create-cfn"></a>

 CloudFormation을 사용하여 .zip 파일 아카이브로 Lambda 함수를 생성할 수 있습니다. .zip 파일에서 Lambda 함수를 생성하려면 먼저 Amazon S3 버킷에 파일을 업로드해야 합니다. AWS CLI를 사용하여 Amazon S3 버킷에 파일을 업로드하는 방법에 대한 지침은 **AWS CLI 사용 설명서의 [객체 이동](https://docs.aws.amazon.com/cli/latest/userguide/cli-services-s3-commands.html#using-s3-commands-managing-objects-move)을 참조하세요.

Node.js 및 Python 런타임의 경우 CloudFormation 템플릿에서 인라인 소스 코드를 제공할 수도 있습니다. 그러면 함수를 빌드할 때 CloudFormation에서 코드가 포함된 .zip 파일을 생성합니다.

**기존.zip 파일 사용**

CloudFormation 템플릿에서 `AWS::Lambda::Function` 리소스는 Lambda 함수를 지정합니다. 이 리소스에서 다음 속성을 설정하여 .zip 파일 아카이브로 함수를 생성합니다.
+ `PackageType` - `Zip`으로 설정됨
+ `Code` - `S3Bucket` 및 `S3Key` 필드에 Amazon S3 버킷 이름과 .zip 파일 이름을 입력합니다.
+ `Runtime` - 선택한 런타임으로 설정됨

**인라인 코드에서.zip 파일 생성**

CloudFormation 템플릿에서 Python 또는 Node.js 인라인으로 작성된 단순 함수를 선언할 수 있습니다. 코드가 YAML 또는 JSON에 포함되어 있으므로 배포 패키지에 외부 종속 항목을 추가할 수 없습니다. 즉, 함수는 런타임에 포함된 AWS SDK 버전을 사용해야 합니다. 또한 특정 문자를 이스케이프해야 하는 것과 같은 템플릿의 요구 사항으로 인해 IDE의 구문 검사 및 코드 완료 기능을 사용하기가 더 어려워집니다. 이는 템플릿에 추가 테스트가 필요할 수 있음을 의미합니다. 이러한 제한 때문에 자주 변경되지 않는 매우 단순한 코드에는 인라인으로 함수를 선언하는 것이 가장 적합합니다.

Node.js 및 Python 런타임에 대한 인라인 코드에서 .zip 파일을 생성하려면 템플릿의 `AWS::Lambda::Function` 리소스에 다음 속성을 설정합니다.
+ `PackageType` - `Zip`으로 설정됨
+ `Code` - `ZipFile` 필드에 함수 코드 입력
+ `Runtime` - 선택한 런타임으로 설정됨

 CloudFormation에서 생성하는 .zip 파일은 4MB를 초과할 수 없습니다. CloudFormation에서 .zip 파일을 사용하여 함수를 배포하는 방법에 대해 자세히 알아보려면 **CloudFormation 사용 설명서의 [AWS::Lambda::Function](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html)을 참조하세요.

# 컨테이너 이미지로 Python Lambda 함수 배포
<a name="python-image"></a>

Python Lambda 함수의 컨테이너 이미지를 빌드하는 세 가지 방법이 있습니다.
+ [Python용 AWS 기본 이미지 사용](#python-image-instructions)

  [AWS 기본 이미지](images-create.md#runtimes-images-lp)에는 언어 런타임, Lambda와 함수 코드 간의 상호 작용을 관리하는 런타임 인터페이스 클라이언트 및 로컬 테스트를 위한 런타임 인터페이스 에뮬레이터가 미리 로드되어 있습니다.
+ [AWS OS 전용 기본 이미지 사용](images-create.md#runtimes-images-provided)

  [AWS OS 전용 기본 이미지](https://gallery.ecr.aws/lambda/provided)는 Amazon Linux 배포판 및 [런타임 인터페이스 에뮬레이터](https://github.com/aws/aws-lambda-runtime-interface-emulator/)를 포함합니다. 이러한 이미지는 일반적으로 [Go](go-image.md#go-image-provided) 및 [Rust](lambda-rust.md)와 같은 컴파일된 언어의 컨테이너 이미지와 Lambda가 기본 이미지를 제공하지 않는 언어 또는 언어 버전(예: Node.js 19)의 컨테이너 이미지를 생성하는 데 사용됩니다. OS 전용 기본 이미지를 사용하여 [사용자 지정 런타임](runtimes-custom.md)을 구현할 수도 있습니다. 이미지가 Lambda와 호환되도록 하려면 [Python용 런타임 인터페이스 클라이언트](#python-image-clients)를 이미지에 포함해야 합니다.
+ [비AWS 기본 이미지 사용](#python-image-clients)

  Alpine Linux, Debian 등의 다른 컨테이너 레지스트리의 대체 기본 이미지를 사용할 수 있습니다. 조직에서 생성한 사용자 지정 이미지를 사용할 수도 있습니다. 이미지가 Lambda와 호환되도록 하려면 [Python용 런타임 인터페이스 클라이언트](#python-image-clients)를 이미지에 포함해야 합니다.

**작은 정보**  
Lambda 컨테이너 함수가 활성 상태가 되는 데 걸리는 시간을 줄이려면 Docker 설명서의 [다단계 빌드 사용](https://docs.docker.com/build/building/multi-stage/)을 참조하세요. 효율적인 컨테이너 이미지를 빌드하려면 [Dockerfile 작성 모범 사례](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/)를 따르세요.

이 페이지에서는 Lambda용 컨테이너 이미지를 빌드, 테스트 및 배포하는 방법을 설명합니다.

**Topics**
+ [Python용 AWS 기본 이미지](#python-image-base)
+ [Python용 AWS 기본 이미지 사용](#python-image-instructions)
+ [런타임 인터페이스 클라이언트에서 대체 기본 이미지 사용](#python-image-clients)

## Python용 AWS 기본 이미지
<a name="python-image-base"></a>

AWS는 Python에 대한 다음과 같은 기본 이미지를 제공합니다.


| 태그 | 런타임 | 운영 체제 | Dockerfile | 사용 중단 | 
| --- | --- | --- | --- | --- | 
| 3.14 | Python 3.14 | Amazon Linux 2023 | [GitHub의 Python 3.14용 Dockerfile](https://github.com/aws/aws-lambda-base-images/blob/python3.14/Dockerfile.python3.14) |   2029년 6월 30일   | 
| 3.13 | Python 3.13 | Amazon Linux 2023 | [GitHub에서 Python 3.13에 대한 Dockerfile](https://github.com/aws/aws-lambda-base-images/blob/python3.13/Dockerfile.python3.13) |   2029년 6월 30일   | 
| 3.12 | Python 3.12 | Amazon Linux 2023 | [GitHub의 Python 3.12용 Dockerfile](https://github.com/aws/aws-lambda-base-images/blob/python3.12/Dockerfile.python3.12) |   2028년 10월 31일   | 
| 3.11 | Python 3.11 | Amazon Linux 2 | [GitHub의 Python 3.11용 Dockerfile](https://github.com/aws/aws-lambda-base-images/blob/python3.11/Dockerfile.python3.11) |   2027년 6월 30일   | 
| 3.10 | Python 3.10 | Amazon Linux 2 | [GitHub의 Python 3.10용 Dockerfile](https://github.com/aws/aws-lambda-base-images/blob/python3.10/Dockerfile.python3.10) |   2026년 10월 31일   | 

Amazon ECR 리포지토리: [gallery.ecr.aws/lambda/python](https://gallery.ecr.aws/lambda/python)

Python 3.12 이상의 기본 이미지는 [Amazon Linux 2023 최소 컨테이너 이미지](https://docs.aws.amazon.com/linux/al2023/ug/minimal-container.html)를 기반으로 합니다. Python 3.8-3.11 기본 이미지는 Amazon Linux 2 이미지를 기반으로 합니다. AL2023 기반 이미지는 작은 배포 공간과 `glibc`와 같이 업데이트된 라이브러리 버전을 포함하여 Amazon Linux 2에 비해 여러 가지 이점을 제공합니다.

AL2023 기반 이미지는 `microdnf`(`dnf` 심볼릭 링크)를 Amazon Linux 2에서 기본 패키지 관리자인 `yum` 대신 패키지 관리자로 사용합니다. `microdnf`는 `dnf`의 독립 실행형 구현입니다. AL2023 기반 이미지에 포함된 패키지 목록의 경우 [Comparing packages installed on Amazon Linux 2023 Container Images](https://docs.aws.amazon.com/linux/al2023/ug/al2023-container-image-types.html)의 **Minimal Container** 열을 참조하세요. AL2023과 Amazon Linux 2의 차이점에 대한 자세한 내용은 AWS 컴퓨팅 블로그의 [Introducing the Amazon Linux 2023 runtime for AWS Lambda](https://aws.amazon.com/blogs/compute/introducing-the-amazon-linux-2023-runtime-for-aws-lambda/)를 참조하세요.

**참고**  
AWS Serverless Application Model(AWS SAM)을 포함하여 AL2023 기반 이미지를 로컬에서 실행하려면 Docker 버전 20.10.10 이상을 사용해야 합니다.

### 기본 이미지의 종속 항목 검색 경로
<a name="python-image-searchpath"></a>

코드에서 `import` 문을 사용하면 Python 런타임은 모듈 또는 패키지를 찾을 때까지 검색 경로의 디렉터리를 검색합니다. 기본적으로 런타임은 `{LAMBDA_TASK_ROOT}` 디렉터리를 먼저 검색합니다. 이미지에 런타임 포함 라이브러리의 버전을 포함하는 경우 이 버전이 런타임에 포함된 버전보다 우선합니다.

검색 경로의 다른 단계는 사용 중인 Python용 Lambda 기본 이미지의 버전에 따라 다릅니다.
+ **Python 3.11 이상**: 런타임 포함 라이브러리와 pip 설치 라이브러리는 `/var/lang/lib/python3.11/site-packages` 디렉터리에 설치됩니다. 이 디렉터리는 검색 경로에서 `/var/runtime`보다 우선합니다. pip를 사용하여 최신 버전을 설치하여 SDK를 재정의할 수 있습니다. pip를 사용하여 런타임 포함 SDK와 해당 종속 항목이 설치하는 패키지와 호환되는지 확인할 수 있습니다.
+ **Python 3.8-3.10**: 런타임 포함 라이브러리는 `/var/runtime` 디렉터리에 설치됩니다. Pip 설치 라이브러리는 `/var/lang/lib/python3.x/site-packages` 디렉터리에 설치됩니다. `/var/runtime` 디렉터리는 검색 경로에서 `/var/lang/lib/python3.x/site-packages`보다 우선합니다.

다음 코드 조각을 추가하여 Lambda 함수에 대한 전체 검색 경로를 볼 수 있습니다.

```
import sys
      
search_path = sys.path
print(search_path)
```

## Python용 AWS 기본 이미지 사용
<a name="python-image-instructions"></a>

### 사전 조건
<a name="python-image-prerequisites"></a>

이 섹션의 단계를 완료하려면 다음이 필요합니다.
+ [AWS CLI 버전 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [Docker](https://docs.docker.com/get-docker)(최소 버전 25.0.0)
+ Docker [buildx 플러그인](https://github.com/docker/buildx/blob/master/README.md)
+ Python

### 기본 이미지에서 이미지 생성
<a name="python-image-create"></a>

**Python용 AWS 기본 이미지에서 컨테이너 이미지 생성**

1. 프로젝트에 대한 디렉터리를 생성하고 해당 디렉터리로 전환합니다.

   ```
   mkdir example
   cd example
   ```

1. `lambda_function.py`라는 파일을 새로 생성합니다. 테스트를 위해 다음 샘플 함수 코드를 파일에 추가하거나 자체 샘플 함수 코드를 사용할 수 있습니다.  
**Example Python 함수**  

   ```
   import sys
   def handler(event, context):
       return 'Hello from AWS Lambda using Python' + sys.version + '!'
   ```

1. `requirements.txt`라는 파일을 새로 생성합니다. 이전 단계의 샘플 함수 코드를 사용하는 경우 종속 항목이 없으므로 파일을 비워 둘 수 있습니다. 그렇지 않으면 필요한 각 라이브러리를 나열합니다. 예를 들어, 함수가 AWS SDK for Python (Boto3)을 사용하는 경우 `requirements.txt`는 다음과 같아야 합니다.  
**Example requirements.txt**  

   ```
   boto3
   ```

1. 다음 구성으로 새 Dockerfile을 생성합니다.
   + `FROM` 속성을 [기본 이미지의 URI](https://gallery.ecr.aws/lambda/python/)로 설정합니다.
   + COPY 명령을 사용하여 함수 코드와 런타임 종속성을 [Lambda 정의 환경 변수](configuration-envvars.md#configuration-envvars-runtime)인 `{LAMBDA_TASK_ROOT}`에 복사합니다.
   + `CMD` 인수를 Lambda 함수 핸들러로 설정합니다.

   참고로 Dockerfile 예제에는 [USER 지침](https://docs.docker.com/reference/dockerfile/#user)이 포함되어 있지 않습니다. Lambda에 컨테이너 이미지를 배포할 때 Lambda는 권한이 최소 권한인 기본 Linux 사용자를 자동으로 정의합니다. 이는 `USER` 지침이 제공되지 않을 때 `root` 사용자에게 기본 설정이 적용되는 표준 Docker 동작과는 다릅니다.  
**Example Dockerfile**  

   ```
   FROM public.ecr.aws/lambda/python:3.12
   
   # Copy requirements.txt
   COPY requirements.txt ${LAMBDA_TASK_ROOT}
   
   # Install the specified packages
   RUN pip install -r requirements.txt
   
   # Copy function code
   COPY lambda_function.py ${LAMBDA_TASK_ROOT}
   
   # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
   CMD [ "lambda_function.handler" ]
   ```

1. [docker build](https://docs.docker.com/engine/reference/commandline/build/) 명령으로 도커 이미지를 빌드합니다. 다음 예제에서는 이미지 이름을 `docker-image`로 지정하고 `test` [태그](https://docs.docker.com/engine/reference/commandline/build/#tag)를 지정합니다. 이미지를 Lambda와 호환되게 만들려면 `--provenance=false` 옵션을 사용해야 합니다.

   ```
   docker buildx build --platform linux/amd64 --provenance=false -t docker-image:test .
   ```
**참고**  
이 명령은 빌드 머신의 아키텍처에 관계없이 컨테이너가 Lambda 실행 환경과 호환되는지 확인하기 위해 `--platform linux/amd64` 옵션을 지정합니다. ARM64 명령 세트 아키텍처를 사용하여 Lambda 함수를 생성하려는 경우 `--platform linux/arm64` 옵션을 대신 사용하도록 명령을 변경해야 합니다.

### (선택 사항) 로컬에서 이미지 테스트
<a name="python-image-test"></a>

1. **docker run** 명령을 사용하여 Docker 이미지를 시작합니다. 이 예제에서 `docker-image`는 이미지 이름이고 `test`는 태그입니다.

   ```
   docker run --platform linux/amd64 -p 9000:8080 docker-image:test
   ```

   이 명령은 이미지를 컨테이너로 실행하고 `localhost:9000/2015-03-31/functions/function/invocations`에 로컬 엔드포인트를 생성합니다.
**참고**  
ARM64 명령 세트 아키텍처를 위한 도커 이미지를 빌드한 경우 `--platform linux/arm64` 옵션을 `--platform linux/amd64` 대신 사용해야 합니다.

1. 새 터미널 창에서 로컬 엔드포인트에 이벤트를 게시합니다.

------
#### [ Linux/macOS ]

   Linux 및 macOS에서 다음 `curl` 명령을 실행합니다.

   ```
   curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
   ```

   이 명령은 빈 이벤트와 함께 함수를 간접 호출하고 응답을 반환합니다. 샘플 함수 코드가 아닌 자체 함수 코드를 사용하는 경우 JSON 페이로드로 함수를 간접 호출할 수 있습니다. 예제:

   ```
   curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
   ```

------
#### [ PowerShell ]

   PowerShell에서 다음 `Invoke-WebRequest` 명령을 실행합니다.

   ```
   Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{}' -ContentType "application/json"
   ```

   이 명령은 빈 이벤트와 함께 함수를 간접 호출하고 응답을 반환합니다. 샘플 함수 코드가 아닌 자체 함수 코드를 사용하는 경우 JSON 페이로드로 함수를 간접 호출할 수 있습니다. 예제:

   ```
   Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{"payload":"hello world!"}' -ContentType "application/json"
   ```

------

1. 컨테이너 ID를 가져옵니다.

   ```
   docker ps
   ```

1. [docker kill](https://docs.docker.com/engine/reference/commandline/kill/) 명령을 사용하여 컨테이너를 중지합니다. 이 명령에서 `3766c4ab331c`를 이전 단계의 컨테이너 ID로 바꿉니다.

   ```
   docker kill 3766c4ab331c
   ```

### 이미지 배포
<a name="python-image-deploy"></a>

**Amazon ECR에 이미지 배포 및 Lambda 함수 생성**

1. [get-login-password](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecr/get-login-password.html) 명령을 실행하여 Amazon ECR 레지스트리에 대해 Docker CLI를 인증합니다.
   + `--region` 값을 Amazon ECR 리포지토리를 생성하려는 AWS 리전으로 설정합니다.
   + `111122223333`를 사용자의 AWS 계정 ID로 바꿉니다.

   ```
   aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-east-1.amazonaws.com
   ```

1. [create-repository](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecr/create-repository.html) 명령을 사용하여 Amazon ECR에 리포지토리를 생성합니다.

   ```
   aws ecr create-repository --repository-name hello-world --region us-east-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
   ```
**참고**  
Amazon ECR 리포지토리는 Lambda 함수와 동일한 AWS 리전 내에 있어야 합니다.

   성공하면 다음과 같은 응답이 표시됩니다.

   ```
   {
       "repository": {
           "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world",
           "registryId": "111122223333",
           "repositoryName": "hello-world",
           "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world",
           "createdAt": "2023-03-09T10:39:01+00:00",
           "imageTagMutability": "MUTABLE",
           "imageScanningConfiguration": {
               "scanOnPush": true
           },
           "encryptionConfiguration": {
               "encryptionType": "AES256"
           }
       }
   }
   ```

1. 이전 단계의 출력에서 `repositoryUri`를 복사합니다.

1. [docker tag](https://docs.docker.com/engine/reference/commandline/tag/) 명령을 실행하여 로컬 이미지를 Amazon ECR 리포지토리에 최신 버전으로 태깅합니다. 이 명령에서:
   + `docker-image:test`는 Docker 이미지의 이름과 [태그](https://docs.docker.com/engine/reference/commandline/build/#tag)입니다. `docker build` 명령에서 지정한 이미지 이름 및 태그입니다.
   + `<ECRrepositoryUri>`를 복사한 `repositoryUri`로 바꿉니다. URI 끝에 `:latest`를 포함해야 합니다.

   ```
   docker tag docker-image:test <ECRrepositoryUri>:latest
   ```

   예제:

   ```
   docker tag docker-image:test 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
   ```

1. [docker push](https://docs.docker.com/engine/reference/commandline/push/) 명령을 실행하여 Amazon ECR 리포지토리에 로컬 이미지를 배포합니다. 리포지토리 URI 끝에 `:latest`를 포함해야 합니다.

   ```
   docker push 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
   ```

1. 함수에 대한 실행 역할이 아직 없는 경우 하나 [생성](lambda-intro-execution-role.md#permissions-executionrole-api)합니다. 다음 단계에서는 역할의 Amazon 리소스 이름(ARN)이 필요합니다.

1. Lambda 함수를 생성합니다. `ImageUri`의 경우 이전의 리포지토리 URI를 지정합니다. URI 끝에 `:latest`를 포함해야 합니다.

   ```
   aws lambda create-function \
     --function-name hello-world \
     --package-type Image \
     --code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \
     --role arn:aws:iam::111122223333:role/lambda-ex
   ```
**참고**  
이미지가 Lambda 함수와 동일한 리전에 있는 한 다른 AWS 계정의 이미지를 사용하여 함수를 생성할 수 있습니다. 자세한 내용은 [Amazon ECR 교차 계정 권한](images-create.md#configuration-images-xaccount-permissions) 섹션을 참조하세요.

1. 함수를 간접 호출합니다.

   ```
   aws lambda invoke --function-name hello-world response.json
   ```

   다음과 같은 응답이 표시되어야 합니다.

   ```
   {
     "ExecutedVersion": "$LATEST", 
     "StatusCode": 200
   }
   ```

1. 함수의 출력을 보려면 `response.json` 파일을 확인합니다.

함수 코드를 업데이트하려면 이미지를 다시 빌드하고 Amazon ECR 리포지토리에 새 이미지를 업로드한 다음 [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html) 명령을 사용하여 이미지를 Lambda 함수에 배포해야 합니다.

Lambda는 이미지 태그를 특정 이미지 다이제스트로 확인합니다. 즉, 함수를 배포하는 데 사용된 이미지 태그가 Amazon ECR의 새 이미지로 가리키는 경우 Lambda는 새 이미지를 사용하도록 함수를 자동으로 업데이트하지 않습니다.

새 이미지를 동일한 Lambda 함수에 배포하려면 Amazon ECR의 이미지 태그가 동일하게 유지되더라도 [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html) 명령을 사용해야 합니다. 다음 예제에서 `--publish` 옵션은 업데이트된 컨테이너 이미지를 사용하여 새 버전의 함수를 생성합니다.

```
aws lambda update-function-code \
  --function-name hello-world \
  --image-uri 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \
  --publish
```

## 런타임 인터페이스 클라이언트에서 대체 기본 이미지 사용
<a name="python-image-clients"></a>

[OS 전용 기본 이미지](images-create.md#runtimes-images-provided)나 대체 기본 이미지를 사용하는 경우 이미지에 런타임 인터페이스 클라이언트를 포함해야 합니다. 런타임 인터페이스 클라이언트는 Lambda와 함수 코드 간의 상호 작용을 관리하는 [런타임 API](runtimes-api.md)을 확장합니다.

pip 패키지 관리자를 사용하여 [Python용 런타임 인터페이스 클라이언트](https://pypi.org/project/awslambdaric)를 설치합니다.

```
pip install awslambdaric
```

GitHub에서 [Python 런타임 인터페이스 클라이언트](https://github.com/aws/aws-lambda-python-runtime-interface-client/)를 다운로드할 수도 있습니다.

다음 예제에서는 비 AWS 기본 이미지를 사용하여 Python용 컨테이너 이미지를 빌드하는 방법을 보여줍니다. 예제 Dockerfile에서는 공식 Python 기본 이미지를 사용합니다. Dockerfile에는 Python용 런타임 인터페이스 클라이언트가 포함되어 있습니다.

### 사전 조건
<a name="python-alt-prerequisites"></a>

이 섹션의 단계를 완료하려면 다음이 필요합니다.
+ [AWS CLI 버전 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [Docker](https://docs.docker.com/get-docker)(최소 버전 25.0.0)
+ Docker [buildx 플러그인](https://github.com/docker/buildx/blob/master/README.md)
+ Python

### 대체 기본 이미지에서 이미지 생성
<a name="python-alt-create"></a>

**비 AWS 기본 이미지에서 컨테이너 이미지 생성**

1. 프로젝트에 대한 디렉터리를 생성하고 해당 디렉터리로 전환합니다.

   ```
   mkdir example
   cd example
   ```

1. `lambda_function.py`라는 파일을 새로 생성합니다. 테스트를 위해 다음 샘플 함수 코드를 파일에 추가하거나 자체 샘플 함수 코드를 사용할 수 있습니다.  
**Example Python 함수**  

   ```
   import sys
   def handler(event, context):
       return 'Hello from AWS Lambda using Python' + sys.version + '!'
   ```

1. `requirements.txt`라는 파일을 새로 생성합니다. 이전 단계의 샘플 함수 코드를 사용하는 경우 종속 항목이 없으므로 파일을 비워 둘 수 있습니다. 그렇지 않으면 필요한 각 라이브러리를 나열합니다. 예를 들어, 함수가 AWS SDK for Python (Boto3)을 사용하는 경우 `requirements.txt`는 다음과 같아야 합니다.  
**Example requirements.txt**  

   ```
   boto3
   ```

1. 새 Dockerfile을 생성합니다. 다음 Dockerfile은 [AWS 기본 이미지](images-create.md#runtimes-images-lp) 대신 공식 Python 기본 이미지를 사용합니다. Dockerfile에는 이미지가 Lambda와 호환되도록 하는 [런타임 인터페이스 클라이언트](https://pypi.org/project/awslambdaric)가 포함되어 있습니다. 다음 예제 Dockerfile은 [다단계 빌드](https://docs.docker.com/develop/develop-images/dockerfile_best-practices/#use-multi-stage-builds)를 사용합니다.
   + `FROM` 속성을 기본 이미지로 설정합니다.
   + Docker 컨테이너가 시작될 때 실행할 모듈로 `ENTRYPOINT`를 설정합니다. 이 경우 모듈은 런타임 인터페이스 클라이언트입니다.
   + `CMD`를 Lambda 함수 핸들러로 설정합니다.

   참고로 Dockerfile 예제에는 [USER 지침](https://docs.docker.com/reference/dockerfile/#user)이 포함되어 있지 않습니다. Lambda에 컨테이너 이미지를 배포할 때 Lambda는 권한이 최소 권한인 기본 Linux 사용자를 자동으로 정의합니다. 이는 `USER` 지침이 제공되지 않을 때 `root` 사용자에게 기본 설정이 적용되는 표준 Docker 동작과는 다릅니다.  
**Example Dockerfile**  

   ```
   # Define custom function directory
   ARG FUNCTION_DIR="/function"
   
   FROM python:3.12 AS build-image
   
   # Include global arg in this stage of the build
   ARG FUNCTION_DIR
   
   # Copy function code
   RUN mkdir -p ${FUNCTION_DIR}
   COPY . ${FUNCTION_DIR}
   
   # Install the function's dependencies
   RUN pip install \
       --target ${FUNCTION_DIR} \
           awslambdaric
   
   # Use a slim version of the base Python image to reduce the final image size
   FROM python:3.12-slim
   
   # Include global arg in this stage of the build
   ARG FUNCTION_DIR
   # Set working directory to function root directory
   WORKDIR ${FUNCTION_DIR}
   
   # Copy in the built dependencies
   COPY --from=build-image ${FUNCTION_DIR} ${FUNCTION_DIR}
   
   # Set runtime interface client as default command for the container runtime
   ENTRYPOINT [ "/usr/local/bin/python", "-m", "awslambdaric" ]
   # Pass the name of the function handler as an argument to the runtime
   CMD [ "lambda_function.handler" ]
   ```

1. [docker build](https://docs.docker.com/engine/reference/commandline/build/) 명령으로 도커 이미지를 빌드합니다. 다음 예제에서는 이미지 이름을 `docker-image`로 지정하고 `test` [태그](https://docs.docker.com/engine/reference/commandline/build/#tag)를 지정합니다. 이미지를 Lambda와 호환되게 만들려면 `--provenance=false` 옵션을 사용해야 합니다.

   ```
   docker buildx build --platform linux/amd64 --provenance=false -t docker-image:test .
   ```
**참고**  
이 명령은 빌드 머신의 아키텍처에 관계없이 컨테이너가 Lambda 실행 환경과 호환되는지 확인하기 위해 `--platform linux/amd64` 옵션을 지정합니다. ARM64 명령 세트 아키텍처를 사용하여 Lambda 함수를 생성하려는 경우 `--platform linux/arm64` 옵션을 대신 사용하도록 명령을 변경해야 합니다.

### (선택 사항) 로컬에서 이미지 테스트
<a name="python-alt-test"></a>

[런타임 인터페이스 에뮬레이터](https://github.com/aws/aws-lambda-runtime-interface-emulator/)를 사용하여 이미지를 로컬로 테스트합니다. [에뮬레이터를 이미지에 빌드](https://github.com/aws/aws-lambda-runtime-interface-emulator/?tab=readme-ov-file#build-rie-into-your-base-image)하거나 다음 절차를 사용하여 로컬 시스템에 설치할 수 있습니다.

**로컬 시스템에 런타임 인터페이스 에뮬레이터 설치 및 실행**

1. 프로젝트 디렉터리에서 다음 명령을 실행하여 GitHub에서 런타임 인터페이스 에뮬레이터(x86-64 아키텍처)를 다운로드하고 로컬 시스템에 설치합니다.

------
#### [ Linux/macOS ]

   ```
   mkdir -p ~/.aws-lambda-rie && \
       curl -Lo ~/.aws-lambda-rie/aws-lambda-rie https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie && \
       chmod +x ~/.aws-lambda-rie/aws-lambda-rie
   ```

   arm64 에뮬레이터를 설치하려면 이전 명령의 GitHub 리포지토리 URL을 다음과 같이 바꿉니다.

   ```
   https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
   ```

------
#### [ PowerShell ]

   ```
   $dirPath = "$HOME\.aws-lambda-rie"
   if (-not (Test-Path $dirPath)) {
       New-Item -Path $dirPath -ItemType Directory
   }
         
   $downloadLink = "https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie"
   $destinationPath = "$HOME\.aws-lambda-rie\aws-lambda-rie"
   Invoke-WebRequest -Uri $downloadLink -OutFile $destinationPath
   ```

   arm64 에뮬레이터를 설치하려면 `$downloadLink`을(를) 다음과 같이 바꿉니다.

   ```
   https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
   ```

------

1. **docker run** 명령을 사용하여 Docker 이미지를 시작합니다. 다음 사항에 유의하세요.
   + `docker-image`는 이미지 이름이고 `test`는 태그입니다.
   + `/usr/local/bin/python -m awslambdaric lambda_function.handler`는 Docker 파일의 `CMD` 다음에 오는 `ENTRYPOINT`입니다.

------
#### [ Linux/macOS ]

   ```
   docker run --platform linux/amd64 -d -v ~/.aws-lambda-rie:/aws-lambda -p 9000:8080 \
       --entrypoint /aws-lambda/aws-lambda-rie \
       docker-image:test \
           /usr/local/bin/python -m awslambdaric lambda_function.handler
   ```

------
#### [ PowerShell ]

   ```
   docker run --platform linux/amd64 -d -v "$HOME\.aws-lambda-rie:/aws-lambda" -p 9000:8080 `
   --entrypoint /aws-lambda/aws-lambda-rie `
   docker-image:test `
       /usr/local/bin/python -m awslambdaric lambda_function.handler
   ```

------

   이 명령은 이미지를 컨테이너로 실행하고 `localhost:9000/2015-03-31/functions/function/invocations`에 로컬 엔드포인트를 생성합니다.
**참고**  
ARM64 명령 세트 아키텍처를 위한 도커 이미지를 빌드한 경우 `--platform linux/arm64` 옵션을 `--platform linux/amd64` 대신 사용해야 합니다.

1. 로컬 엔드포인트에 이벤트를 게시합니다.

------
#### [ Linux/macOS ]

   Linux 및 macOS에서 다음 `curl` 명령을 실행합니다.

   ```
   curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
   ```

   이 명령은 빈 이벤트와 함께 함수를 간접 호출하고 응답을 반환합니다. 샘플 함수 코드가 아닌 자체 함수 코드를 사용하는 경우 JSON 페이로드로 함수를 간접 호출할 수 있습니다. 예제:

   ```
   curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}'
   ```

------
#### [ PowerShell ]

   PowerShell에서 다음 `Invoke-WebRequest` 명령을 실행합니다.

   ```
   Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{}' -ContentType "application/json"
   ```

   이 명령은 빈 이벤트와 함께 함수를 간접 호출하고 응답을 반환합니다. 샘플 함수 코드가 아닌 자체 함수 코드를 사용하는 경우 JSON 페이로드로 함수를 간접 호출할 수 있습니다. 예제:

   ```
   Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{"payload":"hello world!"}' -ContentType "application/json"
   ```

------

1. 컨테이너 ID를 가져옵니다.

   ```
   docker ps
   ```

1. [docker kill](https://docs.docker.com/engine/reference/commandline/kill/) 명령을 사용하여 컨테이너를 중지합니다. 이 명령에서 `3766c4ab331c`를 이전 단계의 컨테이너 ID로 바꿉니다.

   ```
   docker kill 3766c4ab331c
   ```

### 이미지 배포
<a name="python-alt-deploy"></a>

**Amazon ECR에 이미지 배포 및 Lambda 함수 생성**

1. [get-login-password](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecr/get-login-password.html) 명령을 실행하여 Amazon ECR 레지스트리에 대해 Docker CLI를 인증합니다.
   + `--region` 값을 Amazon ECR 리포지토리를 생성하려는 AWS 리전으로 설정합니다.
   + `111122223333`를 사용자의 AWS 계정 ID로 바꿉니다.

   ```
   aws ecr get-login-password --region us-east-1 | docker login --username AWS --password-stdin 111122223333.dkr.ecr.us-east-1.amazonaws.com
   ```

1. [create-repository](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/ecr/create-repository.html) 명령을 사용하여 Amazon ECR에 리포지토리를 생성합니다.

   ```
   aws ecr create-repository --repository-name hello-world --region us-east-1 --image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE
   ```
**참고**  
Amazon ECR 리포지토리는 Lambda 함수와 동일한 AWS 리전 내에 있어야 합니다.

   성공하면 다음과 같은 응답이 표시됩니다.

   ```
   {
       "repository": {
           "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world",
           "registryId": "111122223333",
           "repositoryName": "hello-world",
           "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world",
           "createdAt": "2023-03-09T10:39:01+00:00",
           "imageTagMutability": "MUTABLE",
           "imageScanningConfiguration": {
               "scanOnPush": true
           },
           "encryptionConfiguration": {
               "encryptionType": "AES256"
           }
       }
   }
   ```

1. 이전 단계의 출력에서 `repositoryUri`를 복사합니다.

1. [docker tag](https://docs.docker.com/engine/reference/commandline/tag/) 명령을 실행하여 로컬 이미지를 Amazon ECR 리포지토리에 최신 버전으로 태깅합니다. 이 명령에서:
   + `docker-image:test`는 Docker 이미지의 이름과 [태그](https://docs.docker.com/engine/reference/commandline/build/#tag)입니다. `docker build` 명령에서 지정한 이미지 이름 및 태그입니다.
   + `<ECRrepositoryUri>`를 복사한 `repositoryUri`로 바꿉니다. URI 끝에 `:latest`를 포함해야 합니다.

   ```
   docker tag docker-image:test <ECRrepositoryUri>:latest
   ```

   예제:

   ```
   docker tag docker-image:test 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
   ```

1. [docker push](https://docs.docker.com/engine/reference/commandline/push/) 명령을 실행하여 Amazon ECR 리포지토리에 로컬 이미지를 배포합니다. 리포지토리 URI 끝에 `:latest`를 포함해야 합니다.

   ```
   docker push 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
   ```

1. 함수에 대한 실행 역할이 아직 없는 경우 하나 [생성](lambda-intro-execution-role.md#permissions-executionrole-api)합니다. 다음 단계에서는 역할의 Amazon 리소스 이름(ARN)이 필요합니다.

1. Lambda 함수를 생성합니다. `ImageUri`의 경우 이전의 리포지토리 URI를 지정합니다. URI 끝에 `:latest`를 포함해야 합니다.

   ```
   aws lambda create-function \
     --function-name hello-world \
     --package-type Image \
     --code ImageUri=111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \
     --role arn:aws:iam::111122223333:role/lambda-ex
   ```
**참고**  
이미지가 Lambda 함수와 동일한 리전에 있는 한 다른 AWS 계정의 이미지를 사용하여 함수를 생성할 수 있습니다. 자세한 내용은 [Amazon ECR 교차 계정 권한](images-create.md#configuration-images-xaccount-permissions) 섹션을 참조하세요.

1. 함수를 간접 호출합니다.

   ```
   aws lambda invoke --function-name hello-world response.json
   ```

   다음과 같은 응답이 표시되어야 합니다.

   ```
   {
     "ExecutedVersion": "$LATEST", 
     "StatusCode": 200
   }
   ```

1. 함수의 출력을 보려면 `response.json` 파일을 확인합니다.

함수 코드를 업데이트하려면 이미지를 다시 빌드하고 Amazon ECR 리포지토리에 새 이미지를 업로드한 다음 [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html) 명령을 사용하여 이미지를 Lambda 함수에 배포해야 합니다.

Lambda는 이미지 태그를 특정 이미지 다이제스트로 확인합니다. 즉, 함수를 배포하는 데 사용된 이미지 태그가 Amazon ECR의 새 이미지로 가리키는 경우 Lambda는 새 이미지를 사용하도록 함수를 자동으로 업데이트하지 않습니다.

새 이미지를 동일한 Lambda 함수에 배포하려면 Amazon ECR의 이미지 태그가 동일하게 유지되더라도 [update-function-code](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-code.html) 명령을 사용해야 합니다. 다음 예제에서 `--publish` 옵션은 업데이트된 컨테이너 이미지를 사용하여 새 버전의 함수를 생성합니다.

```
aws lambda update-function-code \
  --function-name hello-world \
  --image-uri 111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest \
  --publish
```

Alpine 기본 이미지에서 Python 이미지를 생성하는 방법에 대한 예는 AWS 블로그에서 [Container image support for Lambda](https://aws.amazon.com/blogs/aws/new-for-aws-lambda-container-image-support/)를 참조하세요.

# Python Lambda 함수를 위한 계층 작업
<a name="python-layers"></a>

[Lambda 계층](chapter-layers.md)을 사용하여 여러 함수에서 재사용하려는 코드와 종속성을 패키징합니다. 계층에는 일반적으로 라이브러리 종속 항목, [사용자 지정 런타임](runtimes-custom.md) 또는 구성 파일이 포함됩니다. 계층을 생성하려면 세 가지 일반적인 단계를 거칩니다.

1. 계층 콘텐츠를 패키징합니다. 즉, 함수에 사용하려는 종속성이 포함된 .zip 파일 아카이브를 생성합니다.

1. Lambda에서 계층을 생성합니다.

1. 계층을 함수에 추가합니다.

**Topics**
+ [계층 콘텐츠 패키징](#python-layers-package)
+ [Lambda에서 계층 생성](#publishing-layer)
+ [함수에 계층 추가](#python-layer-adding)
+ [샘플 애플리케이션](#python-layer-sample-app)

## 계층 콘텐츠 패키징
<a name="python-layers-package"></a>

계층을 생성하려면 다음 요구 사항을 충족하는 .zip 파일 아카이브로 패키지를 번들링합니다.
+ Lambda 함수에 사용하려는 것과 동일한 Python 버전을 사용하여 계층을 빌드합니다. 예를 들어, Python 3.14을 사용하여 계층을 빌드하는 경우 함수에 Python 3.14 런타임을 사용합니다.
+ .zip 파일에는 루트 수준의 `python` 디렉터리가 포함되어야 합니다.
+ 계층의 패키지는 Linux와 호환되어야 합니다. Lambda 함수는 Amazon Linux에서 실행됩니다.

`pip`를 사용하여 설치한 타사 Python 라이브러리(`requests`, `pandas` 등)나 자체 Python 모듈과 패키지를 포함하는 계층을 생성할 수 있습니다.

### 타사 종속성
<a name="python-layers-third-party-dependencies"></a>

**pip 패키지를 사용하여 계층을 생성하려면 다음을 수행하세요.**

1. 다음 방법 중 하나를 선택하여 필요한 최상위 디렉터리(`python/`)에 `pip` 패키지를 설치합니다.

------
#### [ pip install ]

   순수 Python 패키지(예: 요청 또는 boto3)의 경우

   ```
   pip install requests -t python/
   ```

   NumPy, Pandas 등의 일부 Python 패키지에는 컴파일된 C 구성 요소가 포함됩니다. macOS 또는 Windows에서 이러한 패키지로 계층을 구축하는 경우 이 명령을 사용하여 Linux 호환 휠을 설치해야 할 수 있습니다.

   ```
   pip install numpy --platform manylinux2014_x86_64 --only-binary=:all: -t python/
   ```

   컴파일된 구성 요소가 포함된 Python 패키지 작업에 대한 자세한 내용은 [네이티브 라이브러리로 .zip 배포 패키지 생성](python-package.md#python-package-native-libraries) 섹션을 참조하세요.

------
#### [ requirements.txt ]

   `requirements.txt` 파일을 사용하면 패키지 버전을 관리하고 일관된 설치를 보장하는 데 도움이 됩니다.

**Example requirements.txt**  

   ```
   requests==2.31.0
   boto3==1.37.34
   numpy==1.26.4
   ```

   `requirements.txt` 파일에 순수 Python 패키지(예: 요청 또는 boto3)만 포함된 경우

   ```
   pip install -r requirements.txt -t python/
   ```

   NumPy, Pandas 등의 일부 Python 패키지에는 컴파일된 C 구성 요소가 포함됩니다. macOS 또는 Windows에서 이러한 패키지로 계층을 구축하는 경우 이 명령을 사용하여 Linux 호환 휠을 설치해야 할 수 있습니다.

   ```
   pip install -r requirements.txt --platform manylinux2014_x86_64 --only-binary=:all: -t python/
   ```

   컴파일된 구성 요소가 포함된 Python 패키지 작업에 대한 자세한 내용은 [네이티브 라이브러리로 .zip 배포 패키지 생성](python-package.md#python-package-native-libraries) 섹션을 참조하세요.

------

1. `python` 디렉터리의 내용을 압축합니다.

------
#### [ Linux/macOS ]

   ```
   zip -r layer.zip python/
   ```

------
#### [ PowerShell ]

   ```
   Compress-Archive -Path .\python -DestinationPath .\layer.zip
   ```

------

   .zip 파일의 디렉터리 구조는 다음과 같아야 합니다.

   ```
   python/              # Required top-level directory
   └── requests/
   └── boto3/
   └── numpy/
   └── (dependencies of the other packages)
   ```
**참고**  
Python 가상 환경(venv)을 사용하여 패키지를 설치하는 경우 디렉터리 구조가 달라집니다(예: `python/lib/python3.x/site-packages`). .zip 파일에 루트 수준의 `python` 디렉터리가 포함되어 있는 한 Lambda는 패키지를 찾아서 가져올 수 있습니다.

### 사용자 지정 Python 모듈
<a name="custom-python-modules"></a>

**자체 코드를 사용하여 계층을 생성하려면 다음을 수행하세요.**

1. 계층에 필요한 최상위 디렉터리를 생성합니다.

   ```
   mkdir python
   ```

1. `python` 디렉터리에서 Python 모듈을 생성합니다. 다음 예시 모듈은 주문에 필수 정보가 포함되어 있는지 확인하여 주문을 검증합니다.  
**Example 사용자 지정 모듈: validator.py**  

   ```
   import json
   
   def validate_order(order_data):
       """Validates an order and returns formatted data."""
       required_fields = ['product_id', 'quantity']
       
       # Check required fields
       missing_fields = [field for field in required_fields if field not in order_data]
       if missing_fields:
           raise ValueError(f"Missing required fields: {', '.join(missing_fields)}")
       
       # Validate quantity
       quantity = order_data['quantity']
       if not isinstance(quantity, int) or quantity < 1:
           raise ValueError("Quantity must be a positive integer")
       
       # Format and return the validated data
       return {
           'product_id': str(order_data['product_id']),
           'quantity': quantity,
           'shipping_priority': order_data.get('priority', 'standard')
       }
   
   def format_response(status_code, body):
       """Formats the API response."""
       return {
           'statusCode': status_code,
           'body': json.dumps(body)
       }
   ```

1. `python` 디렉터리의 내용을 압축합니다.

------
#### [ Linux/macOS ]

   ```
   zip -r layer.zip python/
   ```

------
#### [ PowerShell ]

   ```
   Compress-Archive -Path .\python -DestinationPath .\layer.zip
   ```

------

   .zip 파일의 디렉터리 구조는 다음과 같아야 합니다.

   ```
   python/     # Required top-level directory
   └── validator.py
   ```

1. 함수에서 Python 패키지와 마찬가지로 모듈을 가져와서 사용합니다. 예제:

   ```
   from validator import validate_order, format_response
   import json
   
   def lambda_handler(event, context):
       try:
           # Parse the order data from the event body
           order_data = json.loads(event.get('body', '{}'))
           
           # Validate and format the order
           validated_order = validate_order(order_data)
           
           return format_response(200, {
               'message': 'Order validated successfully',
               'order': validated_order
           })
       except ValueError as e:
           return format_response(400, {
               'error': str(e)
           })
       except Exception as e:
           return format_response(500, {
               'error': 'Internal server error'
           })
   ```

   다음 [테스트 이벤트](testing-functions.md#invoke-with-event)를 사용하여 함수를 간접적으로 호출할 수 있습니다.

   ```
   {
       "body": "{\"product_id\": \"ABC123\", \"quantity\": 2, \"priority\": \"express\"}"
   }
   ```

   예상 응답:

   ```
   {
     "statusCode": 200,
     "body": "{\"message\": \"Order validated successfully\", \"order\": {\"product_id\": \"ABC123\", \"quantity\": 2, \"shipping_priority\": \"express\"}}"
   }
   ```

## Lambda에서 계층 생성
<a name="publishing-layer"></a>

AWS CLI 또는 Lambda 콘솔을 사용하여 계층을 게시할 수 있습니다.

------
#### [ AWS CLI ]

[publish-layer-version](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/publish-layer-version.html) AWS CLI 명령을 실행하여 Lambda 계층을 생성합니다.

```
aws lambda publish-layer-version --layer-name my-layer --zip-file fileb://layer.zip --compatible-runtimes python3.14
```

[호환되는 런타임](https://docs.aws.amazon.com/lambda/latest/api/API_PublishLayerVersion.html#lambda-PublishLayerVersion-request-CompatibleRuntimes) 파라미터는 선택 사항입니다. 지정된 경우 Lambda는 이 파라미터를 사용하여 Lambda 콘솔에서 계층을 필터링합니다.

------
#### [ Console ]

**계층을 생성하려면(콘솔)**

1. Lambda 콘솔의 [계층 페이지](https://console.aws.amazon.com/lambda/home#/layers)를 엽니다.

1. **계층 생성**을 선택합니다.

1. **.zip 파일 업로드를** 선택한 다음 이전에 생성한 .zip 아카이브를 업로드합니다.

1. (선택 사항) **호환되는 런타임**에서 계층을 빌드하는 데 사용한 Python 버전에 해당하는 Python 런타임을 선택합니다.

1. **생성(Create)**을 선택합니다.

------

## 함수에 계층 추가
<a name="python-layer-adding"></a>

------
#### [ AWS CLI ]

함수에 계층을 연결하려면 [update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) AWS CLI 명령을 실행합니다. `--layers` 파라미터의 경우 계층 ARN을 사용합니다. ARN은 버전을 지정해야 합니다(예: `arn:aws:lambda:us-east-1:123456789012:layer:my-layer:1`). 자세한 내용은 [계층 및 계층 버전](chapter-layers.md#lambda-layer-versions) 섹션을 참조하세요.

```
aws lambda update-function-configuration --function-name my-function --cli-binary-format raw-in-base64-out --layers "arn:aws:lambda:us-east-1:123456789012:layer:my-layer:1"
```

**cli-binary-format** 옵션은 AWS CLI 버전 2를 사용할 때 필요합니다. 이 설정을 기본 설정으로 지정하려면 `aws configure set cli-binary-format raw-in-base64-out`을(를) 실행하세요. 자세한 내용은 [AWS CLI 지원되는 글로벌 명령줄 옵션](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list)을 AWS Command Line Interface 사용 설명서 버전 2에서 참조하세요.

------
#### [ Console ]

**함수에 계층을 추가하려면 다음을 수행하세요.**

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. 함수를 선택합니다.

1. 아래로 스크롤하여 **계층** 섹션으로 이동하고 **계층 추가**를 선택하세요.

1. **계층 선택**에서 **사용자 지정 계층**을 선택하고 계층을 선택합니다.
**참고**  
계층을 생성할 때 [호환되는 런타임](https://docs.aws.amazon.com/lambda/latest/api/API_PublishLayerVersion.html#lambda-PublishLayerVersion-request-CompatibleRuntimes)을 추가하지 않은 경우 여기에 계층이 나열되지 않습니다. 대신 계층 ARN을 지정할 수 있습니다.

1. **추가**를 선택합니다.

------

## 샘플 애플리케이션
<a name="python-layer-sample-app"></a>

Lambda 계층을 사용하는 방법의 자세한 예는 AWS Lambda Developer Guide GitHub 리포지토리의 [layer-python](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/layer-python) 샘플 애플리케이션을 참조하세요. 이 애플리케이션에는 Python 라이브러리가 포함된 두 개의 계층이 있습니다. 계층을 생성한 후 해당 함수를 배포하고 간접적으로 호출하여 계층이 예상대로 작동하는지 확인할 수 있습니다.

# Lambda 컨텍스트 객체를 사용하여 Python 함수 정보 검색
<a name="python-context"></a>

Lambda는 함수를 실행할 때 컨텍스트 객체를 [핸들러](python-handler.md)에 전달합니다. 이 객체는 호출, 함수 및 실행 환경에 관한 정보를 제공하는 메서드 및 속성들을 제공합니다. 컨텍스트 객체가 함수 핸들러에 전달되는 방법에 대한 자세한 내용은 [Python에서 Lambda 함수 핸들러 정의](python-handler.md) 섹션을 참조하십시오.

**컨텍스트 메서드**
+ `get_remaining_time_in_millis` – 실행 시간이 초과되기까지 남은 시간(밀리초)을 반환합니다.

**컨텍스트 속성**
+ `function_name` – Lambda 함수의 이름입니다.
+ `function_version` – 함수의 [버전](configuration-versions.md)입니다.
+ `invoked_function_arn` – 함수를 호출할 때 사용하는 Amazon 리소스 이름(ARN)입니다. 호출자가 버전 번호 또는 별칭을 지정했는지 여부를 나타냅니다.
+ `memory_limit_in_mb` – 함수에 할당된 메모리의 양입니다.
+ `aws_request_id` – 호출 요청의 식별자입니다.
+ `log_group_name` – 함수에 대한 로그 그룹입니다.
+ `log_stream_name` – 함수 인스턴스에 대한 로그 스트림입니다.
+ `identity` – (모바일 앱) 요청을 승인한 Amazon Cognito 자격 증명에 대한 정보입니다.
  + `cognito_identity_id`— 인증된 Amazon Cognito ID입니다.
  + `cognito_identity_pool_id` – 호출에 대한 권한을 부여한 Amazon Cognito ID 풀입니다.
+ `client_context` – (모바일 앱) 클라이언트 애플리케이션이 Lambda에게 제공한 클라이언트 컨텍스트입니다.
  + `client.installation_id`
  + `client.app_title`
  + `client.app_version_name`
  + `client.app_version_code`
  + `client.app_package_name`
  + `custom` – 모바일 클라이언트 애플리케이션에서 설정된 사용자 지정 값의 `dict`입니다.
  + `env` – AWS SDK가 제공하는 환경 정보의 `dict`입니다.

Powertools for Lambda(Python)는 Lambda 컨텍스트 객체에 대한 인터페이스 정의를 제공합니다. 인터페이스 정의를 유형 힌트에 사용하거나 Lambda 컨텍스트 객체의 구조를 추가로 검사할 수 있습니다. 인터페이스 정의는 GitHub의 *powertools-lambda-python* 리포지토리에서 [lambda\$1context.py](https://github.com/aws-powertools/powertools-lambda-python/blob/develop/aws_lambda_powertools/utilities/typing/lambda_context.py)를 참조하세요.

다음 예제는 컨텍스트 정보를 기록하는 핸들러 함수를 보여줍니다.

**Example handler.py**  

```
import time

def lambda_handler(event, context):   
    print("Lambda function ARN:", context.invoked_function_arn)
    print("CloudWatch log stream name:", context.log_stream_name)
    print("CloudWatch log group name:",  context.log_group_name)
    print("Lambda Request ID:", context.aws_request_id)
    print("Lambda function memory limits in MB:", context.memory_limit_in_mb)
    # We have added a 1 second delay so you can see the time remaining in get_remaining_time_in_millis.
    time.sleep(1) 
    print("Lambda time remaining in MS:", context.get_remaining_time_in_millis())
```

위에 열거한 옵션들 외에도 AWS용 [AWS Lambda에서 Python 코드 계측](python-tracing.md) X-Ray SDK를 사용하면 중요한 코드 경로를 식별하고 그 성능을 추적하며 분석용 데이터를 수집할 수도 있습니다.

# Python Lambda 함수 로깅 및 모니터링
<a name="python-logging"></a>

AWS Lambda는 자동으로 Lambda 함수를 모니터링하고 로그 항목을 Amazon CloudWatch로 보냅니다. Lambda 함수는 함수의 각 인스턴스에 대한 CloudWatch Logs 로그 그룹 및 로그 스트림과 함께 제공됩니다. Lambda 런타임 환경은 각 간접 호출에 대한 세부 정보와 함수 코드의 기타 출력을 로그 스트림으로 전송합니다. CloudWatch Logs에 대한 자세한 내용은 [CloudWatch Logs로 Lambda 함수 로그 전송](monitoring-cloudwatchlogs.md) 섹션을 참조하세요.

함수 코드에서 로그를 출력하려면 기본 제공 [https://docs.python.org/3/library/logging.html](https://docs.python.org/3/library/logging.html) 모듈을 사용합니다. 더 자세한 항목을 보기 위해 `stdout` 또는 `stderr`에 쓰는 로깅 라이브러리를 사용할 수 있습니다.

## 로그에 인쇄
<a name="python-logging-output"></a>

기본 출력을 로그로 보내려면 함수에서 `print` 메서드를 사용합니다. 다음 예제에서는 CloudWatch Logs 로그 그룹 및 스트림과 이벤트 객체의 값을 로깅합니다.

참고로 함수가 Python `print` 문을 사용하여 로그를 출력하는 경우 Lambda는 일반 텍스트 형식으로만 로그 출력을 CloudWatch Logs에 보낼 수 있습니다. 구조화된 JSON으로 로그를 캡처하려면 지원되는 로깅 라이브러리를 사용해야 합니다. 자세한 정보는 [Python에서 Lambda 고급 로깅 제어 사용](#python-logging-advanced)을 참조하세요.

**Example lambda\$1function.py**  

```
import os
def lambda_handler(event, context):
    print('## ENVIRONMENT VARIABLES')
    print(os.environ['AWS_LAMBDA_LOG_GROUP_NAME'])
    print(os.environ['AWS_LAMBDA_LOG_STREAM_NAME'])
    print('## EVENT')
    print(event)
```

**Example 로그 출력**  

```
START RequestId: 8f507cfc-xmpl-4697-b07a-ac58fc914c95 Version: $LATEST
## ENVIRONMENT VARIABLES
/aws/lambda/my-function
2025/08/31/[$LATEST]3893xmpl7fac4485b47bb75b671a283c
## EVENT
{'key': 'value'}
END RequestId: 8f507cfc-xmpl-4697-b07a-ac58fc914c95
REPORT RequestId: 8f507cfc-xmpl-4697-b07a-ac58fc914c95  Duration: 15.74 ms  Billed Duration: 147 ms Memory Size: 128 MB Max Memory Used: 56 MB  Init Duration: 130.49 ms
XRAY TraceId: 1-5e34a614-10bdxmplf1fb44f07bc535a1   SegmentId: 07f5xmpl2d1f6f85 Sampled: true
```

Python 런타임은 각 호출에 대해 `START`, `END` 및 `REPORT` 줄을 로깅합니다. `REPORT` 행에는 다음 데이터가 포함됩니다.

**REPORT 행 데이터 필드**
+ **RequestId** – 호출의 고유한 요청 ID입니다.
+ **지속시간** – 함수의 핸들러 메서드가 이벤트를 처리하는 데 걸린 시간입니다.
+ **청구 기간** – 호출에 대해 청구된 시간입니다.
+ **메모리 크기** - 함수에 할당된 메모리 양입니다.
+ **사용된 최대 메모리** – 함수에서 사용한 메모리 양입니다. 간접 호출이 실행 환경을 공유하는 경우 Lambda는 모든 간접 호출에서 사용된 최대 메모리를 보고합니다. 이 동작으로 인해 보고된 값이 예상보다 높을 수 있습니다.
+ **초기화 기간** – 제공된 첫 번째 요청의 경우 런타임이 핸들러 메서드 외부에서 함수를 로드하고 코드를 실행하는 데 걸린 시간입니다.
+ **XRAY TraceId** – 추적된 요청의 경우 [AWS X-Ray 추적 ID](services-xray.md)입니다.
+ **SegmentId** - 추적된 요청의 경우 X-Ray 세그먼트 ID입니다.
+ **샘플링 완료(Sampled)** – 추적된 요청의 경우 샘플링 결과입니다.

## 로깅 라이브러리 사용
<a name="python-logging-lib"></a>

더 자세한 로그를 보려면 표준 라이브러리의 [logging](https://docs.python.org/3/library/logging.html) 모듈을 사용하거나 `stdout` 또는 `stderr`에 쓰는 타사 로깅 라이브러리를 사용하세요.

지원되는 Python 런타임의 경우 표준 `logging` 모듈을 사용하여 생성한 로그를 일반 텍스트로 캡처할지 JSON으로 캡처할지 선택할 수 있습니다. 자세한 내용은 [Python에서 Lambda 고급 로깅 제어 사용](#python-logging-advanced)를 참조하세요.

현재 모든 Python 런타임의 기본 로그 형식은 일반 텍스트입니다. 다음 예제는 표준 `logging` 모듈을 사용하여 생성된 로그 출력이 CloudWatch Logs에서 일반 텍스트로 캡처되는 방법을 보여줍니다.

```
import os
import logging
logger = logging.getLogger()
logger.setLevel("INFO")
  
def lambda_handler(event, context):
    logger.info('## ENVIRONMENT VARIABLES')
    logger.info(os.environ['AWS_LAMBDA_LOG_GROUP_NAME'])
    logger.info(os.environ['AWS_LAMBDA_LOG_STREAM_NAME'])
    logger.info('## EVENT')
    logger.info(event)
```

`logger`의 출력에는 로그 레벨, 타임스탬프와 요청 ID가 포함됩니다.

```
START RequestId: 1c8df7d3-xmpl-46da-9778-518e6eca8125 Version: $LATEST
[INFO]  2025-08-31T22:12:58.534Z    1c8df7d3-xmpl-46da-9778-518e6eca8125    ## ENVIRONMENT VARIABLES
[INFO]  2025-08-31T22:12:58.534Z    1c8df7d3-xmpl-46da-9778-518e6eca8125    /aws/lambda/my-function
[INFO]  2025-08-31T22:12:58.534Z    1c8df7d3-xmpl-46da-9778-518e6eca8125    2025/01/31/[$LATEST]1bbe51xmplb34a2788dbaa7433b0aa4d
[INFO]  2025-08-31T22:12:58.535Z    1c8df7d3-xmpl-46da-9778-518e6eca8125    ## EVENT
[INFO]  2025-08-31T22:12:58.535Z    1c8df7d3-xmpl-46da-9778-518e6eca8125    {'key': 'value'}
END RequestId: 1c8df7d3-xmpl-46da-9778-518e6eca8125
REPORT RequestId: 1c8df7d3-xmpl-46da-9778-518e6eca8125  Duration: 2.75 ms   Billed Duration: 117 ms Memory Size: 128 MB Max Memory Used: 56 MB  Init Duration: 113.51 ms
XRAY TraceId: 1-5e34a66a-474xmpl7c2534a87870b4370   SegmentId: 073cxmpl3e442861 Sampled: true
```

**참고**  
함수의 로그 형식이 일반 텍스트로 설정된 경우 Python 런타임의 기본 로그 수준 설정은 경고입니다. 즉, Lambda는 경고 수준 이하의 로그 출력만 CloudWatch Logs로 전송합니다. 기본 로그 수준을 변경하려면 이 예제 코드에 표시된 대로 Python `logging` `setLevel()` 메서드를 사용합니다. 함수의 로그 형식을 JSON으로 설정하는 경우 코드에서 로그 수준을 설정하는 대신 Lambda 고급 로깅 제어를 사용하여 함수의 로그 수준을 구성하는 것이 좋습니다. 자세한 내용은 [Python에서 로그 수준 필터링 사용](#python-logging-levels) 섹션을 참조하세요.

## Python에서 Lambda 고급 로깅 제어 사용
<a name="python-logging-advanced"></a>

함수의 로그를 캡처, 처리 및 사용하는 방법을 더 잘 제어할 수 있도록 지원되는 Lambda Python 런타임임에 대한 다음의 로깅 옵션을 구성할 수 있습니다.
+ **로그 형식** - 함수 로그의 경우 일반 텍스트와 구조화된 JSON 형식 중에서 선택
+ **로그 수준** - JSON 형식의 로그의 경우, Lambda가 Amazon CloudWatch로 전송하는 로그의 세부 수준(ERROR, DEBUG 또는 INFO 등)을 선택
+ **로그 그룹** - 함수가 로그를 보내는 CloudWatch 로그 그룹을 선택

이러한 로깅 옵션에 대한 자세한 내용과 이를 사용하도록 함수를 구성하는 방법에 대한 지침은 [Lambda 함수에 대한 고급 로깅 제어 구성](monitoring-logs.md#monitoring-cloudwatchlogs-advanced)을 참조하세요.

Python Lambda 함수에서 로그 형식 및 로그 수준 옵션을 사용하는 방법에 대해 자세히 알아보려면 다음 섹션의 지침을 참조하세요.

### Python에서 구조화된 JSON 로그 사용
<a name="python-logging-JSON"></a>

함수의 로그 형식으로 JSON을 선택하면 Lambda는 Python 표준 로깅 라이브러리의 로그 출력을 구조화된 JSON으로 CloudWatch에 전송합니다. 각 JSON 로그 객체에는 다음 키가 있는 4개의 키 값 페어가 포함되어 있습니다.
+ `"timestamp"` - 로그 메시지가 생성된 시간
+ `"level"` - 메시지에 할당된 로그 수준
+ `"message"` - 로그 메시지의 내용
+ `"requestId"` - 함수 간접 호출의 고유한 요청 ID

Python `logging` 라이브러리는 이 JSON 객체에 추가 키 값 페어(예: `"logger"`)를 추가할 수도 있습니다.

다음 섹션의 예는 함수의 로그 형식을 JSON으로 구성할 때 Python `logging` 라이브러리를 사용하여 생성된 로그 출력이 CloudWatch Logs에 캡처되는 방법을 보여줍니다.

참고로 `print` 메서드를 사용하여 [로그에 인쇄](#python-logging-output)에 설명된 대로 기본 로그 출력을 생성하는 경우 함수의 로깅 형식을 JSON으로 구성하더라도 Lambda는 이러한 출력을 일반 텍스트로 캡처합니다.

#### Python 로깅 라이브러리를 사용하는 표준 JSON 로그 출력
<a name="python-logging-standard"></a>

다음 섹션의 코드 조각 및 로그 출력 예는 함수의 로그 형식을 JSON으로 구성할 때 Python `logging` 라이브러리를 사용하여 생성된 표준 로그 출력이 CloudWatch Logs에 캡처되는 방법을 보여줍니다.

**Example Python 로깅 코드**  

```
import logging  
logger = logging.getLogger()

def lambda_handler(event, context):
    logger.info("Inside the handler function")
```

**Example JSON 로그 레코드**  

```
{
    "timestamp":"2025-10-27T19:17:45.586Z",
    "level":"INFO",
    "message":"Inside the handler function",
    "logger": "root",
    "requestId":"79b4f56e-95b1-4643-9700-2807f4e68189"
}
```

#### JSON에 추가 파라미터 로깅
<a name="python-logging-extra"></a>

함수의 로그 형식이 JSON으로 설정된 경우 `extra` 키워드를 사용하여 Python 사전을 로그 출력에 전달함으로써 표준 Python `logging` 라이브러리로 추가 파라미터를 로깅할 수도 있습니다.

**Example Python 로깅 코드**  

```
import logging

def lambda_handler(event, context):
    logging.info(
        "extra parameters example", 
        extra={"a":"b", "b": [3]},
    )
```

**Example JSON 로그 레코드**  

```
{
  "timestamp": "2025-11-02T15:26:28Z",
  "level": "INFO",
  "message": "extra parameters example",
  "logger": "root",
  "requestId": "3dbd5759-65f6-45f8-8d7d-5bdc79a3bd01",
  "a": "b",
  "b": [
    3
  ]
}
```

#### JSON에서 예외 로깅
<a name="python-logging-exception"></a>

다음 코드 조각은 로그 형식을 JSON으로 구성할 때 함수의 로그 출력에서 Python 예외가 캡처되는 방법을 보여줍니다. 참고로 `logging.exception`을 사용하여 생성된 로그 출력에는 로그 수준 ERROR가 할당된다는 점에 유의하세요.

**Example Python 로깅 코드**  

```
import logging

def lambda_handler(event, context):
    try:
        raise Exception("exception")
    except:
        logging.exception("msg")
```

**Example JSON 로그 레코드**  

```
{
  "timestamp": "2025-11-02T16:18:57Z",
  "level": "ERROR",
  "message": "msg",
  "logger": "root",
  "stackTrace": [
    "  File \"/var/task/lambda_function.py\", line 15, in lambda_handler\n    raise Exception(\"exception\")\n"
  ],
  "errorType": "Exception",
  "errorMessage": "exception",
  "requestId": "3f9d155c-0f09-46b7-bdf1-e91dab220855",
  "location": "/var/task/lambda_function.py:lambda_handler:17"
}
```

#### 다른 로깅 도구를 사용한 JSON 구조화된 로그
<a name="python-logging-thirdparty"></a>

코드에서 이미 AWS Lambda용 Powertools 같은 다른 로깅 라이브러리를 사용하여 JSON 구조화된 로그를 생성하는 경우에는 변경할 필요가 없습니다. AWS Lambda는 이미 JSON으로 인코딩된 로그는 이중 인코딩하지 않습니다. JSON 로그 형식을 사용하도록 함수를 구성하더라도 로깅 출력은 사용자가 정의한 JSON 구조로 CloudWatch에 표시됩니다.

다음 예는 AWS Lambda 패키지용 Powertools를 사용하여 생성된 로그 출력이 CloudWatch Logs에 캡처되는 방법을 보여줍니다. 이 로그 출력의 형식은 함수의 로깅 구성이 JSON으로 설정되든 TEXT로 설정되었든 동일합니다. AWS Lambda용 Powertools 사용에 대한 자세한 내용은 [구조화된 로깅에 Powertools for AWS Lambda(Python) 및 AWS SAM 사용](#python-logging-sam) 및 [구조화된 로깅에 Powertools for AWS Lambda(Python) 및 AWS CDK 사용](#python-logging-powertools-cdk)을 참조하세요.

**Example Python 로깅 코드 조각(AWS Lambda용 Powertools 사용)**  

```
from aws_lambda_powertools import Logger

logger = Logger()

def lambda_handler(event, context):
    logger.info("Inside the handler function")
```

**Example JSON 로그 레코드(AWS Lambda용 Powertools 사용)**  

```
{ 
    "level": "INFO", 
    "location": "lambda_handler:7", 
    "message": "Inside the handler function", 
    "timestamp": "2025-10-31 22:38:21,010+0000", 
    "service": "service_undefined", 
    "xray_trace_id": "1-654181dc-65c15d6b0fecbdd1531ecb30" 
}
```

### Python에서 로그 수준 필터링 사용
<a name="python-logging-levels"></a>

로그 수준 필터링을 구성하면 특정 로깅 수준 이하의 로그만 CloudWatch Logs로 전송하도록 선택할 수 있습니다. 함수의 로그 수준 필터링을 구성하는 방법을 알아보려면 [로그 수준 필터링](monitoring-cloudwatchlogs-log-level.md)을 참조하세요.

AWS Lambda에서 애플리케이션 로그를 로그 수준에 따라 필터링하려면 함수에서 JSON 형식의 로그를 사용해야 합니다. 다음 두 가지 방법으로 이 작업을 달성할 수 있습니다.
+ 표준 Python `logging` 라이브러리를 사용하여 로그 출력을 생성하고 JSON 로그 형식을 사용하도록 함수를 구성합니다. AWS Lambda은 그런 다음 [Python에서 구조화된 JSON 로그 사용](#python-logging-JSON)에서 설명하는 JSON 객체의 “레벨” 키 값 쌍을 사용하여 로그 출력을 필터링합니다. 함수의 로그 형식을 구성하는 방법을 알아보려면 [Lambda 함수에 대한 고급 로깅 제어 구성](monitoring-logs.md#monitoring-cloudwatchlogs-advanced)를 참조하세요.
+ 다른 로깅 라이브러리 또는 메서드를 사용하여 로그 출력 수준을 정의하는 “레벨” 키 값 쌍이 포함된 JSON 구조화된 로그를 코드에 만들 수 있습니다. 예를 들어 AWS Lambda용 Powertools를 사용하여 코드로부터 JSON 구조화된 로그 출력을 생성할 수 있습니다.

  또한 인쇄 문을 사용하여 로그 수준 식별자를 포함하는 JSON 객체를 출력할 수도 있습니다. 다음 인쇄 문은 로그 수준이 INFO로 설정된 JSON 형식의 출력을 생성합니다. AWS Lambda는 함수의 로깅 수준이 INFO, DEBUG, 또는 TRACE로 설정된 경우 JSON 객체를 CloudWatch Logs로 전송합니다.

  ```
  print('{"msg":"My log message", "level":"info"}')
  ```

Lambda가 함수 로그를 필터링하려면 JSON 로그 출력에 `"timestamp"` 키 값 쌍도 포함해야 합니다. 시간은 유효한 [RFC 3339](https://www.ietf.org/rfc/rfc3339.txt) 타임스탬프 형식으로 지정해야 합니다. 유효한 타임스탬프를 제공하지 않으면 Lambda는 로그에 레벨 INFO를 할당하고 타임스탬프를 추가합니다.

## Lambda 콘솔에서 로그 보기
<a name="python-logging-console"></a>

Lambda 함수를 간접 호출한 후 Lambda 콘솔을 사용하여 로그 출력을 볼 수 있습니다.

포함된 **코드** 편집기에서 코드를 테스트할 수 있는 경우 **실행 결과**에서 로그를 찾을 수 있습니다. 콘솔 테스트 기능을 사용하여 함수를 간접적으로 간접 호출하면 **세부 정보** 섹션에서 **로그 출력**을 찾을 수 있습니다.

## CloudWatch 콘솔에서 로그 보기
<a name="python-logging-cwconsole"></a>

Amazon CloudWatch 콘솔을 사용하여 모든 Lambda 함수 호출에 대한 로그를 볼 수 있습니다.

**CloudWatch 콘솔에서 로그를 보려면**

1. CloudWatch 콘솔에서 [로그 그룹 페이지](https://console.aws.amazon.com/cloudwatch/home?#logs:)를 엽니다.

1. 함수(**/aws/lambda/*your-function-name***)에 대한 로그 그룹을 선택합니다.

1. 로그 스트림을 선택합니다.

각 로그 스트림은 [함수의 인스턴스](lambda-runtime-environment.md)에 해당합니다. 로그 스트림은 Lambda 함수를 업데이트할 때, 그리고 동시 호출을 처리하기 위해 추가 인스턴스가 생성될 때 나타납니다. 특정 호출에 대한 로그를 찾으려면 AWS X-Ray로 함수를 계측하는 것이 좋습니다. X-Ray는 요청 및 로그 스트림에 대한 세부 정보를 기록합니다.

## AWS CLI를 사용하여 로그 보기
<a name="python-logging-cli"></a>

AWS CLI은(는) 명령줄 셸의 명령을 사용하여 AWS 서비스와 상호 작용할 수 있는 오픈 소스 도구입니다. 이 섹션의 단계를 완료하려면 [AWS CLI 버전 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)가 필요합니다.

[AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-welcome.html)를 사용하면 `--log-type` 명령 옵션을 통해 호출에 대한 로그를 검색할 수 있습니다. 호출에서 base64로 인코딩된 로그를 최대 4KB까지 포함하는 `LogResult` 필드가 응답에 포함됩니다.

**Example 로그 ID 검색**  
다음 예제에서는 `LogResult`이라는 함수의 `my-function` 필드에서 *로그 ID*를 검색하는 방법을 보여줍니다.  

```
aws lambda invoke --function-name my-function out --log-type Tail
```
다음 결과가 표시됩니다:  

```
{
    "StatusCode": 200,
    "LogResult": "U1RBUlQgUmVxdWVzdElkOiA4N2QwNDRiOC1mMTU0LTExZTgtOGNkYS0yOTc0YzVlNGZiMjEgVmVyc2lvb...",
    "ExecutedVersion": "$LATEST"
}
```

**Example decode the logs**  
동일한 명령 프롬프트에서 `base64` 유틸리티를 사용하여 로그를 디코딩합니다. 다음 예제에서는 `my-function`에 대한 base64로 인코딩된 로그를 검색하는 방법을 보여줍니다.  

```
aws lambda invoke --function-name my-function out --log-type Tail \
--query 'LogResult' --output text --cli-binary-format raw-in-base64-out | base64 --decode
```
**cli-binary-format** 옵션은 AWS CLI 버전 2를 사용할 때 필요합니다. 이 설정을 기본 설정으로 지정하려면 `aws configure set cli-binary-format raw-in-base64-out`을(를) 실행하세요. 자세한 내용은 *AWS Command Line Interface 사용 설명서 버전 2*에서 [AWS CLI 지원 글로벌 명령줄 옵션](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list)을 참조하세요.  
다음 결과가 표시됩니다.  

```
START RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8 Version: $LATEST
"AWS_SESSION_TOKEN": "AgoJb3JpZ2luX2VjELj...", "_X_AMZN_TRACE_ID": "Root=1-5d02e5ca-f5792818b6fe8368e5b51d50;Parent=191db58857df8395;Sampled=0"",ask/lib:/opt/lib",
END RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8
REPORT RequestId: 57f231fb-1730-4395-85cb-4f71bd2b87b8  Duration: 79.67 ms      Billed Duration: 80 ms         Memory Size: 128 MB     Max Memory Used: 73 MB
```
`base64` 유틸리티는 Linux, macOS 및 [Ubuntu on Windows](https://docs.microsoft.com/en-us/windows/wsl/install-win10)에서 사용할 수 있습니다. macOS 사용자는 `base64 -D`를 사용해야 할 수도 있습니다.

**Example get-logs.sh 스크립트**  
동일한 명령 프롬프트에서 다음 스크립트를 사용하여 마지막 5개 로그 이벤트를 다운로드합니다. 이 스크립트는 `sed`를 사용하여 출력 파일에서 따옴표를 제거하고, 로그를 사용할 수 있는 시간을 허용하기 위해 15초 동안 대기합니다. 출력에는 Lambda의 응답과 `get-log-events` 명령의 출력이 포함됩니다.  
다음 코드 샘플의 내용을 복사하고 Lambda 프로젝트 디렉터리에 `get-logs.sh`로 저장합니다.  
**cli-binary-format** 옵션은 AWS CLI 버전 2를 사용할 때 필요합니다. 이 설정을 기본 설정으로 지정하려면 `aws configure set cli-binary-format raw-in-base64-out`을(를) 실행하세요. 자세한 내용은 *AWS Command Line Interface 사용 설명서 버전 2*에서 [AWS CLI 지원 글로벌 명령줄 옵션](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-options.html#cli-configure-options-list)을 참조하세요.  

```
#!/bin/bash
aws lambda invoke --function-name my-function --cli-binary-format raw-in-base64-out --payload '{"key": "value"}' out
sed -i'' -e 's/"//g' out
sleep 15
aws logs get-log-events --log-group-name /aws/lambda/my-function --log-stream-name stream1 --limit 5
```

**Example macOS 및 Linux(전용)**  
동일한 명령 프롬프트에서 macOS 및 Linux 사용자는 스크립트가 실행 가능한지 확인하기 위해 다음 명령을 실행해야 할 수 있습니다.  

```
chmod -R 755 get-logs.sh
```

**Example 마지막 5개 로그 이벤트 검색**  
동일한 명령 프롬프트에서 다음 스크립트를 실행하여 마지막 5개 로그 이벤트를 가져옵니다.  

```
./get-logs.sh
```
다음 결과가 표시됩니다:  

```
{
    "StatusCode": 200,
    "ExecutedVersion": "$LATEST"
}
{
    "events": [
        {
            "timestamp": 1559763003171,
            "message": "START RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf Version: $LATEST\n",
            "ingestionTime": 1559763003309
        },
        {
            "timestamp": 1559763003173,
            "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tENVIRONMENT VARIABLES\r{\r  \"AWS_LAMBDA_FUNCTION_VERSION\": \"$LATEST\",\r ...",
            "ingestionTime": 1559763018353
        },
        {
            "timestamp": 1559763003173,
            "message": "2019-06-05T19:30:03.173Z\t4ce9340a-b765-490f-ad8a-02ab3415e2bf\tINFO\tEVENT\r{\r  \"key\": \"value\"\r}\n",
            "ingestionTime": 1559763018353
        },
        {
            "timestamp": 1559763003218,
            "message": "END RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\n",
            "ingestionTime": 1559763018353
        },
        {
            "timestamp": 1559763003218,
            "message": "REPORT RequestId: 4ce9340a-b765-490f-ad8a-02ab3415e2bf\tDuration: 26.73 ms\tBilled Duration: 27 ms \tMemory Size: 128 MB\tMax Memory Used: 75 MB\t\n",
            "ingestionTime": 1559763018353
        }
    ],
    "nextForwardToken": "f/34783877304859518393868359594929986069206639495374241795",
    "nextBackwardToken": "b/34783877303811383369537420289090800615709599058929582080"
}
```

## 로그 삭제
<a name="python-logging-delete"></a>

함수를 삭제해도 로그 그룹이 자동으로 삭제되지 않습니다. 로그를 무기한 저장하지 않으려면 로그 그룹을 삭제하거나 로그가 자동으로 삭제되는 [보존 기간을 구성](https://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/Working-with-log-groups-and-streams.html#SettingLogRetention)하세요.

## 기타 로깅 도구 및 라이브러리 사용
<a name="python-tools-libraries"></a>

[Powertools for AWS Lambda(Python)](https://docs.aws.amazon.com/powertools/python/)는 서버리스 모범 사례를 구현하고 개발자 속도를 높이기 위한 개발자 도구 키트입니다. [Logger 유틸리티](https://docs.aws.amazon.com/powertools/python/latest/core/logger/)는 JSON으로 구조화된 출력과 함께 모든 함수의 함수 컨텍스트에 대한 추가 정보를 포함하는 Lambda 최적화 로거를 제공합니다. 이 유틸리티를 사용하여 다음을 수행합니다.
+ Lambda 컨텍스트, 콜드 스타트 및 구조 로깅 출력에서 JSON으로 주요 필드 캡처
+ 지시 시 Lambda 호출 이벤트 로깅(기본적으로 비활성화됨)
+ 로그 샘플링을 통해 호출 비율에 대해서만 모든 로그 인쇄(기본적으로 비활성화됨)
+ 언제든지 구조화된 로그에 추가 키 추가
+ 사용자 지정 로그 포맷터(Bring Your Own Formatter)를 사용하여 조직의 로깅 RFC와 호환되는 구조로 로그 출력

## 구조화된 로깅에 Powertools for AWS Lambda(Python) 및 AWS SAM 사용
<a name="python-logging-sam"></a>

다음 단계를 따라 AWS SAM을 사용하는 통합 [Powertools for Python](https://docs.aws.amazon.com/powertools/python/latest/) 모듈을 사용하여 샘플 Hello World Python 애플리케이션을 다운로드, 빌드 및 배포합니다. 이 애플리케이션은 기본 API 백엔드를 구현하고 Powertools를 사용하여 로그, 지표 및 추적을 내보냅니다. 이 구성에는 Amazon API Gateway 엔드포인트와 Lambda 함수가 포함됩니다. API Gateway 엔드포인트로 GET 요청을 전송하면 Lambda 함수가 간접 호출되고 Embedded Metric Format을 사용하여 로그 및 지표를 CloudWatch로 전송하고 기록을 AWS X-Ray로 전송합니다. 이 함수는 `hello world` 메시지를 반환합니다.

**사전 조건**

이 섹션의 단계를 완료하려면 다음이 필요합니다.
+ Python 3.9
+ [AWS CLI 버전 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [AWS SAM CLI 버전 1.75 이상](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html). 이전 버전의 AWS SAM CLI가 있는 경우 [AWS SAM CLI 업그레이드](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/manage-sam-cli-versions.html#manage-sam-cli-versions-upgrade)를 참조하세요.

**샘플 AWS SAM 애플리케이션 배포**

1. Hello World Python 템플릿을 사용하여 애플리케이션을 초기화합니다.

   ```
   sam init --app-template hello-world-powertools-python --name sam-app --package-type Zip --runtime python3.9 --no-tracing
   ```

1. 앱을 빌드합니다.

   ```
   cd sam-app && sam build
   ```

1. 앱을 배포합니다.

   ```
   sam deploy --guided
   ```

1. 화면에 표시되는 프롬프트를 따릅니다. 대화형 환경에서 제공되는 기본 옵션을 수락하려면 `Enter`을 누릅니다.
**참고**  
**HelloWorldFunction에 권한 부여가 정의되어 있지 않을 수 있습니다. 괜찮습니다?**에 대해 `y`를 입력합니다.

1. 배포된 애플리케이션의 URL을 가져옵니다.

   ```
   aws cloudformation describe-stacks --stack-name sam-app --query 'Stacks[0].Outputs[?OutputKey==`HelloWorldApi`].OutputValue' --output text
   ```

1. API 엔드포인트 간접 호출:

   ```
   curl GET <URL_FROM_PREVIOUS_STEP>
   ```

   성공하면 다음과 같은 결과가 응답됩니다.

   ```
   {"message":"hello world"}
   ```

1. 함수에 대한 로그를 가져오려면 [sam logs](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-logs.html)를 실행합니다. 자세한 내용은 *AWS Serverless Application Model 개발자 안내서*에서 [로그 관련 작업](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-logging.html)을 참조하세요.

   ```
   sam logs --stack-name sam-app
   ```

   출력은 다음과 같습니다.

   ```
   2025/02/03/[$LATEST]ea9a64ec87294bf6bbc9026c05a01e04 2025-02-03T14:59:50.371000 INIT_START Runtime Version: python:3.9.v16    Runtime Version ARN: arn:aws:lambda:us-east-1::runtime:07a48df201798d627f2b950f03bb227aab4a655a1d019c3296406f95937e2525
   2025/02/03/[$LATEST]ea9a64ec87294bf6bbc9026c05a01e04 2025-02-03T14:59:51.112000 START RequestId: d455cfc4-7704-46df-901b-2a5cce9405be Version: $LATEST
   2025/02/03/[$LATEST]ea9a64ec87294bf6bbc9026c05a01e04 2025-02-03T14:59:51.114000 {
     "level": "INFO",
     "location": "hello:23",
     "message": "Hello world API - HTTP 200",
     "timestamp": "2025-02-03 14:59:51,113+0000",
     "service": "PowertoolsHelloWorld",
     "cold_start": true,
     "function_name": "sam-app-HelloWorldFunction-YBg8yfYtOc9j",
     "function_memory_size": "128",
     "function_arn": "arn:aws:lambda:us-east-1:111122223333:function:sam-app-HelloWorldFunction-YBg8yfYtOc9j",
     "function_request_id": "d455cfc4-7704-46df-901b-2a5cce9405be",
     "correlation_id": "e73f8aef-5e07-436e-a30b-63e4b23f0047",
     "xray_trace_id": "1-63dd2166-434a12c22e1307ff2114f299"
   }
   2025/02/03/[$LATEST]ea9a64ec87294bf6bbc9026c05a01e04 2025-02-03T14:59:51.126000 {
     "_aws": {
       "Timestamp": 1675436391126,
       "CloudWatchMetrics": [
         {
           "Namespace": "Powertools",
           "Dimensions": [
             [
               "function_name",
               "service"
             ]
           ],
           "Metrics": [
             {
               "Name": "ColdStart",
               "Unit": "Count"
             }
           ]
         }
       ]
     },
     "function_name": "sam-app-HelloWorldFunction-YBg8yfYtOc9j",
     "service": "PowertoolsHelloWorld",
     "ColdStart": [
       1.0
     ]
   }
   2025/02/03/[$LATEST]ea9a64ec87294bf6bbc9026c05a01e04 2025-02-03T14:59:51.126000 {
     "_aws": {
       "Timestamp": 1675436391126,
       "CloudWatchMetrics": [
         {
           "Namespace": "Powertools",
           "Dimensions": [
             [
               "service"
             ]
           ],
           "Metrics": [
             {
               "Name": "HelloWorldInvocations",
               "Unit": "Count"
             }
           ]
         }
       ]
     },
     "service": "PowertoolsHelloWorld",
     "HelloWorldInvocations": [
       1.0
     ]
   }
   2025/02/03/[$LATEST]ea9a64ec87294bf6bbc9026c05a01e04 2025-02-03T14:59:51.128000 END RequestId: d455cfc4-7704-46df-901b-2a5cce9405be
   2025/02/03/[$LATEST]ea9a64ec87294bf6bbc9026c05a01e04 2025-02-03T14:59:51.128000 REPORT RequestId: d455cfc4-7704-46df-901b-2a5cce9405be    Duration: 16.33 ms    Billed Duration: 756 ms    Memory Size: 128 MB    Max Memory Used: 64 MB    Init Duration: 739.46 ms    
   XRAY TraceId: 1-63dd2166-434a12c22e1307ff2114f299    SegmentId: 3c5d18d735a1ced0    Sampled: true
   ```

1. 이는 인터넷을 통해 액세스할 수 있는 퍼블릭 API 엔드포인트입니다. 테스트 후에는 엔드포인트를 삭제하는 것이 좋습니다.

   ```
   sam delete
   ```

### 로그 보존 관리
<a name="python-log-retention"></a>

함수를 삭제해도 로그 그룹이 자동으로 삭제되지 않습니다. 로그를 무기한 저장하지 않으려면 로그 그룹을 삭제하거나 경과 후 CloudWatch가 로그를 자동으로 삭제하는 보존 기간을 구성하세요. 로그 보존을 설정하려면 AWS SAM 템플릿에 다음을 추가합니다.

```
Resources:
  HelloWorldFunction:
    Type: AWS::Serverless::Function
    Properties:
      # Omitting other properties

  LogGroup:
    Type: AWS::Logs::LogGroup
    Properties:
      LogGroupName: !Sub "/aws/lambda/${HelloWorldFunction}"
      RetentionInDays: 7
```

## 구조화된 로깅에 Powertools for AWS Lambda(Python) 및 AWS CDK 사용
<a name="python-logging-powertools-cdk"></a>

다음 단계에 따라 AWS CDK를 사용하여 통합 [Powertools for AWS Lambda(Python)](https://docs.aws.amazon.com/powertools/python/latest/) 모듈이 포함된 샘플 Hello World Python 애플리케이션을 다운로드, 빌드 및 배포합니다. 이 애플리케이션은 기본 API 백엔드를 구현하고 Powertools를 사용하여 로그, 지표 및 추적을 내보냅니다. 이 구성에는 Amazon API Gateway 엔드포인트와 Lambda 함수가 포함됩니다. API Gateway 엔드포인트로 GET 요청을 전송하면 Lambda 함수가 간접 호출되고 Embedded Metric Format을 사용하여 로그 및 지표를 CloudWatch로 전송하고 기록을 AWS X-Ray로 전송합니다. 함수가 hello world 메시지를 반환합니다.

**사전 조건**

이 섹션의 단계를 완료하려면 다음이 필요합니다.
+ Python 3.9
+ [AWS CLI 버전 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [AWS CDK 버전 2](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_prerequisites)
+ [AWS SAM CLI 버전 1.75 이상](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html). 이전 버전의 AWS SAM CLI가 있는 경우 [AWS SAM CLI 업그레이드](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/manage-sam-cli-versions.html#manage-sam-cli-versions-upgrade)를 참조하세요.

**샘플 AWS CDK 애플리케이션 배포**

1. 새 애플리케이션용 프로젝트 디렉터리를 생성합니다.

   ```
   mkdir hello-world
   cd hello-world
   ```

1. 앱을 초기화합니다.

   ```
   cdk init app --language python
   ```

1.  Python 종속 구성 요소를 설치합니다.

   ```
   pip install -r requirements.txt
   ```

1. 루트 폴더 아래에 **lambda\$1function** 디렉터리를 생성합니다.

   ```
   mkdir lambda_function
   cd lambda_function
   ```

1. 파일 **app.py**를 생성하고 파일에 다음 코드를 추가합니다. Lambda 함수에 대한 코드입니다.

   ```
   from aws_lambda_powertools.event_handler import APIGatewayRestResolver
   from aws_lambda_powertools.utilities.typing import LambdaContext
   from aws_lambda_powertools.logging import correlation_paths
   from aws_lambda_powertools import Logger
   from aws_lambda_powertools import Tracer
   from aws_lambda_powertools import Metrics
   from aws_lambda_powertools.metrics import MetricUnit
   
   app = APIGatewayRestResolver()
   tracer = Tracer()
   logger = Logger()
   metrics = Metrics(namespace="PowertoolsSample")
   
   @app.get("/hello")
   @tracer.capture_method
   def hello():
       # adding custom metrics
       # See: https://docs.aws.amazon.com/powertools/python/latest//latest/core/metrics/
       metrics.add_metric(name="HelloWorldInvocations", unit=MetricUnit.Count, value=1)
   
       # structured log
       # See: https://docs.aws.amazon.com/powertools/python/latest//latest/core/logger/
       logger.info("Hello world API - HTTP 200")
       return {"message": "hello world"}
   
   # Enrich logging with contextual information from Lambda
   @logger.inject_lambda_context(correlation_id_path=correlation_paths.API_GATEWAY_REST)
   # Adding tracer
   # See: https://docs.aws.amazon.com/powertools/python/latest//latest/core/tracer/
   @tracer.capture_lambda_handler
   # ensures metrics are flushed upon request completion/failure and capturing ColdStart metric
   @metrics.log_metrics(capture_cold_start_metric=True)
   def lambda_handler(event: dict, context: LambdaContext) -> dict:
       return app.resolve(event, context)
   ```

1. **hello\$1world** 디렉터리를 엽니다. **hello\$1world\$1stack.py**라는 파일이 있어야 합니다.

   ```
   cd ..
   cd hello_world
   ```

1. **hello\$1world\$1stack.py**를 열고 파일에 다음 코드를 추가합니다. 여기에는 Lambda 함수를 생성하고, Powertools에 대한 환경 변수를 구성하고, 로그 보존을 1주일로 설정하는 [Lambda Constructor](https://docs.aws.amazon.com/cdk/api/v1/python/aws_cdk.aws_lambda.html)와 REST API를 생성하는 [ApiGatewayv1 Constructor](https://docs.aws.amazon.com/cdk/api/v1/python/aws_cdk.aws_apigateway.html)가 포함됩니다.

   ```
   from aws_cdk import (
       Stack,
       aws_apigateway as apigwv1,
       aws_lambda as lambda_,
       CfnOutput,
       Duration
   )
   from constructs import Construct
   
   class HelloWorldStack(Stack):
   
       def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
           super().__init__(scope, construct_id, **kwargs)
   
           # Powertools Lambda Layer
           powertools_layer = lambda_.LayerVersion.from_layer_version_arn(
               self,
               id="lambda-powertools",
               # Using AWS Lambda Powertools via Lambda Layer
               # This imports the Powertools layer which provides observability features for Lambda functions
               # For available versions, see: https://docs.aws.amazon.com/powertools/python/latest/#lambda-layer
           )
   
           function = lambda_.Function(self,
               'sample-app-lambda',
               runtime=lambda_.Runtime.PYTHON_3_9,
               layers=[powertools_layer],
               code = lambda_.Code.from_asset("./lambda_function/"),
               handler="app.lambda_handler",
               memory_size=128,
               timeout=Duration.seconds(3),
               architecture=lambda_.Architecture.X86_64,
               environment={
                   "POWERTOOLS_SERVICE_NAME": "PowertoolsHelloWorld",
                   "POWERTOOLS_METRICS_NAMESPACE": "PowertoolsSample",
                   "LOG_LEVEL": "INFO"
               }
           )
   
           apigw = apigwv1.RestApi(self, "PowertoolsAPI", deploy_options=apigwv1.StageOptions(stage_name="dev"))
   
           hello_api = apigw.root.add_resource("hello")
           hello_api.add_method("GET", apigwv1.LambdaIntegration(function, proxy=True))
   
           CfnOutput(self, "apiUrl", value=f"{apigw.url}hello")
   ```

1. 애플리케이션 배포

   ```
   cd ..
   cdk deploy
   ```

1. 배포된 애플리케이션의 URL을 가져옵니다.

   ```
   aws cloudformation describe-stacks --stack-name HelloWorldStack --query 'Stacks[0].Outputs[?OutputKey==`apiUrl`].OutputValue' --output text
   ```

1. API 엔드포인트 간접 호출:

   ```
   curl GET <URL_FROM_PREVIOUS_STEP>
   ```

   성공하면 다음과 같은 결과가 응답됩니다.

   ```
   {"message":"hello world"}
   ```

1. 함수에 대한 로그를 가져오려면 [sam logs](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-logs.html)를 실행합니다. 자세한 내용은 *AWS Serverless Application Model 개발자 안내서*에서 [로그 관련 작업](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-logging.html)을 참조하세요.

   ```
   sam logs --stack-name HelloWorldStack
   ```

   출력은 다음과 같습니다.

   ```
   2025/02/03/[$LATEST]ea9a64ec87294bf6bbc9026c05a01e04 2025-02-03T14:59:50.371000 INIT_START Runtime Version: python:3.9.v16    Runtime Version ARN: arn:aws:lambda:us-east-1::runtime:07a48df201798d627f2b950f03bb227aab4a655a1d019c3296406f95937e2525
   2025/02/03/[$LATEST]ea9a64ec87294bf6bbc9026c05a01e04 2025-02-03T14:59:51.112000 START RequestId: d455cfc4-7704-46df-901b-2a5cce9405be Version: $LATEST
   2025/02/03/[$LATEST]ea9a64ec87294bf6bbc9026c05a01e04 2025-02-03T14:59:51.114000 {
     "level": "INFO",
     "location": "hello:23",
       "message": "Hello world API - HTTP 200",
     "timestamp": "2025-02-03 14:59:51,113+0000",
     "service": "PowertoolsHelloWorld",
     "cold_start": true,
     "function_name": "sam-app-HelloWorldFunction-YBg8yfYtOc9j",
     "function_memory_size": "128",
     "function_arn": "arn:aws:lambda:us-east-1:111122223333:function:sam-app-HelloWorldFunction-YBg8yfYtOc9j",
     "function_request_id": "d455cfc4-7704-46df-901b-2a5cce9405be",
     "correlation_id": "e73f8aef-5e07-436e-a30b-63e4b23f0047",
     "xray_trace_id": "1-63dd2166-434a12c22e1307ff2114f299"
   }
   2025/02/03/[$LATEST]ea9a64ec87294bf6bbc9026c05a01e04 2025-02-03T14:59:51.126000 {
     "_aws": {
       "Timestamp": 1675436391126,
       "CloudWatchMetrics": [
         {
           "Namespace": "Powertools",
           "Dimensions": [
             [
               "function_name",
               "service"
             ]
           ],
           "Metrics": [
             {
               "Name": "ColdStart",
               "Unit": "Count"
             }
           ]
         }
       ]
     },
     "function_name": "sam-app-HelloWorldFunction-YBg8yfYtOc9j",
     "service": "PowertoolsHelloWorld",
     "ColdStart": [
       1.0
     ]
   }
   2025/02/03/[$LATEST]ea9a64ec87294bf6bbc9026c05a01e04 2025-02-03T14:59:51.126000 {
     "_aws": {
       "Timestamp": 1675436391126,
       "CloudWatchMetrics": [
         {
           "Namespace": "Powertools",
           "Dimensions": [
             [
               "service"
             ]
           ],
           "Metrics": [
             {
               "Name": "HelloWorldInvocations",
               "Unit": "Count"
             }
           ]
         }
       ]
     },
     "service": "PowertoolsHelloWorld",
     "HelloWorldInvocations": [
       1.0
     ]
   }
   2025/02/03/[$LATEST]ea9a64ec87294bf6bbc9026c05a01e04 2025-02-03T14:59:51.128000 END RequestId: d455cfc4-7704-46df-901b-2a5cce9405be
   2025/02/03/[$LATEST]ea9a64ec87294bf6bbc9026c05a01e04 2025-02-03T14:59:51.128000 REPORT RequestId: d455cfc4-7704-46df-901b-2a5cce9405be    Duration: 16.33 ms    Billed Duration: 756 ms    Memory Size: 128 MB    Max Memory Used: 64 MB    Init Duration: 739.46 ms    
   XRAY TraceId: 1-63dd2166-434a12c22e1307ff2114f299    SegmentId: 3c5d18d735a1ced0    Sampled: true
   ```

1. 이는 인터넷을 통해 액세스할 수 있는 퍼블릭 API 엔드포인트입니다. 테스트 후에는 엔드포인트를 삭제하는 것이 좋습니다.

   ```
   cdk destroy
   ```

# Python에서 AWS Lambda 함수 테스트
<a name="python-testing"></a>

**참고**  
서버리스 솔루션 테스트를 위한 기술 및 모범 사례에 대한 전체 소개는 [함수 테스트](testing-guide.md) 장을 참조하세요.

 서버리스 함수 테스트는 기존 테스트 유형과 기법을 사용하지만, 서버리스 애플리케이션을 전체적으로 테스트하는 것도 고려해야 합니다. 클라우드 기반 테스트는 함수와 서버리스 애플리케이션 모두의 품질을 **가장 정확하게** 측정합니다.

 서버리스 애플리케이션 아키텍처에는 API 호출을 통해 중요한 애플리케이션 기능을 제공하는 관리형 서비스가 포함됩니다. 따라서 개발 주기에는 함수와 서비스가 상호 작용할 때 기능을 확인하는 자동화된 테스트가 포함되어야 합니다.

 클라우드 기반 테스트를 생성하지 않으면 로컬 환경과 배포된 환경 간의 차이로 인해 문제가 발생할 수 있습니다. 지속적 통합 프로세스는 QA, 스테이징 또는 프로덕션과 같은 다음 배포 환경으로 코드를 승격하기 전에 클라우드에서 프로비저닝되는 리소스 제품군을 대상으로 테스트를 실행해야 합니다.

 이 짧은 안내서를 계속 읽고 서버리스 애플리케이션의 테스트 전략에 대해 알아보거나 [Serverless Test Samples 리포지토리](https://github.com/aws-samples/serverless-test-samples)를 방문하여 선택한 언어 및 런타임과 관련된 실제 예제를 자세히 살펴보세요.

 ![\[illustration showing the relationship between types of tests\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/test-type-illustration2.png) 

 서버리스 테스트의 경우에도 *단위*, *통합* 및 *엔드 투 엔드* 테스트를 작성합니다.
+ **단위 테스트** - 격리된 코드 블록에 대해 실행되는 테스트입니다. 예를 들어, 특정 항목과 대상에 대한 배송료를 계산하는 비즈니스 로직을 확인합니다.
+ **통합 테스트** - 일반적으로 클라우드 환경에서 상호 작용하는 둘 이상의 구성 요소 또는 서비스를 포함하는 테스트입니다. 예를 들어, 함수가 대기열에서 이벤트를 처리하는지 확인합니다.
+ **엔드 투 엔드 테스트** - 전체 애플리케이션의 동작을 확인하는 테스트입니다. 예를 들어, 인프라가 올바르게 설정되어 있고 고객의 주문 기록을 위해 예상대로 서비스 간에 이벤트가 흐르는지 확인합니다.

## 서버리스 애플리케이션 테스트
<a name="python-testing-techniques-for-serverless-applications"></a>

 일반적으로 다양한 접근 방식을 사용하여 클라우드에서 테스트, 모의 객체로 테스트, 에뮬레이터로 테스트 등의 서버리스 애플리케이션 코드 테스트를 수행합니다.

### 클라우드에서 테스트
<a name="python-testing-in-the-cloud"></a>

 클라우드에서 테스트는 단위 테스트, 통합 테스트, 엔드 투 엔드 테스트 등의 모든 테스트 단계에서 중요합니다. 클라우드에 배포되고 클라우드 기반 서비스와 상호 작용하는 코드에 대해 테스트를 실행합니다. 이 접근 방식은 코드 품질을 **가장 정확하게** 측정합니다.

 클라우드에서 Lambda 함수를 디버깅하는 편리한 방법은 테스트 이벤트와 콘솔을 이용하는 것입니다. *테스트 이벤트*는 함수에 대한 JSON 입력입니다. 함수에 입력이 필요하지 않은 경우 이벤트는 빈 JSON 문서(`({})`)가 될 수 있습니다. 콘솔은 다양한 서비스 통합을 위한 샘플 이벤트를 제공합니다. 콘솔에서 이벤트를 생성한 후 팀과 공유하여 테스트를 더 쉽고 일관성 있게 만들 수 있습니다.

**참고**  
[콘솔에서 함수를 테스트](testing-functions.md)하는 것이 빠르게 시작할 수 있는 방법이지만 테스트 주기를 자동화하면 애플리케이션 품질과 개발 속도가 보장됩니다.

### 테스트 도구
<a name="python-testing-tools"></a>

 개발 피드백 루프를 가속화하기 위한 도구와 기법이 있습니다. 예를 들어, [AWS SAM Accelerate](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/accelerate.html)와 [AWS CDK 감시 모드](https://docs.aws.amazon.com/cdk/v2/guide/cli.html#cli-deploy-watch) 모두 클라우드 환경을 업데이트하는 데 필요한 시간을 줄입니다.

[Moto](https://pypi.org/project/moto/)는 데코레이터로 응답을 가로채고 시뮬레이션하는 함수를 거의 또는 전혀 수정하지 않고 테스트할 수 있도록 AWS 서비스 및 리소스를 모의하는 데 사용하는 Python 라이브러리입니다.

 [Powertools for AWS Lambda(Python)](https://docs.powertools.aws.dev/lambda-python/latest/utilities/validation/)의 검증 기능은 데코레이터를 제공하므로 Python 함수의 입력 이벤트와 출력 응답을 검증할 수 있습니다.

 자세한 내용은 블로그 게시물 [Unit Testing Lambda with Python and Mock AWS Services](https://aws.amazon.com/blogs/devops/unit-testing-aws-lambda-with-python-and-mock-aws-services/)를 참조하세요.

 클라우드 배포 반복 관련 대기 시간을 줄이려면 [AWS Serverless Application Model (AWS SAM) Accelerate](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/using-sam-cli-sync.html), [AWS Cloud Development Kit (AWS CDK) watch mode](https://docs.aws.amazon.com/cdk/v2/guide/cli.html#cli-deploy-watch)를 참조하세요. 이러한 도구는 인프라와 코드의 변경 사항을 모니터링합니다. 클라우드 환경에 증분적 업데이트를 자동으로 생성하고 배포하여 이러한 변화에 대응합니다.

 이러한 도구를 사용하는 예제는 [Python Test Samples](https://github.com/aws-samples/serverless-test-samples/tree/main/python-test-samples) 코드 리포지토리에서 사용할 수 있습니다.

# AWS Lambda에서 Python 코드 계측
<a name="python-tracing"></a>

Lambda는 AWS X-Ray와 통합되어 Lambda 애플리케이션을 추적, 디버깅 및 최적화할 수 있습니다. Lambda 함수와 기타 AWS 서비스를 포함할 수 있는 애플리케이션의 리소스를 탐색할 때 X-Ray를 사용하여 요청을 추적할 수 있습니다.

추적 데이터를 X-Ray로 전송하려면 다음 세 SDK 라이브러리 중 하나를 사용할 수 있습니다.
+ [AWS Distro for OpenTelemetry(ADOT)](https://aws.amazon.com/otel) - 안전하게 프로덕션 준비가 된 AWS에서 지원하는 OpenTelemetry(OTEL) SDK의 배포입니다.
+ [AWS X-Ray SDK for Python](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-python.html) — 추적 데이터를 생성하고 X-Ray에 전송하는 SDK입니다.
+ [Powertools for AWS Lambda(Python)](https://docs.aws.amazon.com/powertools/python/latest/) - 서버리스 모범 사례를 구현하고 개발자 속도를 높이기 위한 개발자 도구 키트입니다.

각 SDK는 텔레메트리 데이터를 X-Ray 서비스로 전송하는 방법을 제공합니다. X-Ray를 사용하여 애플리케이션의 성능 지표를 확인하고, 필터링하고, 인사이트를 얻어 문제와 최적화 기회를 식별할 수 있습니다.

**중요**  
X-Ray와 Powertools for AWS Lambda SDK는 AWS에서 제공하는 긴밀하게 통합된 계측 솔루션의 일부입니다. ADOT Lambda Layer는 일반적으로 더 많은 데이터를 수집하는 추적 계측기에 대한 전체 업계 표준의 일부이지만 모든 사용 사례에 적합하지는 않을 수 있습니다. 어떤 솔루션을 사용하든 X-Ray에서 엔드 투 엔드 추적 기능을 구현할 수 있습니다. 둘 중 하나를 선택하는 방법에 대해 자세히 알아보려면 [AWS Distro for Open Telemetry와 X-Ray SDK 중에서 선택하기](https://docs.aws.amazon.com/xray/latest/devguide/xray-instrumenting-your-app.html#xray-instrumenting-choosing)를 참조하세요.

**Topics**
+ [추적에 Powertools for AWS Lambda(Python) 및 AWS SAM 사용](#python-tracing-sam)
+ [추적에 Powertools for AWS Lambda(Python) 및 AWS CDK 사용](#python-logging-cdk)
+ [ADOT를 사용하여 Python 함수 계측](#python-adot)
+ [X-Ray SDK를 사용하여 Python 함수 계측](#python-xray-sdk)
+ [Lambda 콘솔을 사용하여 추적 활성화](#python-tracing-console)
+ [Lambda API를 사용하여 추적 활성화](#python-tracing-api)
+ [CloudFormation을 사용하여 추적 활성화](#python-tracing-cloudformation)
+ [X-Ray 추적 해석](#python-tracing-interpretation)
+ [계층에 런타임 종속성 저장(X-Ray SDK)](#python-tracing-layers)

## 추적에 Powertools for AWS Lambda(Python) 및 AWS SAM 사용
<a name="python-tracing-sam"></a>

다음 단계에 따라 AWS SAM를 사용하여 통합 [Powertools for AWS Lambda(Python)](https://docs.powertools.aws.dev/lambda-python) 모듈이 포함된 샘플 Hello World Python 애플리케이션을 다운로드, 빌드 및 배포합니다. 이 애플리케이션은 기본 API 백엔드를 구현하고 Powertools를 사용하여 로그, 지표 및 추적을 내보냅니다. 이 구성에는 Amazon API Gateway 엔드포인트와 Lambda 함수가 포함됩니다. API Gateway 엔드포인트로 GET 요청을 전송하면 Lambda 함수가 간접 호출되고 Embedded Metric Format을 사용하여 로그 및 지표를 CloudWatch로 전송하고 기록을 AWS X-Ray로 전송합니다. 함수가 hello world 메시지를 반환합니다.

**사전 조건**

이 섹션의 단계를 완료하려면 다음이 필요합니다.
+ Python 3.11
+ [AWS CLI 버전 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [AWS SAM CLI 버전 1.75 이상](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html). 이전 버전의 AWS SAM CLI가 있는 경우 [AWS SAM CLI 업그레이드](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/manage-sam-cli-versions.html#manage-sam-cli-versions-upgrade)를 참조하세요.

**샘플 AWS SAM 애플리케이션 배포**

1. Hello World Python 템플릿을 사용하여 애플리케이션을 초기화합니다.

   ```
   sam init --app-template hello-world-powertools-python --name sam-app --package-type Zip --runtime python3.11 --no-tracing
   ```

1. 앱을 빌드합니다.

   ```
   cd sam-app && sam build
   ```

1. 앱을 배포합니다.

   ```
   sam deploy --guided
   ```

1. 화면에 표시되는 프롬프트를 따릅니다. 대화형 환경에서 제공되는 기본 옵션을 수락하려면 `Enter`을 누릅니다.
**참고**  
**HelloWorldFunction에 권한 부여가 정의되어 있지 않을 수 있습니다. 괜찮습니다?**에 대해 `y`를 입력합니다.

1. 배포된 애플리케이션의 URL을 가져옵니다.

   ```
   aws cloudformation describe-stacks --stack-name sam-app --query 'Stacks[0].Outputs[?OutputKey==`HelloWorldApi`].OutputValue' --output text
   ```

1. API 엔드포인트 간접 호출:

   ```
   curl -X GET <URL_FROM_PREVIOUS_STEP>
   ```

   성공하면 다음과 같은 결과가 응답됩니다.

   ```
   {"message":"hello world"}
   ```

1. 함수에 대한 트레이스를 가져오려면 [sam traces](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-traces.html)를 실행합니다.

   ```
   sam traces
   ```

   추적 출력은 다음과 같습니다.

   ```
   New XRay Service Graph
     Start time: 2023-02-03 14:59:50+00:00
     End time: 2023-02-03 14:59:50+00:00
     Reference Id: 0 - (Root) AWS::Lambda - sam-app-HelloWorldFunction-YBg8yfYtOc9j - Edges: [1]
      Summary_statistics:
        - total requests: 1
        - ok count(2XX): 1
        - error count(4XX): 0
        - fault count(5XX): 0
        - total response time: 0.924
     Reference Id: 1 - AWS::Lambda::Function - sam-app-HelloWorldFunction-YBg8yfYtOc9j - Edges: []
      Summary_statistics:
        - total requests: 1
        - ok count(2XX): 1
        - error count(4XX): 0
        - fault count(5XX): 0
        - total response time: 0.016
     Reference Id: 2 - client - sam-app-HelloWorldFunction-YBg8yfYtOc9j - Edges: [0]
      Summary_statistics:
        - total requests: 0
        - ok count(2XX): 0
        - error count(4XX): 0
        - fault count(5XX): 0
        - total response time: 0
   
   XRay Event [revision 1] at (2023-02-03T14:59:50.204000) with id (1-63dd2166-434a12c22e1307ff2114f299) and duration (0.924s)
    - 0.924s - sam-app-HelloWorldFunction-YBg8yfYtOc9j [HTTP: 200]
    - 0.016s - sam-app-HelloWorldFunction-YBg8yfYtOc9j
      - 0.739s - Initialization
      - 0.016s - Invocation
        - 0.013s - ## lambda_handler
          - 0.000s - ## app.hello
      - 0.000s - Overhead
   ```

1. 이는 인터넷을 통해 액세스할 수 있는 퍼블릭 API 엔드포인트입니다. 테스트 후에는 엔드포인트를 삭제하는 것이 좋습니다.

   ```
   sam delete
   ```

X-Ray는 애플리케이션에 대한 모든 요청을 추적하지 않습니다. X-Ray는 모든 요청의 대표 샘플을 여전히 제공하면서 추적이 효율적으로 수행되도록 샘플링 알고리즘을 적용합니다. 샘플링 요율은 초당 요청이 1개이며 추가 요청의 5퍼센트입니다. 함수에 대해 X-Ray 샘플링 요율을 구성할 수 없습니다.

## 추적에 Powertools for AWS Lambda(Python) 및 AWS CDK 사용
<a name="python-logging-cdk"></a>

다음 단계에 따라 AWS CDK를 사용하여 통합 [Powertools for AWS Lambda(Python)](https://docs.powertools.aws.dev/lambda-python) 모듈이 포함된 샘플 Hello World Python 애플리케이션을 다운로드, 빌드 및 배포합니다. 이 애플리케이션은 기본 API 백엔드를 구현하고 Powertools를 사용하여 로그, 지표 및 추적을 내보냅니다. 이 구성에는 Amazon API Gateway 엔드포인트와 Lambda 함수가 포함됩니다. API Gateway 엔드포인트로 GET 요청을 전송하면 Lambda 함수가 간접 호출되고 Embedded Metric Format을 사용하여 로그 및 지표를 CloudWatch로 전송하고 기록을 AWS X-Ray로 전송합니다. 함수가 hello world 메시지를 반환합니다.

**사전 조건**

이 섹션의 단계를 완료하려면 다음이 필요합니다.
+ Python 3.11
+ [AWS CLI 버전 2](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)
+ [AWS CDK 버전 2](https://docs.aws.amazon.com/cdk/v2/guide/getting_started.html#getting_started_prerequisites)
+ [AWS SAM CLI 버전 1.75 이상](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-install.html). 이전 버전의 AWS SAM CLI가 있는 경우 [AWS SAM CLI 업그레이드](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/manage-sam-cli-versions.html#manage-sam-cli-versions-upgrade)를 참조하세요.

**샘플 AWS CDK 애플리케이션 배포**

1. 새 애플리케이션용 프로젝트 디렉터리를 생성합니다.

   ```
   mkdir hello-world
   cd hello-world
   ```

1. 앱을 초기화합니다.

   ```
   cdk init app --language python
   ```

1.  Python 종속 구성 요소를 설치합니다.

   ```
   pip install -r requirements.txt
   ```

1. 루트 폴더 아래에 **lambda\$1function** 디렉터리를 생성합니다.

   ```
   mkdir lambda_function
   cd lambda_function
   ```

1. 파일 **app.py**를 생성하고 파일에 다음 코드를 추가합니다. Lambda 함수에 대한 코드입니다.

   ```
   from aws_lambda_powertools.event_handler import APIGatewayRestResolver
   from aws_lambda_powertools.utilities.typing import LambdaContext
   from aws_lambda_powertools.logging import correlation_paths
   from aws_lambda_powertools import Logger
   from aws_lambda_powertools import Tracer
   from aws_lambda_powertools import Metrics
   from aws_lambda_powertools.metrics import MetricUnit
   
   app = APIGatewayRestResolver()
   tracer = Tracer()
   logger = Logger()
   metrics = Metrics(namespace="PowertoolsSample")
   
   @app.get("/hello")
   @tracer.capture_method
   def hello():
       # adding custom metrics
       # See: https://docs.powertools.aws.dev/lambda-python/latest/core/metrics/
       metrics.add_metric(name="HelloWorldInvocations", unit=MetricUnit.Count, value=1)
   
       # structured log
       # See: https://docs.powertools.aws.dev/lambda-python/latest/core/logger/
       logger.info("Hello world API - HTTP 200")
       return {"message": "hello world"}
   
   # Enrich logging with contextual information from Lambda
   @logger.inject_lambda_context(correlation_id_path=correlation_paths.API_GATEWAY_REST)
   # Adding tracer
   # See: https://docs.powertools.aws.dev/lambda-python/latest/core/tracer/
   @tracer.capture_lambda_handler
   # ensures metrics are flushed upon request completion/failure and capturing ColdStart metric
   @metrics.log_metrics(capture_cold_start_metric=True)
   def lambda_handler(event: dict, context: LambdaContext) -> dict:
       return app.resolve(event, context)
   ```

1. **hello\$1world** 디렉터리를 엽니다. **hello\$1world\$1stack.py**라는 파일이 있어야 합니다.

   ```
   cd ..
   cd hello_world
   ```

1. **hello\$1world\$1stack.py**를 열고 파일에 다음 코드를 추가합니다. 여기에는 Lambda 함수를 생성하고, Powertools에 대한 환경 변수를 구성하고, 로그 보존을 1주일로 설정하는 [Lambda Constructor](https://docs.aws.amazon.com/cdk/api/v1/python/aws_cdk.aws_lambda.html)와 REST API를 생성하는 [ApiGatewayv1 Constructor](https://docs.aws.amazon.com/cdk/api/v1/python/aws_cdk.aws_apigateway.html)가 포함됩니다.

   ```
   from aws_cdk import (
       Stack,
       aws_apigateway as apigwv1,
       aws_lambda as lambda_,
       CfnOutput,
       Duration
   )
   from constructs import Construct
   
   class HelloWorldStack(Stack):
   
       def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None:
           super().__init__(scope, construct_id, **kwargs)
   
           # Powertools Lambda Layer
           powertools_layer = lambda_.LayerVersion.from_layer_version_arn(
               self,
               id="lambda-powertools",
               # At the moment we wrote this example, the aws_lambda_python_alpha CDK constructor is in Alpha, o we use layer to make the example simpler
               # See https://docs.aws.amazon.com/cdk/api/v2/python/aws_cdk.aws_lambda_python_alpha/README.html
               # Check all Powertools layers versions here: https://docs.powertools.aws.dev/lambda-python/latest/#lambda-layer
               layer_version_arn=f"arn:aws:lambda:{self.region}:017000801446:layer:AWSLambdaPowertoolsPythonV2:21"
           )
   
           function = lambda_.Function(self,
               'sample-app-lambda',
               runtime=lambda_.Runtime.PYTHON_3_11,
               layers=[powertools_layer],
               code = lambda_.Code.from_asset("./lambda_function/"),
               handler="app.lambda_handler",
               memory_size=128,
               timeout=Duration.seconds(3),
               architecture=lambda_.Architecture.X86_64,
               environment={
                   "POWERTOOLS_SERVICE_NAME": "PowertoolsHelloWorld",
                   "POWERTOOLS_METRICS_NAMESPACE": "PowertoolsSample",
                   "LOG_LEVEL": "INFO"
               }
           )
   
           apigw = apigwv1.RestApi(self, "PowertoolsAPI", deploy_options=apigwv1.StageOptions(stage_name="dev"))
   
           hello_api = apigw.root.add_resource("hello")
           hello_api.add_method("GET", apigwv1.LambdaIntegration(function, proxy=True))
   
           CfnOutput(self, "apiUrl", value=f"{apigw.url}hello")
   ```

1. 애플리케이션 배포

   ```
   cd ..
   cdk deploy
   ```

1. 배포된 애플리케이션의 URL을 가져옵니다.

   ```
   aws cloudformation describe-stacks --stack-name HelloWorldStack --query 'Stacks[0].Outputs[?OutputKey==`apiUrl`].OutputValue' --output text
   ```

1. API 엔드포인트 간접 호출:

   ```
   curl -X GET <URL_FROM_PREVIOUS_STEP>
   ```

   성공하면 다음과 같은 결과가 응답됩니다.

   ```
   {"message":"hello world"}
   ```

1. 함수에 대한 트레이스를 가져오려면 [sam traces](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-cli-command-reference-sam-traces.html)를 실행합니다.

   ```
   sam traces
   ```

   기록 출력은 다음과 같습니다.

   ```
   New XRay Service Graph
     Start time: 2023-02-03 14:59:50+00:00
     End time: 2023-02-03 14:59:50+00:00
     Reference Id: 0 - (Root) AWS::Lambda - sam-app-HelloWorldFunction-YBg8yfYtOc9j - Edges: [1]
      Summary_statistics:
        - total requests: 1
        - ok count(2XX): 1
        - error count(4XX): 0
        - fault count(5XX): 0
        - total response time: 0.924
     Reference Id: 1 - AWS::Lambda::Function - sam-app-HelloWorldFunction-YBg8yfYtOc9j - Edges: []
      Summary_statistics:
        - total requests: 1
        - ok count(2XX): 1
        - error count(4XX): 0
        - fault count(5XX): 0
        - total response time: 0.016
     Reference Id: 2 - client - sam-app-HelloWorldFunction-YBg8yfYtOc9j - Edges: [0]
      Summary_statistics:
        - total requests: 0
        - ok count(2XX): 0
        - error count(4XX): 0
        - fault count(5XX): 0
        - total response time: 0
   
   XRay Event [revision 1] at (2023-02-03T14:59:50.204000) with id (1-63dd2166-434a12c22e1307ff2114f299) and duration (0.924s)
    - 0.924s - sam-app-HelloWorldFunction-YBg8yfYtOc9j [HTTP: 200]
    - 0.016s - sam-app-HelloWorldFunction-YBg8yfYtOc9j
      - 0.739s - Initialization
      - 0.016s - Invocation
        - 0.013s - ## lambda_handler
          - 0.000s - ## app.hello
      - 0.000s - Overhead
   ```

1. 이는 인터넷을 통해 액세스할 수 있는 퍼블릭 API 엔드포인트입니다. 테스트 후에는 엔드포인트를 삭제하는 것이 좋습니다.

   ```
   cdk destroy
   ```

## ADOT를 사용하여 Python 함수 계측
<a name="python-adot"></a>

ADOT는 OTel SDK를 사용하여 원격 측정 데이터를 수집하는 데 필요한 모든 것을 패키징할 수 있는 완전 관리형 Lambda [계층](chapter-layers.md)을 제공합니다. 이 계층을 사용하면 모든 함수 코드를 수정하지 않고도 Lambda 함수를 계측할 수 있습니다. 계층을 구성하여 OTel의 사용자 지정 초기화를 수행할 수도 있습니다. 자세한 내용은 ADOT 설명서의 [Lambda에서 ADOT 컬렉터에 대한 사용자 지정 구성](https://aws-otel.github.io/docs/getting-started/lambda#custom-configuration-for-the-adot-collector-on-lambda)을 참조하세요.

Python 런타임의 경우 **ADOT Python용 AWS 관리형 Lambda 계층**을 추가하여 함수를 자동으로 계측할 수 있습니다. 이 계층은 arm64 및 x86\$164 아키텍처 모두에서 작동합니다. 이 계층을 추가하는 방법에 대한 자세한 지침은 ADOT 설명서의 [AWS Distro for OpenTelemetry Lambda Support for Python](https://aws-otel.github.io/docs/getting-started/lambda/lambda-python)을 참조하세요.

## X-Ray SDK를 사용하여 Python 함수 계측
<a name="python-xray-sdk"></a>

Lambda 함수가 애플리케이션의 다른 리소스에 대해 수행하는 호출에 대한 세부 정보를 기록하려면 AWS X-Ray SDK for Python를 사용할 수도 있습니다. SDK를 가져오려면 애플리케이션의 종속성에 `aws-xray-sdk` 패키지를 추가합니다.

**Example [requirements.txt](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/blank-python/function/requirements.txt)**  

```
jsonpickle==1.3
aws-xray-sdk==2.4.3
```

함수 코드에서 `boto3` 라이브러리를 `aws_xray_sdk.core` 모듈로 패치하여 AWS SDK 클라이언트를 계측할 수 있습니다.

**Example [함수 — AWS SDK 클라이언트 추적](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/blank-python/function/lambda_function.py)**  

```
import boto3
from aws_xray_sdk.core import xray_recorder
from aws_xray_sdk.core import patch_all

logger = logging.getLogger()
logger.setLevel(logging.INFO)
patch_all()

client = boto3.client('lambda')
client.get_account_settings()

def lambda_handler(event, context):
    logger.info('## ENVIRONMENT VARIABLES\r' + jsonpickle.encode(dict(**os.environ)))
  ...
```

올바른 종속성을 추가하고 필요한 코드를 변경한 후 Lambda 콘솔 또는 API를 통해 함수의 구성에서 추적을 활성화합니다.

## Lambda 콘솔을 사용하여 추적 활성화
<a name="python-tracing-console"></a>

콘솔을 사용하여 Lambda 함수에 대한 활성 추적을 전환하려면 다음 단계를 따르십시오.

**활성 추적 켜기**

1. Lambda 콘솔의 [함수 페이지](https://console.aws.amazon.com/lambda/home#/functions)를 엽니다.

1. 함수를 선택합니다.

1. **구성(Configuration)**을 선택한 다음 **모니터링 및 운영 도구(Monitoring and operations tools)**를 선택합니다.

1. **추가 모니터링 도구**에서 **편집**을 선택합니다.

1. **CloudWatch 애플리케이션 신호 및 AWS X-Ray**에서 **Lambda 서비스 트레이스**에 대해 **활성화**를 선택합니다.

1. **저장**을 선택합니다.

## Lambda API를 사용하여 추적 활성화
<a name="python-tracing-api"></a>

AWS CLI 또는 AWS SDK를 사용하여 Lambda 함수에 대한 추적을 구성하고 다음 API 작업을 사용합니다.
+ [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html)
+ [GetFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html)
+ [CreateFunction](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html)

다음 예제 AWS CLI 명령은 **my-function**이라는 함수에 대한 활성 추적을 사용 설정합니다.

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

추적 모드는 함수 버전을 게시할 때 버전별 구성의 일부입니다. 게시된 버전에 대한 추적 모드는 변경할 수 없습니다.

## CloudFormation을 사용하여 추적 활성화
<a name="python-tracing-cloudformation"></a>

CloudFormation 템플릿에서 `AWS::Lambda::Function` 리소스에 대한 추적을 활성화하려면 `TracingConfig` 속성을 사용합니다.

**Example [function-inline.yml](https://github.com/awsdocs/aws-lambda-developer-guide/blob/master/templates/function-inline.yml) – 추적 구성**  

```
Resources:
  function:
    Type: [AWS::Lambda::Function](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-lambda-function.html)
    Properties:
      TracingConfig:
        Mode: Active
      ...
```

AWS Serverless Application Model(AWS SAM) `AWS::Serverless::Function` 리소스의 경우 `Tracing` 속성을 사용합니다.

**Example [template.yml](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/blank-nodejs/template.yml) – 추적 구성**  

```
Resources:
  function:
    Type: [AWS::Serverless::Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html)
    Properties:
      Tracing: Active
      ...
```

## X-Ray 추적 해석
<a name="python-tracing-interpretation"></a>

함수에 추적 데이터를 X-Ray로 업로드할 권한이 있어야 합니다. Lambda 콘솔에서 추적을 활성화하면 Lambda가 필요한 권한을 함수의 [실행 역할](lambda-intro-execution-role.md)에 추가합니다. 그렇지 않으면 실행 역할에 [AWSXRayDaemonWriteAccess](https://console.aws.amazon.com/iam/home#/policies/arn:aws:iam::aws:policy/AWSXRayDaemonWriteAccess) 정책을 추가합니다.

활성 추적을 구성하면 애플리케이션을 통해 특정 요청을 관찰할 수 있습니다. [ X-Ray 서비스 그래프](https://docs.aws.amazon.com/xray/latest/devguide/aws-xray.html#xray-concepts-servicegraph)는 애플리케이션 및 모든 구성 요소에 대한 정보를 보여줍니다. 다음 예제에서는 2개의 함수가 있는 애플리케이션을 보여줍니다. 기본 함수는 이벤트를 처리하고 때로는 오류를 반환합니다. 맨 위의 두 번째 함수는 첫 번째의 로그 그룹에 나타나는 오류를 처리하고 AWS SDK를 사용하여 X-Ray, Amazon Simple Storage Service(Amazon S3), Amazon CloudWatch Logs를 호출합니다.

![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/sample-errorprocessor-servicemap.png)


X-Ray는 애플리케이션에 대한 모든 요청을 추적하지 않습니다. X-Ray는 모든 요청의 대표 샘플을 여전히 제공하면서 추적이 효율적으로 수행되도록 샘플링 알고리즘을 적용합니다. 샘플링 요율은 초당 요청이 1개이며 추가 요청의 5퍼센트입니다. 함수에 대해 X-Ray 샘플링 요율을 구성할 수 없습니다.

X-Ray에서 *추적*은 하나 이상의 *서비스*에서 처리되는 요청에 대한 정보를 기록합니다. Lambda는 각 추적에 대해 2개의 세그먼트를 기록하고, 이에 따라 서비스 그래프에 2개의 노드가 생성됩니다. 다음 이미지에서는 이 두 노드를 강조 표시합니다.

![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/xray-servicemap-function.png)


왼쪽의 첫 번째 노드는 호출 요청을 수신하는 Lambda 서비스를 나타냅니다. 두 번째 노드는 특정 Lambda 함수를 나타냅니다. 다음 예에서는 이러한 2개의 세그먼트가 있는 추적을 보여줍니다. 둘 다 이름이 **my-function** 이지만 하나는 오리진이 `AWS::Lambda`이고 다른 하나는 오리진이 `AWS::Lambda::Function`입니다. `AWS::Lambda` 세그먼트에 오류가 표시되면 Lambda 서비스에 문제가 있는 것입니다. `AWS::Lambda::Function` 세그먼트에 오류가 표시되면 함수에 문제가 있는 것입니다.

![\[\]](http://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images/V2_sandbox_images/my-function-2-v1.png)


이 예제에서는 3개의 하위 세그먼트를 표시하도록 `AWS::Lambda::Function` 세그먼트를 확장합니다.

**참고**  
AWS는 현재 Lambda 서비스에 대한 변경 사항을 구현하고 있습니다. 이러한 변경으로 인해, AWS 계정의 여러 Lambda 함수에서 내보내는 시스템 로그 메시지와 추적 세그먼트의 구조와 내용 간에 약간의 차이가 있을 수 있습니다.  
여기에 표시된 예제 트레이스는 이전 스타일의 함수 세그먼트를 보여줍니다. 이전 스타일 세그먼트와 새로운 스타일 세그먼트의 차이점은 다음 단락들에 설명되어 있습니다.  
이러한 변경 사항은 앞으로 몇 주 동안 구현되며, 중국 및 GovCloud 리전을 제외한 모든 AWS 리전의 모든 기능은 새로운 형식의 로그 메시지 및 추적 세그먼트를 사용하도록 전환됩니다.

이전 스타일의 함수 세그먼트에는 다음과 같은 하위 세그먼트가 포함됩니다.
+ **초기화** – 함수를 로드하고 [초기화 코드](foundation-progmodel.md)를 실행하는 데 소요된 시간을 나타냅니다. 이 하위 세그먼트는 함수의 각 인스턴스에서 처리하는 첫 번째 이벤트에 대해서만 표시됩니다.
+ **호출**— 핸들러 코드를 실행하는 데 소요된 시간을 나타냅니다.
+ **오버헤드** – Lambda 런타임이 다음 이벤트를 처리하기 위해 준비하는 데 소비하는 시간을 나타냅니다.

새로운 스타일의 함수 세그먼트에는 `Invocation` 하위 세그먼트가 포함되지 않습니다. 대신, 고객 하위 세그먼트는 함수 세그먼트에 직접 연결됩니다. 이전 스타일과 새로운 스타일의 함수 세그먼트의 구조에 대한 자세한 내용은 [X-Ray 추적 이해](services-xray.md#services-xray-traces)를 참조하세요.

HTTP 클라이언트를 계측하고, SQL 쿼리를 기록하고, 주석 및 메타데이터가 있는 사용자 지정 하위 세그먼트를 생성할 수도 있습니다. 자세한 내용은 *AWS X-Ray 개발자 안내서*의 [AWS X-Ray SDK for Python](https://docs.aws.amazon.com/xray/latest/devguide/xray-sdk-python.html)를 참조하십시오.

**가격 책정**  
X-Ray 추적을 AWS 프리 티어의 일부로서 특정 한도까지 매월 무료로 사용할 수 있습니다. 해당 한도를 초과하면 추적 저장 및 검색에 대한 X-Ray 요금이 부과됩니다. 자세한 내용은 [AWS X-Ray 요금](https://aws.amazon.com/xray/pricing/)을 참조하십시오.

## 계층에 런타임 종속성 저장(X-Ray SDK)
<a name="python-tracing-layers"></a>

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

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

**Example [template.yml](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/blank-python/template.yml) – 종속성 계층**  

```
Resources:
  function:
    Type: [AWS::Serverless::Function](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html)
    Properties:
      CodeUri: function/.
      Tracing: Active
      Layers:
        - !Ref libs
      ...
  libs:
    Type: [AWS::Serverless::LayerVersion](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-layerversion.html)
    Properties:
      LayerName: blank-python-lib
      Description: Dependencies for the blank-python sample app.
      ContentUri: package/.
      CompatibleRuntimes:
        - python3.11
```

이 구성을 사용하면 런타임 종속성을 변경하는 경우 라이브러리 계층만 업데이트하면 됩니다. 함수 배포 패키지에는 코드만 포함되어 있으므로 이는 업로드 시간을 줄일 수 있습니다.

종속성 계층을 만들려면 배포 전에 계층 아카이브를 생성하기 위해 빌드를 변경해야 합니다. 사용 가능한 예제는 [blank-python](https://github.com/awsdocs/aws-lambda-developer-guide/tree/main/sample-apps/blank-python) 샘플 애플리케이션을 참조하십시오.