

# Lambda SnapStart 활성화 및 관리
<a name="snapstart-activate"></a>

SnapStart를 사용하려면 새 Lambda 함수 또는 기존 Lambda 함수에 대해 SnapStart를 활성화해야 합니다. 그런 다음 함수 버전을 게시하고 간접 호출합니다.

**Topics**
+ [SnapStart 활성화(콘솔)](#snapshot-console)
+ [SnapStart 활성화(AWS CLI)](#snapshot-cli)
+ [SnapStart 활성화(API)](#snapshot-api)
+ [Lambda SnapStart와 함수 상태](#snapstart-function-states)
+ [스냅샷 업데이트](#update-snapshot)
+ [AWS SDK를 통해 SnapStart 사용](#snapstart-credentials)
+ [CloudFormation, AWS SAM 및 AWS CDK에 SnapStart 사용](#snapstart-cfn-sam)
+ [스냅샷 삭제](#snapshot-delete)

## SnapStart 활성화(콘솔)
<a name="snapshot-console"></a>

**함수에 대해 SnapStart를 활성화하려면**

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

1. 함수의 이름을 선택합니다.

1. **Configuration**(구성)을 선택한 다음 **General configuration**(일반 구성)을 선택합니다.

1. **General configuration**(일반 구성) 창에서 **Edit**(편집)를 선택합니다.

1. **Edit basic settings**(기본 설정 편집) 페이지의 **SnapStart**에서 **Published versions**(게시된 버전)을 선택합니다.

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

1. [함수 버전을 게시합니다](configuration-versions.md#configuration-versions-config). Lambda는 코드를 초기화하고, 초기화된 실행 환경의 스냅샷을 생성한 다음, 액세스 지연 시간이 짧아지도록 스냅샷을 캐싱합니다.

1. [함수 버전을 간접 호출합니다](configuration-versions.md#versioning-versions-using).

## SnapStart 활성화(AWS CLI)
<a name="snapshot-cli"></a>

**기존 함수에 대해 SnapStart를 활성화하려면**

1. **--snap-start** 옵션과 함께 [update-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/update-function-configuration.html) 명령을 실행하여 함수 구성을 업데이트합니다.

   ```
   aws lambda update-function-configuration \
     --function-name my-function \
     --snap-start ApplyOn=PublishedVersions
   ```

1. [publish-version](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/publish-version.html) 명령을 사용하여 함수 버전을 게시합니다.

   ```
   aws lambda publish-version \
     --function-name my-function
   ```

1. [get-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/get-function-configuration.html) 명령을 실행하고 버전 번호를 지정하여 해당 함수 버전에 대해 SnapStart가 활성화되었는지 확인합니다. 다음은 버전 1을 지정하는 예입니다.

   ```
   aws lambda get-function-configuration \
     --function-name my-function:1
   ```

   응답에 [OptimizationStatus](https://docs.aws.amazon.com/lambda/latest/api/API_SnapStartResponse.html)가 `On`으로, [State](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html#lambda-GetFunctionConfiguration-response-State)가 `Active`로 표시되는 경우, SnapStart가 활성화되어 있는 것이며 지정된 함수 버전에 대한 스냅샷을 사용할 수 있습니다.

   ```
   "SnapStart": { 
       "ApplyOn": "PublishedVersions",
       "OptimizationStatus": "On"
    },
    "State": "Active",
   ```

1. [간접 호출](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/invoke.html) 명령을 실행하고 버전을 지정하여 함수 버전을 간접 호출합니다. 다음은 버전 1을 간접 호출하는 예입니다.

   ```
   aws lambda invoke \
     --cli-binary-format raw-in-base64-out \
     --function-name my-function:1 \
     --payload '{ "name": "Bob" }' \
     response.json
   ```

   **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에서 참조하세요.

**새 함수를 생성할 때 SnapStart를 활성화하려면**

1. **--snap-start** 옵션과 함께 [create-function](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/create-function.html) 명령을 실행하여 함수를 생성합니다. **--role**에 [실행 역할](lambda-intro-execution-role.md)의 Amazon 리소스 이름(ARN)을 지정합니다.

   ```
   aws lambda create-function \
     --function-name my-function \
     --runtime "java25" \
     --zip-file fileb://my-function.zip \
     --handler my-function.handler \
     --role arn:aws:iam::111122223333:role/lambda-ex \
     --snap-start ApplyOn=PublishedVersions
   ```

1. [publish-version](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/publish-version.html) 명령을 사용하여 버전을 생성합니다.

   ```
   aws lambda publish-version \
     --function-name my-function
   ```

1. [get-function-configuration](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/get-function-configuration.html) 명령을 실행하고 버전 번호를 지정하여 해당 함수 버전에 대해 SnapStart가 활성화되었는지 확인합니다. 다음은 버전 1을 지정하는 예입니다.

   ```
   aws lambda get-function-configuration \
     --function-name my-function:1
   ```

   응답에 [OptimizationStatus](https://docs.aws.amazon.com/lambda/latest/api/API_SnapStartResponse.html)가 `On`으로, [State](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html#lambda-GetFunctionConfiguration-response-State)가 `Active`로 표시되는 경우, SnapStart가 활성화되어 있는 것이며 지정된 함수 버전에 대한 스냅샷을 사용할 수 있습니다.

   ```
   "SnapStart": { 
        "ApplyOn": "PublishedVersions",
        "OptimizationStatus": "On"
     },
     "State": "Active",
   ```

1. [간접 호출](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/invoke.html) 명령을 실행하고 버전을 지정하여 함수 버전을 간접 호출합니다. 다음은 버전 1을 간접 호출하는 예입니다.

   ```
   aws lambda invoke \
     --cli-binary-format raw-in-base64-out \
     --function-name my-function:1 \
     --payload '{ "name": "Bob" }' \
     response.json
   ```

   **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에서 참조하세요.

## SnapStart 활성화(API)
<a name="snapshot-api"></a>

**SnapStart를 활성화하려면**

1. 다음 중 하나를 수행하세요.
   + [CreateFunction](https://docs.aws.amazon.com/lambda/latest/api/API_CreateFunction.html) API 작업을 [SnapStart](https://docs.aws.amazon.com/lambda/latest/api/API_SnapStart.html) 파라미터와 함께 사용하여 SnapStart가 활성화된 상탤 새 함수를 생성합니다.
   + [UpdateFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_UpdateFunctionConfiguration.html) 작업을 [SnapStart](https://docs.aws.amazon.com/lambda/latest/api/API_SnapStart.html) 파라미터와 함께 사용하여 기존 함수에 대해 SnapStart를 활성화합니다.

1. [PublishVersion](https://docs.aws.amazon.com/lambda/latest/api/API_PublishVersion.html) 작업을 사용하여 함수 버전을 게시합니다. Lambda는 코드를 초기화하고, 초기화된 실행 환경의 스냅샷을 생성한 다음, 액세스 지연 시간이 짧아지도록 스냅샷을 캐싱합니다.

1. [GetFunctionConfiguration](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html) 작업을 사용하여 해당 함수 버전에 대해 SnapStart가 활성화되어 있는지 확인합니다. 버전 번호를 지정하여 해당 버전에 SnapStart가 활성화되어 있는지 확인합니다. 응답에 [OptimizationStatus](https://docs.aws.amazon.com/lambda/latest/api/API_SnapStartResponse.html)가 `On`으로, [State](https://docs.aws.amazon.com/lambda/latest/api/API_GetFunctionConfiguration.html#lambda-GetFunctionConfiguration-response-State)가 `Active`로 표시되는 경우, SnapStart가 활성화되어 있는 것이며 지정된 함수 버전에 대한 스냅샷을 사용할 수 있습니다.

   ```
   "SnapStart": { 
           "ApplyOn": "PublishedVersions",
           "OptimizationStatus": "On"
        },
        "State": "Active",
   ```

1. [간접 호출](https://docs.aws.amazon.com/lambda/latest/api/API_Invoke.html) 작업을 사용하여 함수 버전을 간접 호출합니다.

## Lambda SnapStart와 함수 상태
<a name="snapstart-function-states"></a>

SnapStart를 사용할 때 다음과 같은 함수 상태가 발생할 수 있습니다.

**보류 중**  
Lambda에서 코드를 초기화하고 초기화된 실행 환경의 스냅샷을 생성하고 있습니다. 해당 함수 버전에서 작동하는 호출 또는 기타 API 작업은 실패합니다.

**활성**  
스냅샷 생성이 완료되었으며, 함수를 간접 호출할 수 있습니다. SnapStart를 사용하려면 게시되지 않은 버전(\$1LATEST)이 아니라 게시된 함수 버전을 간접 호출해야 합니다.

**비활성**  
Lambda가 함수 스냅샷을 주기적으로 재생성하여 소프트웨어 업데이트를 적용할 때 `Inactive` 상태가 발생할 수 있습니다. 이 경우 함수 초기화에 실패할 경우 함수가 `Inactive` 상태에 들어갈 수 있습니다.  
Java 런타임을 사용하는 기능의 경우, Lambda에서 간접 호출 없이 14일 후에 스냅샷을 삭제합니다. 14일이 지난 후에 함수 버전을 호출하면 Lambda는 `SnapStartNotReadyException` 응답을 반환하고 새 스냅샷을 초기화하기 시작합니다. 함수 버전이 `Active` 상태에 도달할 때까지 기다린 후 다시 간접 호출하세요.

**Failed**  
초기화 코드를 실행하거나 스냅샷을 생성하는 경우 Lambda에서 오류가 발생했습니다.

## 스냅샷 업데이트
<a name="update-snapshot"></a>

Lambda는 게시된 각 함수 버전마다 스냅샷을 생성합니다. 스냅샷을 업데이트하려면 새 함수 버전을 게시합니다.

## AWS SDK를 통해 SnapStart 사용
<a name="snapstart-credentials"></a>

함수에서 AWS SDK를 호출하기 위해 Lambda는 함수의 실행 역할을 가정하여 휘발성 자격 증명 세트를 생성합니다. 이러한 보안 인증 정보는 함수를 호출할 때 환경 변수로 사용할 수 있습니다. 코드에서 직접 SDK의 보안 인증 정보를 제공할 필요가 없습니다. 기본적으로 보안 인증 공급자 체인은 사용자가 보안 인증 정보를 설정할 수 있는 각 위치를 순차적으로 확인하고, 일반적으로 환경 변수(`AWS_ACCESS_KEY_ID`, `AWS_SECRET_ACCESS_KEY` 및 `AWS_SESSION_TOKEN`)인 사용 가능한 첫 번째 위치를 선택합니다.

**참고**  
SnapStart가 활성화되면 Lambda 런타임은 자동으로 액세스 키 환경 변수 대신 컨테이너 자격 증명(`AWS_CONTAINER_CREDENTIALS_FULL_URI` 및 `AWS_CONTAINER_AUTHORIZATION_TOKEN`)을 사용합니다. 따라서 함수가 복원되기 전에 보안 인증 정보가 만료되지 않습니다.

## CloudFormation, AWS SAM 및 AWS CDK에 SnapStart 사용
<a name="snapstart-cfn-sam"></a>
+ **AWS CloudFormation:** 템플릿에서 [SnapStart](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-lambda-function-snapstart.html) 엔터티를 선언합니다.
+ **AWS Serverless Application Model(AWS SAM):** 템플릿에서 [SnapStart](https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/sam-resource-function.html#sam-function-snapstart) 속성을 선언합니다.
+ **AWS Cloud Development Kit (AWS CDK):** [SnapStartProperty](https://docs.aws.amazon.com/cdk/api/v2/java/software/amazon/awscdk/services/lambda/CfnFunction.SnapStartProperty.html) 유형을 사용합니다.

## 스냅샷 삭제
<a name="snapshot-delete"></a>

Lambda는 다음 경우에 스냅샷을 삭제합니다.
+ 함수 또는 함수 버전을 삭제한 경우.
+ **Java 런타임만 해당** - 14일 동안 함수 버전을 간접 호출하지 않습니다. 호출 없이 14일이 지나면 함수 버전이 [비활성](#snapstart-function-states) 상태로 전환됩니다. 14일이 지난 후에 함수 버전을 간접 호출하면 Lambda는 `SnapStartNotReadyException` 응답을 반환하고 새 스냅샷을 초기화하기 시작합니다. 함수 버전이 [활성](#snapstart-function-states) 상태에 도달할 때까지 기다린 후 다시 간접 호출하세요.

Lambda는 일반 데이터 보호 규정(GDPR)에 따라, 삭제된 스냅샷에 연결된 모든 리소스를 제거합니다.