

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

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

 AWS Serverless Application Model 명령줄 인터페이스(AWS SAM CLI) `sam local` 명령을 사용하여 서버리스 애플리케이션을 로컬에서 테스트합니다.

에 대한 소개는 단원을 AWS SAM CLI참조하십시오[란 무엇입니까 AWS SAM CLI?](what-is-sam-overview.md#what-is-sam-cli).

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

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

`sam local`를 사용하기 전에 다음 사항에 대한 기본적인 이해를 하는 것이 좋습니다.
+ [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).

## sam local 명령 사용
<a name="using-sam-cli-local-command"></a>

`sam local` 명령을 해당 하위 명령과 함께 사용하여 애플리케이션에 대해 다양한 유형의 로컬 테스트를 수행할 수 있습니다.

```
$ sam local <subcommand>
```

각 하위 명령에 대해 자세히 알아보려면 다음을 참조하세요.
+ **[sam local generate-event 소개](using-sam-cli-local-generate-event.md)** - 로컬 테스트를 위한 AWS 서비스 이벤트를 생성합니다.
+ **[sam local invoke 소개](using-sam-cli-local-invoke.md)** - 로컬에서 AWS Lambda 함수의 일회성 호출을 시작합니다.
+ **[sam local start-api 소개](using-sam-cli-local-start-api.md)** - 로컬 HTTP 서버를 사용하여 Lambda 함수를 실행합니다.
+ **[sam local start-lambda 소개](using-sam-cli-local-start-lambda.md)** - AWS CLI 또는 SDKs와 함께 사용할 로컬 HTTP 서버를 사용하여 Lambda 함수를 실행합니다.

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

 AWS Serverless Application Model 명령줄 인터페이스(AWS SAM CLI) `sam local generate-event` 하위 명령을 사용하여 지원되는에 대한 이벤트 페이로드 샘플을 생성합니다 AWS 서비스. 그런 다음 이러한 이벤트를 수정하여 로컬 리소스로 전달해 테스트를 수행할 수 있습니다.
+ 에 대한 소개는 단원을 AWS SAM CLI참조하십시오. [란 무엇입니까 AWS SAM CLI?](what-is-sam-overview.md#what-is-sam-cli) 
+ `sam local generate-event` 명령 옵션 목록은 [sam local generate-event](sam-cli-command-reference-sam-local-generate-event.md) 섹션을 참조하세요.

*이벤트*는가 작업 또는 작업을 AWS 서비스 수행할 때 생성되는 JSON 객체입니다. 이러한 이벤트에는 처리된 데이터나 이벤트의 타임스탬프와 같은 특정 정보가 포함됩니다. 대부분의 AWS 서비스 는 이벤트를 생성하고 각 서비스의 이벤트는 해당 서비스에 맞게 고유한 형식으로 지정됩니다.

한 서비스에서 생성된 이벤트는 다른 서비스에 *이벤트 소스*로 전달됩니다. 예를 들어 Amazon Simple Storage Service(S3) 버킷에 배치된 항목은 이벤트를 생성할 수 있습니다. 그러면 이 이벤트를 AWS Lambda 함수의 이벤트 소스로 사용하여 데이터를 추가로 처리할 수 있습니다.

를 사용하여 생성한 이벤트`sam local generate-event`는 AWS 서비스에서 생성한 실제 이벤트와 동일한 구조로 형식이 지정됩니다. 이러한 이벤트의 콘텐츠를 수정하고 이를 사용하여 애플리케이션의 리소스를 테스트할 수 있습니다.

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

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

`sam local generate-event`를 사용하기 전에 다음 사항에 대한 기본적인 이해를 하는 것이 좋습니다.
+ [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).

## 샘플 이벤트 생성
<a name="using-sam-cli-local-generate-event-generate"></a>

`sam local generate-event` 하위 명령을 사용하여 지원되는에 AWS SAM CLI 대한 이벤트를 생성합니다 AWS 서비스.

**지원되는 목록을 보려면 AWS 서비스**

1. 다음을 실행합니다.

   ```
   $ sam local generate-event
   ```

1. 지원되는 목록이 AWS 서비스 표시됩니다. 다음은 예제입니다.

   ```
   $ sam local generate-event
   ...
   Commands:
     alb
     alexa-skills-kit
     alexa-smart-home
     apigateway
     appsync
     batch
     cloudformation
     ...
   ```

**로컬 이벤트를 생성하려면**

1. `sam local generate-event`를 실행하고 지원되는 서비스 이름을 제공합니다. 그러면 생성할 수 있는 이벤트 유형 목록이 표시됩니다. 다음은 예제입니다.

   ```
   $ sam local generate-event s3
   
   Usage: sam local generate-event s3 [OPTIONS] COMMAND [ARGS]...
   
   Options:
     -h, --help  Show this message and exit.
   
   Commands:
     batch-invocation  Generates an Amazon S3 Batch Operations Invocation Event
     delete            Generates an Amazon S3 Delete Event
     put               Generates an Amazon S3 Put Event
   ```

1. 샘플 이벤트를 생성하려면 `sam local generate-event`를 실행하여 서비스와 이벤트 유형을 제공합니다.

   ```
   $ sam local generate-event <service> <event>
   ```

   다음은 예제입니다.

   ```
   $ sam local generate-event s3 put
   {
     "Records": [
       {
         "eventVersion": "2.0",
         "eventSource": "aws:s3",
         "awsRegion": "us-east-1",
         "eventTime": "1970-01-01T00:00:00.000Z",
         "eventName": "ObjectCreated:Put",
         "userIdentity": {
           "principalId": "EXAMPLE"
         },
         "requestParameters": {
           "sourceIPAddress": "127.0.0.1"
         },
         "responseElements": {
           "x-amz-request-id": "EXAMPLE123456789",
           "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH"
         },
         "s3": {
           "s3SchemaVersion": "1.0",
           "configurationId": "testConfigRule",
           "bucket": {
             "name": "sam-s3-demo-bucket",
             "ownerIdentity": {
               "principalId": "EXAMPLE"
             },
             "arn": "arn:aws:s3:::sam-s3-demo-bucket"
           },
           "object": {
             "key": "test/key",
             "size": 1024,
             "eTag": "0123456789abcdef0123456789abcdef",
             "sequencer": "0A1B2C3D4E5F678901"
           }
         }
       }
     ]
   }
   ```

이 샘플 이벤트에는 자리 표시자 값이 포함되어 있습니다. 애플리케이션의 실제 리소스를 참조하거나 로컬 테스트에 도움이 되는 값을 참조하도록 이러한 값을 수정할 수 있습니다.

**샘플 이벤트를 수정하려면**

1. 명령 프롬프트에서 샘플 이벤트를 수정할 수 있습니다. 옵션을 보려면 다음을 실행합니다.

   ```
   $ sam local generate-event <service> <event> --help
   ```

   다음은 예제입니다.

   ```
   $ sam local generate-event s3 put --help
   
   Usage: sam local generate-event s3 put [OPTIONS]
   
   Options:
     --region TEXT       Specify the region name you'd like, otherwise the
                         default = us-east-1
     --partition TEXT    Specify the partition name you'd like, otherwise the
                         default = aws
     --bucket TEXT       Specify the bucket name you'd like, otherwise the
                         default = example-bucket
     --key TEXT          Specify the key name you'd like, otherwise the default =
                         test/key
     --debug             Turn on debug logging to print debug message generated
                         by AWS SAM CLI and display timestamps.
     --config-file TEXT  Configuration file containing default parameter values.
                         [default: samconfig.toml]
     --config-env TEXT   Environment name specifying default parameter values in
                         the configuration file.  [default: default]
     -h, --help          Show this message and exit.
   ```

1. 명령 프롬프트에서 이러한 옵션 중 하나를 사용하여 샘플 이벤트 페이로드를 수정합니다. 다음은 예제입니다.

   ```
   $ sam local generate-event s3 put--bucket sam-s3-demo-bucket
   
   {
     "Records": [
       {
         "eventVersion": "2.0",
         "eventSource": "aws:s3",
         "awsRegion": "us-east-1",
         "eventTime": "1970-01-01T00:00:00.000Z",
         "eventName": "ObjectCreated:Put",
         "userIdentity": {
           "principalId": "EXAMPLE"
         },
         "requestParameters": {
           "sourceIPAddress": "127.0.0.1"
         },
         "responseElements": {
           "x-amz-request-id": "EXAMPLE123456789",
           "x-amz-id-2": "EXAMPLE123/5678abcdefghijklambdaisawesome/mnopqrstuvwxyzABCDEFGH"
         },
         "s3": {
           "s3SchemaVersion": "1.0",
           "configurationId": "testConfigRule",
           "bucket": {
             "name": "sam-s3-demo-bucket",
             "ownerIdentity": {
               "principalId": "EXAMPLE"
             },
             "arn": "arn:aws:s3:::sam-s3-demo-bucket"
           },
           "object": {
             "key": "test/key",
             "size": 1024,
             "eTag": "0123456789abcdef0123456789abcdef",
             "sequencer": "0A1B2C3D4E5F678901"
           }
         }
       }
     ]
   }
   ```

## 로컬 테스트에 생성된 이벤트 사용
<a name="using-sam-cli-local-generate-event-use"></a>

생성된 이벤트를 로컬에 저장하고 다른 `sam local` 하위 명령을 사용하여 테스트를 수행합니다.

**생성된 이벤트를 로컬에 저장하려면**
+ 다음을 실행합니다.

  ```
  $ sam local generate-event <service> <event> <event-option> > <filename.json>
  ```

  다음은 프로젝트 `events` 폴더에 `s3.json` 파일로 저장되는 이벤트에 대한 예시입니다.

  ```
  sam-app$ sam local generate-event s3 put --bucket amzn-s3-demo-bucket > events/s3.json
  ```

**로컬 테스트에 생성된 이벤트를 사용하려면**
+ `--event` 옵션을 사용하여 다른 `sam local` 하위 명령과 함께 이벤트를 전달합니다.

  다음은 `s3.json` 이벤트를 사용하여 Lambda 함수를 로컬에서 호출하는 예제입니다.

  ```
  sam-app$ sam local invoke --event events/s3.json S3JsonLoggerFunction
  
  Invoking src/handlers/s3-json-logger.s3JsonLoggerHandler (nodejs18.x)
  Local image is up-to-date
  Using local image: public.ecr.aws/lambda/nodejs:18-rapid-x86_64.
  
  Mounting /Users/.../sam-app/.aws-sam/build/S3JsonLoggerFunction as /var/task:ro,delegated, inside runtime container
  START RequestId: f4f45b6d-2ec6-4235-bc7b-495ec2ae0128 Version: $LATEST
  END RequestId: f4f45b6d-2ec6-4235-bc7b-495ec2ae0128
  REPORT RequestId: f4f45b6d-2ec6-4235-bc7b-495ec2ae0128  Init Duration: 1.23 ms  Duration: 9371.93 ms      Billed Duration: 9372 ms        Memory Size: 128 MB     Max Memory Used: 128 MB
  ```

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

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

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

# 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* 

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

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

**참고**  
`sam local start-api`는 자동 체크포인트 및 재생 기능을 갖춘 내구성 있는 함수를 지원합니다. 내구성 함수는 로컬 API Gateway 엔드포인트와 원활하게 작동합니다.

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

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

`sam local start-api`를 사용하기 전에 다음 사항에 대한 기본적인 이해를 하는 것이 좋습니다.
+ [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).

## sam local start-api 사용하기
<a name="using-sam-cli-local-start-api-use"></a>

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

**로컬 HTTP 서버를 시작하려면**

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

   ```
   $ sam local start-api <options>
   ```

1.  AWS SAMCLI는 Lambda 함수를 로컬 Docker 컨테이너에 빌드합니다. 그런 다음 HTTP 서버 엔드포인트의 로컬 주소를 출력합니다. 다음은 예제입니다.

   ```
   $ sam local start-api
   
   Initializing the lambda functions containers.
   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
   Containers Initialization is done.
   Mounting HelloWorldFunction at http://127.0.0.1:3000/hello [GET]
   You can now browse to the above endpoints to invoke your functions. You do not need to restart/reload SAM CLI while working on your functions, changes will be reflected instantly/automatically. If you used sam build before running local commands, you will need to re-run sam build for the changes to be picked up. You only need to restart SAM CLI if you update your AWS SAM template
   2023-04-12 14:41:05 WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
    * Running on http://127.0.0.1:3000
   ```

1. 브라우저 또는 명령 프롬프트를 통해 Lambda 함수를 호출할 수 있습니다. 다음은 예제입니다.

   ```
   sam-app$ curl http://127.0.0.1:3000/hello
   {"message": "Hello world!"}%
   ```

1. Lambda 함수 코드를 변경할 때는 다음 사항을 고려하여 로컬 HTTP 서버를 새로 고침합니다.
   + 애플리케이션에 `.aws-sam` 디렉터리가 없고 함수가 해석된 언어를 사용하는 경우, AWS SAMCLI는 새 컨테이너를 생성하고 호스팅하여 함수를 자동으로 업데이트합니다.
   + 애플리케이션에 `.aws-sam` 디렉터리가 있는 경우 함수를 업데이트하려면 `sam build`를 실행해야 합니다. 그런 다음 다시 `sam local start-api`를 실행하여 함수를 호스팅합니다.
   + 함수가 컴파일된 언어를 사용하거나 프로젝트에 복잡한 패키징 지원이 필요한 경우, 자체 빌드 솔루션을 실행하여 함수를 업데이트합니다. 그런 다음 다시 `sam local start-api`를 실행하여 함수를 호스팅합니다.

### Lambda 권한 부여자를 사용하는 Lambda 함수
<a name="using-sam-cli-local-start-api-authorizers"></a>

**참고**  
 AWS SAM CLI 버전 1.80.0의 새로운 기능 업그레이드하려면 [AWS SAMCLI업그레이드](manage-sam-cli-versions.md#manage-sam-cli-versions-upgrade) 섹션을 참조하세요.

Lambda 권한 부여자를 사용하는 Lambda 함수의 경우 AWS SAMCLI는 Lambda 함수 엔드포인트를 호출하기 전에 Lambda 권한 부여자를 자동으로 호출합니다.

다음은 Lambda 권한 부여자를 사용하는 함수의 로컬 HTTP 서버를 시작하는 예제입니다.

```
$ sam local start-api
2023-04-17 15:02:13 Attaching import module proxy for analyzing dynamic imports

AWS SAM CLI does not guarantee 100% fidelity between authorizers locally
and authorizers deployed on AWS. Any application critical behavior should
be validated thoroughly before deploying to production.

Testing application behaviour against authorizers deployed on AWS can be done using the sam sync command.

Mounting HelloWorldFunction at http://127.0.0.1:3000/authorized-request [GET]
You can now browse to the above endpoints to invoke your functions. You do not need to restart/reload SAM CLI while working on your functions, changes will be reflected instantly/automatically. If you used sam build before running local commands, you will need to re-run sam build for the changes to be picked up. You only need to restart SAM CLI if you update your AWS SAM template
2023-04-17 15:02:13 WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
 * Running on http://127.0.0.1:3000
2023-04-17 15:02:13 Press CTRL+C to quit
```

로컬 HTTP 서버를 통해 Lambda 함수 엔드포인트를 호출하면 AWS SAMCLI가 먼저 Lambda 권한 부여자를 호출합니다. 승인이 성공하면 AWS SAMCLI가 Lambda 함수 엔드포인트를 호출합니다. 다음은 예제입니다.

```
$ curl http://127.0.0.1:3000/authorized-request --header "header:my_token"
{"message": "from authorizer"}%

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

Mounting /Users/.../sam-app/... as /var/task:ro,delegated, inside runtime container
START RequestId: 38d3b472-a2c8-4ea6-9a77-9b386989bef0 Version: $LATEST
END RequestId: 38d3b472-a2c8-4ea6-9a77-9b386989bef0
REPORT RequestId: 38d3b472-a2c8-4ea6-9a77-9b386989bef0    Init Duration: 1.08 ms    Duration: 628.26 msBilled Duration: 629 ms    Memory Size: 128 MB    Max Memory Used: 128 MB
Invoking app.request_handler (python3.8)
Using local image: public.ecr.aws/lambda/python:3.8-rapid-x86_64.

Mounting /Users/.../sam-app/... as /var/task:ro,delegated, inside runtime container
START RequestId: fdc12255-79a3-4365-97e9-9459d06446ff Version: $LATEST
END RequestId: fdc12255-79a3-4365-97e9-9459d06446ff
REPORT RequestId: fdc12255-79a3-4365-97e9-9459d06446ff    Init Duration: 0.95 ms    Duration: 659.13 msBilled Duration: 660 ms    Memory Size: 128 MB    Max Memory Used: 128 MB
No Content-Type given. Defaulting to 'application/json'.
2023-04-17 15:03:03 127.0.0.1 - - [17/Apr/2023 15:03:03] "GET /authorized-request HTTP/1.1" 200 -
```

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

### 컨테이너를 지속적으로 재사용하여 로컬 함수 호출 속도 높이기
<a name="using-sam-cli-local-start-api-options-warm"></a>

기본적으로 AWS SAMCLI는 함수가 로컬 HTTP 서버를 통해 호출될 때마다 새 컨테이너를 만듭니다. `--warm-containers` 옵션을 사용하면 함수 호출에 컨테이너를 자동으로 재사용할 수 있습니다. 이렇게 하면 AWS SAMCLI가 로컬 호출을 위해 Lambda 함수를 준비하는 데 걸리는 시간이 단축됩니다. `eager` 또는 `lazy` 인수를 제공하여 이 옵션을 추가로 사용자 지정할 수 있습니다.
+ `eager` - 모든 함수의 컨테이너는 시작 시 로드되며 호출 이후에도 유지됩니다.
+ `lazy` - 컨테이너는 각 함수를 처음 호출할 때만 로드됩니다. 그런 다음 추가 호출 시에도 계속 유지됩니다.

다음은 예제입니다.

```
$ sam local start-api --warm-containers eager
```

`--warm-containers`를 사용하고 Lambda 함수 코드를 수정할 때:
+ 애플리케이션에 `.aws-sam` 디렉터리가 있는 경우 `sam build`를 실행하여 애플리케이션 빌드 아티팩트의 함수 코드를 업데이트합니다.
+ 코드 변경이 감지되면 AWS SAMCLI가 Lambda 함수 컨테이너를 자동으로 종료합니다.
+ 함수를 다시 호출하면 AWS SAMCLI가 자동으로 새 컨테이너를 생성합니다.

### Lambda 함수에 사용할 컨테이너 이미지 지정
<a name="using-sam-cli-local-start-api-options-specify"></a>

기본적으로 AWS SAMCLI는 Amazon Elastic Container Registry(Amazon ECR)에서 Lambda 기본 이미지를 사용하여 로컬에서 함수를 호출합니다. `--invoke-image` 옵션을 사용하여 사용자 지정 컨테이너 이미지를 참조할 수 있습니다. 다음은 예제입니다.

```
$ sam local start-api --invoke-image public.ecr.aws/sam/emu-python3.8
```

사용자 지정 컨테이너 이미지와 함께 사용할 함수를 지정할 수 있습니다. 다음은 예제입니다.

```
$ sam local start-api --invoke-image Function1=amazon/aws/sam-cli-emulation-image-python3.8
```

### 로컬에서 테스트할 템플릿 지정
<a name="using-sam-cli-local-start-api-options-template"></a>

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

```
$ sam local start-api --template myTemplate.yaml
```

### Lambda 함수의 호스트 개발 환경 지정
<a name="using-sam-cli-local-start-api-options-dev"></a>

기본적으로 `sam local start-api` 하위 명령은 IP 주소 `127.0.0.1`가 포함된 `localhost`를 사용하여 HTTP 서버를 생성합니다. 로컬 개발 환경이 로컬 컴퓨터와 격리되어 있는 경우 이러한 값을 사용자 지정할 수 있습니다.

`--container-host` 옵션을 사용하여 호스트를 지정합니다. 다음은 예제입니다.

```
$ sam local start-api --container-host host.docker.internal
```

`--container-host-interface` 옵션을 사용하여 컨테이너 포트가 바인딩해야 하는 호스트 네트워크의 IP 주소를 지정합니다. 다음은 예제입니다.

```
$ sam local start-api --container-host-interface 0.0.0.0
```

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

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

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

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

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

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

하위 명령을 사용하여 AWS SAM CLI AWS CLI 및 SDK`sam local start-lambda`를 통해 Lambda 함수를 호출합니다. SDKs 이 명령은 Lambda를 에뮬레이션하는 로컬 엔드포인트를 시작합니다.
+ 에 대한 소개는 단원을 AWS SAM CLI참조하십시오. [란 무엇입니까 AWS SAM CLI?](what-is-sam-overview.md#what-is-sam-cli) 
+ `sam local start-lambda` 명령 옵션 목록은 [sam local start-lambda](sam-cli-command-reference-sam-local-start-lambda.md) 섹션을 참조하세요.

**참고**  
`sam local start-lambda`는 자동 체크포인트 및 재생 기능을 갖춘 내구성 있는 함수를 지원합니다. 내구성 함수는 로컬 Lambda 엔드포인트와 원활하게 작동합니다.

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

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

`sam local start-lambda`를 사용하기 전에 다음 사항에 대한 기본적인 이해를 하는 것이 좋습니다.
+ [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).

## sam local start-lambda 사용하기
<a name="using-sam-cli-local-start-lambda-use"></a>

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

**sam local start-lambda를 사용하려면**

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

   ```
   $ sam local start-lambda <options>
   ```

1.  AWS SAMCLI는 Lambda 함수를 로컬 Docker 컨테이너에 빌드합니다. 그런 다음 로컬 주소를 HTTP 서버 엔드포인트로 출력합니다. 다음은 예제입니다.

   ```
   $ sam local start-lambda
   Initializing the lambda functions containers.
   Local image is up-to-date
   Using local image: public.ecr.aws/lambda/python:3.9-rapid-x86_64.
   
   Mounting /Users/.../sam-app/hello_world as /var/task:ro,delegated, inside runtime container
   Containers Initialization is done.
   Starting the Local Lambda Service. You can now invoke your Lambda Functions defined in your template through the endpoint.
   2023-04-13 07:25:43 WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.
    * Running on http://127.0.0.1:3001
   2023-04-13 07:25:43 Press CTRL+C to quit
   ```

1.  AWS CLI 또는 SDKs를 사용하여 로컬에서 Lambda 함수를 호출합니다.

   다음은 AWS CLI사용을 보여 주는 예제입니다.

   ```
   $ aws lambda invoke --function-name "HelloWorldFunction" --endpoint-url "http://127.0.0.1:3001" --no-verify-ssl out.txt
       
   StatusCode: 200
   (END)
   ```

   다음은 용를 AWS SDK 사용하는 예제입니다Python.

   ```
   import boto3
   from botocore.config import Config
   from botocore import UNSIGNED
   
   lambda_client = boto3.client('lambda',
                                endpoint_url="http://127.0.0.1:3001",
                                use_ssl=False,
                                verify=False,
                                config=Config(signature_version=UNSIGNED,
                                              read_timeout=1,
                                              retries={'max_attempts': 0}
                                              )
                               )
   lambda_client.invoke(FunctionName="HelloWorldFunction")
   ```

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

### 템플릿 지정의 경우 다음을 수행합니다.
<a name="using-sam-cli-local-start-lambda-options-template"></a>

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

```
$ sam local start-lambda --template myTemplate.yaml
```

 AWS SAM 템플릿에 대한 자세한 내용은 섹션을 참조하세요[AWS SAM 템플릿 구조](sam-specification-template-anatomy.md).

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

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

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

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

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