

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

# sam local invoke를 사용한 테스트 소개
<a name="using-sam-cli-local-invoke"></a>

 AWS Serverless Application Model 명령줄 인터페이스(AWS SAM CLI) `sam local invoke` 하위 명령을 사용하여 로컬에서 AWS Lambda 함수의 일회성 호출을 시작합니다.
+ 에 대한 소개는 단원을 AWS SAM CLI참조하십시오. [란 무엇입니까 AWS SAM CLI?](what-is-sam-overview.md#what-is-sam-cli) 
+ `sam local invoke` 명령 옵션 목록은 [sam local invoke](sam-cli-command-reference-sam-local-invoke.md) 섹션을 참조하세요.
+ 일반적인 개발 워크플로 중 `sam local invoke`를 사용하는 예는 [7단계: (선택 사항) 로컬에서 애플리케이션 테스트](serverless-getting-started-hello-world.md#serverless-getting-started-hello-world-test) 섹션을 참조하세요.

**참고**  
신뢰할 수 없는 코드에는 SAM CLI의 로컬 호출 기능을 사용하지 않는 것이 좋습니다. 로컬 환경에서 완전히 격리하려면 Lambda 서비스에서 직접 코드를 실행합니다.

**참고**  
`sam local invoke`는 자동 체크포인트 및 재생 기능을 갖춘 내구성 있는 함수를 지원합니다. 내구성이 뛰어난 함수를 로컬에서 호출하면 실행 상태가 자동으로 관리됩니다.

## 사전 조건
<a name="using-sam-cli-local-invoke-prerequisites"></a>

`sam local invoke`를 사용하려면 다음을 완료하여 AWS SAM CLI를 설치합니다.
+ [AWS SAM 사전 조건](prerequisites.md).
+ [AWS SAM CLI 설치](install-sam-cli.md).

`sam local invoke`를 사용하기 전에 다음 사항에 대한 기본적인 이해를 하는 것이 좋습니다.
+ [AWS SAM CLI 구성](using-sam-cli-configure.md).
+ [에서 애플리케이션 생성 AWS SAM](using-sam-cli-init.md).
+ [를 사용한 빌드 소개 AWS SAM](using-sam-cli-build.md).
+ [를 사용한 배포 소개 AWS SAM](using-sam-cli-deploy.md).

## Lambda 함수를 호출합니다.
<a name="using-sam-cli-local-invoke-use"></a>

`sam local invoke`를 실행하면 AWS SAMCLI는 현재 작업 디렉터리가 프로젝트의 루트 디렉터리라고 가정합니다. AWS SAMCLI는 먼저 `.aws-sam` 하위 폴더에서 `template.[yaml|yml]` 파일을 찾습니다. 찾을 수 없는 경우 AWS SAMCLI는 현재 작업 디렉터리 내에서 `template.[yaml|yml]` 파일을 찾습니다.

**Lambda 함수를 로컬에서 호출하려면**

1. 프로젝트 디렉터리에서 다음 명령을 실행합니다.

   ```
   $ sam local invoke <options>
   ```

1. 애플리케이션에 둘 이상의 함수가 포함된 경우 함수의 논리적 ID를 제공합니다. 다음은 예제입니다.

   ```
   $ sam local invoke HelloWorldFunction
   ```

1.  AWS SAMCLI는 Docker를 사용하여 로컬 컨테이너에 함수를 빌드합니다. 그런 다음 함수를 호출하고 함수의 응답을 출력합니다.

   다음은 예제입니다.

   ```
   $ sam local invoke
   Invoking app.lambda_handler (python3.9)
   Local image is out of date and will be updated to the latest runtime. To skip this, pass in the parameter --skip-pull-image
   Building image....................................................................................................................
   Using local image: public.ecr.aws/lambda/python:3.9-rapid-x86_64.
   
   Mounting /Users/.../sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated, inside runtime container
   START RequestId: 64bf7e54-5509-4762-a97c-3d740498d3df Version: $LATEST
   END RequestId: 64bf7e54-5509-4762-a97c-3d740498d3df
   REPORT RequestId: 64bf7e54-5509-4762-a97c-3d740498d3df  Init Duration: 1.09 ms  Duration: 608.42 ms       Billed Duration: 609 ms Memory Size: 128 MB     Max Memory Used: 128 MB
   {"statusCode": 200, "body": "{\"message\": \"hello world\"}"}%
   ```

### 로그 관리
<a name="using-sam-cli-local-invoke-logs"></a>

`sam local invoke`를 사용하면 Lambda 함수 런타임 출력(예: 로그)이 `stderr`로 출력되고, Lambda 함수 결과는 `stdout`로 출력됩니다.

다음은 기본 Lambda 함수 출력의 예제입니다.

```
def handler(event, context):
    print("some log") # this goes to stderr
    return "hello world" # this goes to stdout
```

이러한 표준 출력을 저장할 수 있습니다. 다음은 예제입니다.

```
$ sam local invoke 1> stdout.log
...

$ cat stdout.log
"hello world"

$ sam local invoke 2> stderr.log
...

$ cat stderr.log
Invoking app.lambda_handler (python3.9)
Local image is up-to-date
Using local image: public.ecr.aws/lambda/python:3.9-rapid-x86_64.
Mounting /Users/.../sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated, inside runtime container
START RequestId: 0b46e646-3bdf-4b58-8beb-242d00912c46 Version: $LATEST
some log
END RequestId: 0b46e646-3bdf-4b58-8beb-242d00912c46
REPORT RequestId: 0b46e646-3bdf-4b58-8beb-242d00912c46  Init Duration: 0.91 ms  Duration: 589.19 ms Billed Duration: 590 ms Memory Size: 128 MB Max Memory Used: 128 MB
```

이러한 표준 출력을 사용하여 로컬 개발 프로세스를 더욱 자동화할 수 있습니다.

## 옵션
<a name="using-sam-cli-local-invoke-options"></a>

### 사용자 지정 이벤트를 전달하여 Lambda 함수 호출
<a name="using-sam-cli-local-invoke-options-events"></a>

Lambda 함수에 이벤트를 전달하려면 `--event` 옵션을 사용합니다. 다음은 예제입니다.

```
$ sam local invoke --event events/s3.json S3JsonLoggerFunction
```

`sam local generate-event` 하위 명령으로 이벤트를 생성할 수 있습니다. 자세한 내용은 [sam local generate-event를 사용한 테스트 소개](using-sam-cli-local-generate-event.md) 섹션을 참조하세요.

### Lambda 함수를 호출할 때 환경 변수 전달
<a name="using-sam-cli-local-invoke-options-env"></a>

Lambda 함수가 환경 변수를 사용하는 경우 `--env-vars` 옵션을 사용하여 로컬 테스트 중에 환경 변수를 전달할 수 있습니다. 이는 클라우드에 이미 배포된 애플리케이션의 서비스를 사용하여 Lambda 함수를 로컬에서 테스트할 수 있는 좋은 방법입니다. 다음은 예제입니다.

```
$ sam local invoke --env-vars locals.json
```

### 템플릿 또는 함수 지정
<a name="using-sam-cli-local-invoke-options-specify"></a>

 AWS SAMCLI가 참조할 템플릿을 지정하려면 `--template` 옵션을 사용합니다. AWS SAM CLI는 해당 AWS SAM 템플릿과 해당 템플릿이 가리키는 리소스만 로드합니다.

중첩된 애플리케이션 또는 스택의 함수를 호출하려면 함수 논리적 ID와 함께 애플리케이션 또는 스택 논리 ID를 제공합니다. 다음은 예제입니다.

```
$ sam local invoke StackLogicalId/FunctionLogicalId
```

### Terraform 프로젝트에서 Lambda 함수 테스트
<a name="using-sam-cli-local-invoke-options-terraform"></a>

`--hook-name` 옵션을 사용하여 Terraform 프로젝트에서 Lambda 함수를 로컬에서 테스트할 수 있습니다. 자세한 내용은 [로컬 디버깅 및 테스트에 Terraform과 함께 AWS SAMCLI 사용하기](using-samcli-terraform.md)를 참조하세요.

다음은 예제입니다.

```
$ sam local invoke --hook-name terraform --beta-features
```

## 모범 사례
<a name="using-sam-cli-local-invoke-best"></a>

애플리케이션에 실행 중인 `sam build`의 `.aws-sam` 디렉터리가 있는 경우 함수 코드를 업데이트할 때마다 `sam build`를 실행해야 합니다. 그런 다음 `sam local invoke`를 실행하여 업데이트된 함수 코드를 로컬에서 테스트합니다.

로컬 테스트는 클라우드에 배포하기 전에 빠르게 개발하고 테스트할 수 있는 훌륭한 솔루션입니다. 하지만 로컬 테스트는 클라우드의 리소스 간 권한 등 모든 것을 검증하지는 않습니다. 가능한 한 클라우드에서 애플리케이션을 테스트하세요. 클라우드 테스트 워크플로의 속도를 높이려면 [`sam sync`를 사용](using-sam-cli-sync.md)하는 것이 좋습니다.

## 예제
<a name="using-sam-cli-local-invoke-examples"></a>

### Amazon API Gateway 샘플 이벤트를 생성하고 이를 사용하여 Lambda 함수를 로컬에서 호출합니다.
<a name="using-sam-cli-local-invoke-examples-api"></a>

먼저 API Gateway HTTP API 이벤트 페이로드를 생성하여 `events` 폴더에 저장합니다.

```
$ sam local generate-event apigateway http-api-proxy > events/apigateway_event.json
```

다음으로 이벤트에서 파라미터 값을 반환하도록 Lambda 함수를 수정합니다.

```
def lambda_handler(event, context):
    print("HelloWorldFunction invoked")
    return {
        "statusCode": 200,
        "body": json.dumps({
            "message": event['queryStringParameters']['parameter2'],
        }),
    }
```

다음으로 Lambda 함수를 로컬에서 호출하고 사용자 지정 이벤트를 제공합니다.

```
$ sam local invoke --event events/apigateway_event.json

Invoking app.lambda_handler (python3.9)
Local image is up-to-date
Using local image: public.ecr.aws/lambda/python:3.9-rapid-x86_64.

Mounting /Users/...sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated, inside runtime container
START RequestId: 59535d0d-3d9e-493d-8c98-6264e8e961b8 Version: $LATEST
some log
END RequestId: 59535d0d-3d9e-493d-8c98-6264e8e961b8
REPORT RequestId: 59535d0d-3d9e-493d-8c98-6264e8e961b8  Init Duration: 1.63 ms  Duration: 564.07 ms       Billed Duration: 565 ms Memory Size: 128 MB     Max Memory Used: 128 MB
{"statusCode": 200, "body": "{\"message\": \"value\"}"}%
```

### Lambda 함수를 로컬에서 호출할 때 환경 변수 전달
<a name="using-sam-cli-local-invoke-examples-env"></a>

이 애플리케이션에는 Amazon DynamoDB 테이블 이름에 환경 변수를 사용하는 Lambda 함수가 있습니다. 다음은 AWS SAM 템플릿에 정의된 함수의 예입니다.

```
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31
...
Resources:
  getAllItemsFunction:
    Type: AWS::Serverless::Function
    Properties:
      Handler: src/get-all-items.getAllItemsHandler
      Description: get all items
      Policies:
        - DynamoDBReadPolicy:
            TableName: !Ref SampleTable
      Environment:
        Variables:
          SAMPLE_TABLE: !Ref SampleTable
...
```

Lambda 함수를 클라우드의 DynamoDB 테이블과 상호 작용하도록 하면서 로컬에서 테스트하려고 합니다. 이를 위해 환경 변수 파일을 만들고 프로젝트의 루트 디렉터리에 `locals.json`로 저장합니다. 여기 `SAMPLE_TABLE`에 제공된 값은 클라우드의 DynamoDB 테이블을 참조합니다.

```
{
    "getAllItemsFunction": {
        "SAMPLE_TABLE": "dev-demo-SampleTable-1U991234LD5UM98"
    }
}
```

다음으로 `sam local invoke`를 실행하고, `--env-vars` 옵션과 함께 환경 변수로 전달합니다.

```
$ sam local invoke getAllItemsFunction --env-vars locals.json

Mounting /Users/...sam-app/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated, inside runtime container
START RequestId: 59535d0d-3d9e-493d-8c98-6264e8e961b8 Version: $LATEST
some log
END RequestId: 59535d0d-3d9e-493d-8c98-6264e8e961b8
REPORT RequestId: 59535d0d-3d9e-493d-8c98-6264e8e961b8  Init Duration: 1.63 ms  Duration: 564.07 ms       Billed Duration: 565 ms Memory Size: 128 MB     Max Memory Used: 128 MB
{"statusCode":200,"body":"{}"}
```

## 자세히 알아보기
<a name="using-sam-cli-local-invoke-learn"></a>

`sam local invoke` 옵션 목록은 [sam local invoke](sam-cli-command-reference-sam-local-invoke.md) 섹션을 참조하세요.

`sam local` 사용 데모는 [로컬 개발용AWS SAM 섹션을 참조하세요. 의 SAM 시리즈를 사용하여 서버리스 토지 세션의 로컬 개발 환경에서 AWS 클라우드 리소스를 테스트](https://www.youtube.com/watch?v=NzPqMrdgD1s&list=PLJo-rJlep0ED198FJnTzhIB5Aut_1vDAd&index=24)합니다. * YouTube* 