

# 함수 테스트
<a name="test-function"></a>

라이브 스테이지(프로덕션)에 함수를 배포하기 전에 함수를 테스트하여 의도한 대로 작동하는지 확인할 수 있습니다. 함수를 테스트하려면 CloudFront 배포가 프로덕션 환경에서 수신할 수 있는 HTTP 요청 또는 응답을 나타내는 *이벤트 객체*를 지정합니다.

CloudFront 함수는 다음을 수행합니다.

1. 제공된 이벤트 객체를 입력으로 사용하여 함수를 실행합니다.

1. 함수 로그 또는 오류 메시지 및 함수의 *컴퓨팅 사용률*과 함께 함수의 결과(수정된 이벤트 객체)를 반환합니다. 컴퓨팅 사용률에 대한 자세한 내용은 [컴퓨팅 활용 이해](#compute-utilization) 섹션을 참조하세요.

**참고**  
함수를 테스트할 때 CloudFront는 함수 실행 오류에 대해서만 검증합니다. CloudFront는 요청이 게시된 후 성공적으로 전달되는지 여부를 검증하지 않습니다. 예를 들어 함수가 필수 헤더를 삭제하면 코드에 문제가 없기 때문에 테스트가 성공합니다. 그러나 함수를 게시하고 배포와 연결하면 CloudFront를 통해 요청이 이루어질 때 함수가 실패합니다.

**Contents**
+ [이벤트 객체 설정](#test-function-create-event)
+ [함수 테스트](#test-function-step-test)
+ [컴퓨팅 활용 이해](#compute-utilization)

## 이벤트 객체 설정
<a name="test-function-create-event"></a>

함수를 테스트하기 전에 함수를 테스트할 이벤트 객체를 설정해야 합니다. 이때 여러 가지 선택지가 있습니다.

**선택 1: 이벤트 객체를 저장하지 않고 설정**  
CloudFront 콘솔의 시각적 편집기에서 이벤트 객체를 설정한 후 저장하지 않아도 됩니다.  
저장되지 않았더라도 이 이벤트 객체를 사용하여 CloudFront 콘솔에서 함수를 테스트할 수 있습니다.

**선택 2: 시각적 편집기에서 이벤트 객체 생성**  
CloudFront 콘솔의 시각적 편집기에서 이벤트 객체를 설정한 후 저장하지 않아도 됩니다. 예를 들어, 가능한 여러 입력을 테스트할 수 있도록 각 함수에 대해 10개의 이벤트 객체를 생성할 수 있습니다.  
이러한 방식으로 이벤트 객체를 생성하면 이벤트 객체를 사용하여 CloudFront 콘솔에서 함수를 테스트할 수 있습니다. AWS API 또는 SDK를 사용하여 함수를 테스트하는 데는 이벤트 객체를 사용할 수 없습니다.

**선택 3: 텍스트 편집기를 사용하여 이벤트 객체 생성**  
텍스트 편집기를 사용하여 JSON 형식으로 이벤트 객체를 만들 수 있습니다. 이벤트 객체의 구조에 대한 자세한 내용은 [이벤트 구조](functions-event-structure.md) 섹션을 참조하세요.  
이 이벤트 객체로 CLI를 사용하여 함수를 테스트할 수 있습니다. 하지만 CloudFront 콘솔에서 함수를 테스트하는 데는 사용할 수 없습니다.

**이벤트 객체를 생성하려면(옵션 1 또는 2)**

1. CloudFront 콘솔([https://console.aws.amazon.com/cloudfront/v4/home#/functions](https://console.aws.amazon.com/cloudfront/v4/home#/functions))에 로그인하고 **함수** 페이지를 엽니다.

   테스트할 함수를 선택합니다.

1. 함수 세부 정보 페이지에서 **테스트** 탭을 선택합니다.

1. **이벤트 유형**에서 다음 옵션 중 하나를 선택합니다.
   + 함수가 HTTP 요청을 수정하거나 요청에 따라 응답을 생성하는 경우 **뷰어 요청**을 선택합니다. **요청** 섹션이 나타납니다.
   + **뷰어 응답**을 선택합니다. **요청** 및 **응답** 섹션이 나타납니다.

1. 이벤트에 포함할 필드를 작성합니다. **JSON 편집**을 선택하여 원시 JSON을 확인할 수 있습니다.

1. (선택 사항) 이벤트를 저장하려면 **저장**을 선택하고 **테스트 이벤트 저장**에서 이름을 입력한 다음 **저장**을 선택합니다.

   **JSON 편집**을 선택하고 원시 JSON을 복사한 다음 CloudFront 외부의 자체 파일에 저장할 수도 있습니다.

**이벤트 객체를 생성하려면(옵션 3)**

텍스트 편집기를 사용하여 이벤트 객체를 생성합니다. 컴퓨터가 연결할 수 있는 디렉터리에 파일을 저장합니다.

다음 가이드라인을 따르도록 합니다.
+ `distributionDomainName`, `distributionId`, `requestId` 필드는 생략하세요.
+ 헤더, 쿠키, 쿼리 문자열의 이름은 소문자여야 합니다.

이러한 방식으로 이벤트 객체를 생성하는 한 가지 방법은 시각적 편집기를 사용하여 샘플을 만드는 것입니다. 샘플 형식이 올바른지 확인할 수 있습니다. 그런 다음 원시 JSON을 복사해 텍스트 편집기에 붙여넣고 파일을 저장할 수 있습니다.

이벤트의 구조에 대한 자세한 내용은 [이벤트 구조](functions-event-structure.md) 섹션을 참조하세요.

## 함수 테스트
<a name="test-function-step-test"></a>

CloudFront 콘솔 또는 AWS Command Line Interface(AWS CLI)를 사용하여 함수를 테스트할 수 있습니다.

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

**함수를 테스트하려면**

1. CloudFront 콘솔([https://console.aws.amazon.com/cloudfront/v4/home#/functions](https://console.aws.amazon.com/cloudfront/v4/home#/functions))에 로그인하고 **함수** 페이지를 엽니다.

1. 테스트할 함수를 선택합니다.

1. **테스트** 탭을 선택합니다.

1. 올바른 이벤트가 표시되는지 확인합니다. 현재 표시된 이벤트에서 다른 이벤트로 전환하려면 **테스트 이벤트 선택** 필드에서 다른 이벤트를 선택하세요.

1. **함수 테스트**를 선택합니다. 콘솔에는 함수 로그와 컴퓨팅 활용을 비롯한 함수 출력이 표시됩니다.

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

**aws cloudfront test-function** 명령을 사용하여 함수를 테스트할 수 있습니다.

**함수를 테스트하려면**

1. 명령줄 창을 엽니다.

1. 지정된 파일이 들어 있는 디렉터리에서 다음 명령을 실행합니다.

   이 예제에서는 `fileb://` 표기법을 사용하여 이벤트 객체 파일을 전달합니다. 명령을 더 쉽게 읽을 수 있도록 줄 바꿈도 포함되어 있습니다.

   ```
   aws cloudfront test-function \
       --name MaxAge \
       --if-match ETVABCEXAMPLE \
       --event-object fileb://event-maxage-test01.json \
       --stage DEVELOPMENT
   ```
**참고**  
함수의 이름과 ETag(`if-match` 파라미터 내)로 함수를 참조합니다. 파일 시스템에서의 위치를 기준으로 이벤트 객체를 참조합니다.
스테이지는 `DEVELOPMENT` 또는 `LIVE`일 수 있습니다.

   명령이 제대로 실행되면 다음과 비슷한 출력이 표시됩니다.

   ```
   TestResult:
     ComputeUtilization: '21'
     FunctionErrorMessage: ''
     FunctionExecutionLogs: []
     FunctionOutput: '{"response":{"headers":{"cloudfront-functions":{"value":"generated-by-CloudFront-Functions"},"location":{"value":"https://aws.amazon.com/cloudfront/"}},"statusDescription":"Found","cookies":{},"statusCode":302}}'
     FunctionSummary:
       FunctionConfig:
         Comment: MaxAge function
         Runtime: cloudfront-js-2.0
         KeyValueStoreAssociations= \
         {Quantity=1, \
         Items=[{KeyValueStoreARN='arn:aws:cloudfront::111122223333:key-value-store/a1b2c3d4-5678-90ab-cdef-EXAMPLE11111'}]} \
       FunctionMetadata:
         CreatedTime: '2021-04-18T20:38:56.915000+00:00'
         FunctionARN: arn:aws:cloudfront::111122223333:function/MaxAge
         LastModifiedTime: '2023-17-20T10:38:57.057000+00:00'
         Stage: DEVELOPMENT
       Name: MaxAge
       Status: UNPUBLISHED
   ```

------

**참고**  
`FunctionExecutionLogs`에는 해당 함수가 `console.log()` 명령문(있는 경우)에 작성한 로그 행 목록이 포함되어 있습니다.
`ComputeUtilization`에는 함수 실행에 대한 정보가 들어 있습니다. [컴퓨팅 활용 이해](#compute-utilization)을(를) 참조하세요.
`FunctionOutput`에는 함수가 반환한 이벤트 객체가 포함됩니다.

## 컴퓨팅 활용 이해
<a name="compute-utilization"></a>

**컴퓨팅 활용(Compute utilization)**은 함수가 실행되는 데 걸린 시간의 최대 허용 시간의 백분율입니다. 예를 들어, 값이 35이면 함수가 최대 허용 시간의 35%에서 완료되었음을 의미합니다.

함수가 계속해서 최대 허용 시간을 초과할 경우 CloudFront는 해당 함수를 제한합니다. 다음 목록에서는 컴퓨팅 사용률 값에 따라 함수가 제한될 가능성을 설명합니다.

**컴퓨팅 사용률 값:**
+ **1 \$1 50** - 함수가 최대 허용 시간에 도달하기까지 많이 남았으므로 제한 없이 실행됩니다.
+ **51 \$1 70** - 함수가 최대 허용 시간에 근접하고 있습니다. 함수 코드를 최적화하는 것이 좋습니다.
+ **71 \$1 100** - 함수가 최대 허용 시간에 매우 근접하거나 최대 허용 시간을 초과합니다. 배포와 연결할 경우 CloudFront에서 이 함수를 제한할 가능성이 있습니다.