

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

# 를 사용하여 서버리스 애플리케이션 테스트 AWS SAM
<a name="serverless-test-and-debug"></a>

애플리케이션을 작성하고 빌드한 후에는 애플리케이션이 제대로 작동하는지 확인하기 위해 애플리케이션을 테스트해야 합니다. AWS SAM 명령줄 인터페이스(CLI)를 사용하면 AWS 클라우드에 업로드하기 전에 서버리스 애플리케이션을 로컬에서 테스트할 수 있습니다. 애플리케이션을 테스트하면 애플리케이션의 기능, 안정성 및 성능을 모두 확인하는 동시에 해결해야 할 문제(버그)를 식별할 수 있습니다.

이 섹션에서는 애플리케이션을 테스트할 때 참조할 수 있는 일반적인 관행에 대한 지침을 제공합니다. 이 섹션의 주제는 주로 AWS 클라우드에 배포하기 전에 수행할 수 있는 로컬 테스트에 중점을 둡니다. 배포 전 테스트는 문제를 사전에 식별하여 배포 문제와 관련된 불필요한 비용을 줄이는 데 도움을 줍니다. 이 섹션의 각 주제에서는 수행할 수 있는 테스트를 설명하고, yoxi include href? u 사용의 이점을 설명하고, 테스트 수행 방법을 보여주는 예제를 포함합니다. 애플리케이션을 테스트한 후에는 발견된 문제를 디버깅해야 합니다.

**Topics**
+ [sam local 명령을 사용한 테스트 소개](using-sam-cli-local.md)
+ [를 사용하여 Lambda 함수를 로컬로 호출 AWS SAM](serverless-sam-cli-using-invoke.md)
+ [를 사용하여 로컬로 API Gateway 실행 AWS SAM](serverless-sam-cli-using-start-api.md)
+ [sam remote test-event를 사용한 클라우드 테스트 소개](using-sam-cli-remote-test-event.md)
+ [sam remote invoke를 사용하여 클라우드에서 테스트 소개](using-sam-cli-remote-invoke.md)
+ [를 사용하여 로컬 통합 테스트 자동화 AWS SAM](serverless-sam-cli-using-automated-tests.md)
+ [를 사용하여 샘플 이벤트 페이로드 생성 AWS SAM](serverless-sam-cli-using-generate-event.md)
+ [내구성 함수 테스트 및 디버깅](test-and-debug-durable-functions.md)

# 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) 섹션을 참조하세요.

# 를 사용하여 Lambda 함수를 로컬로 호출 AWS SAM
<a name="serverless-sam-cli-using-invoke"></a>

클라우드에서 테스트하거나 배포하기 전에 Lambda 함수를 로컬로 호출하면 다양한 이점이 있습니다. 이를 통해 함수의 로직을 더 빠르게 테스트할 수 있습니다. 먼저 로컬로 테스트하면 클라우드에서 테스트할 때 또는 배포 중에 문제가 발생할 가능성을 줄여 불필요한 비용을 방지할 수 있습니다. 또한 로컬 테스트를 사용하면 디버깅을 더 쉽게 수행할 수 있습니다.

[sam local invoke](sam-cli-command-reference-sam-local-invoke.md) 명령을 사용하고 함수의 논리적 ID와 이벤트 파일을 제공하여 Lambda 함수를 로컬에서 호출할 수 있습니다. **sam local invoke**는 이벤트로 `stdin`도 수락합니다. 자세한 내용은 *AWS Lambda 개발자 안내서*의 [ 이벤트](https://docs.aws.amazon.com/lambda/latest/dg/gettingstarted-concepts.html#gettingstarted-concepts-event)를 참조하세요. 다양한 AWS 서비스의 이벤트 메시지 형식에 대한 자세한 내용은 *AWS Lambda 개발자 안내서*의 [다른 서비스와 AWS Lambda 함께 사용을](https://docs.aws.amazon.com/lambda/latest/dg/lambda-services.html) 참조하세요.

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

**참고**  
**sam local invoke** 명령은 AWS Command Line Interface (AWS CLI) 명령에 해당합니다[https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/invoke.html](https://awscli.amazonaws.com/v2/documentation/api/latest/reference/lambda/invoke.html). 두 명령 중 하나를 사용하여 Lambda 함수를 호출할 수 있습니다.

호출하려는 함수가 포함된 프로젝트 디렉터리에서 **sam local invoke** 명령을 실행해야 합니다.

 예시:

```
# Invoking function with event file
$ sam local invoke "Ratings" -e event.json

# Invoking function with event via stdin
$ echo '{"message": "Hey, are you there?" }' | sam local invoke --event - "Ratings"

# For more options
$ sam local invoke --help
```

## 환경 변수 파일
<a name="serverless-sam-cli-using-invoke-environment-file"></a>

템플릿에 정의된 값을 재정의하는 환경 변수를 로컬에서 선언하려면 다음을 수행하십시오.

1. 재정의할 환경 변수가 포함된 JSON 또는 `.env` 파일을 생성합니다.

1. `--env-vars` 인수를 사용하여 템플릿에 정의된 값을 재정의합니다.

`--env-vars` 옵션은 두 가지 파일 형식을 지원합니다. 파일 형식은 파일 콘텐츠에 따라 자동으로 감지됩니다.

### JSON을 사용하여 환경 변수 선언
<a name="serverless-sam-cli-using-invoke-environment-file-declaring"></a>

모든 리소스에 전체적으로 적용되는 환경 변수를 선언하려면 다음과 같이 `Parameters` 객체를 지정합니다.

```
{
    "Parameters": {
        "TABLE_NAME": "localtable",
        "BUCKET_NAME": "amzn-s3-demo-bucket",
        "STAGE": "dev"
    }
}
```

각 리소스에 대해 서로 다른 환경 변수를 선언하려면 다음과 같이 각 리소스에 대하여 객체를 지정합니다.

```
{
    "MyFunction1": {
        "TABLE_NAME": "localtable",
        "BUCKET_NAME": "amzn-s3-demo-bucket",
    },
    "MyFunction2": {
        "TABLE_NAME": "localtable",
        "STAGE": "dev"
    }
}
```

각 리소스에 객체를 지정할 때는 우선 순위가 높은 순위에서 가장 낮은 순으로 나열된 다음 식별자를 사용할 수 있습니다.

1. `logical_id`

1. `function_id`

1. `function_name`

1. 완전 경로 식별자

단일 파일에서 환경 변수를 선언하는 위의 두 가지 방법을 모두 함께 사용할 수 있습니다. 이렇게 하면 특정 리소스에 대해 제공한 환경 변수가 글로벌 환경 변수보다 우선합니다.

귀하의 환경 변수를 JSON 파일(예:`env.json`)에 저장합니다.

### .env 파일을 사용하여 환경 변수 선언
<a name="serverless-sam-cli-using-invoke-environment-file-dotenv"></a>

`.env` 파일을 사용하여 환경 변수를 선언할 수도 있습니다. `.env` 파일에 선언된 변수는 JSON 형식의 `Parameters` 객체와 동일한 모든 함수에 전역적으로 적용됩니다.

```
TABLE_NAME=localtable
BUCKET_NAME=amzn-s3-demo-bucket
STAGE=dev
```

`.env` 형식은 설명(로 시작하는 줄`#`)과 따옴표로 묶인 값을 지원합니다.

**참고**  
`.env` 형식은 글로벌 환경 변수만 지원합니다. 함수별 환경 변수를 선언하려면 JSON 형식을 사용합니다.

### 환경 변수 값 재정의
<a name="serverless-sam-cli-using-invoke-environment-file-override"></a>

환경 변수를 환경 변수 파일에 정의된 변수로 재정의하려면 **invoke** 또는 **start-api** 명령과 함께 `--env-vars` 인수를 사용합니다. 예제:

```
# Using a JSON file
sam local invoke --env-vars env.json

# Using a .env file
sam local invoke --env-vars .env
```

## 계층
<a name="serverless-sam-cli-using-invoke-layers"></a>

귀하의 애플리케이션에 레이어가 포함된 경우 로컬 호스트의 레이어 관련 문제를 디버깅하는 방법에 대한 자세한 내용은을 참조하세요[에서 Lambda 계층을 사용하여 효율성 향상 AWS SAM](serverless-sam-cli-layers.md).

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

로컬에서 함수를 호출하는 실습 예제는 *전체 AWS SAM 워크숍*의 [ 모듈 2 - 로컬에서 실행](https://s12d.com/sam-ws-en-local)을 참조하세요.

# 를 사용하여 로컬로 API Gateway 실행 AWS SAM
<a name="serverless-sam-cli-using-start-api"></a>

Amazon API Gateway를 로컬에서 실행하면 다양한 이점이 있습니다. 예를 들어, 로컬에서 API Gateway를 실행하면 AWS 클라우드에 배포하기 전에 로컬에서 API 엔드포인트를 테스트할 수 있습니다. 먼저 로컬에서 테스트하면 클라우드에서 수행하는 테스트 및 개발을 줄일 수 있으므로 비용을 절감할 수 있습니다. 또한 로컬에서 실행하면 디버깅이 더 쉬워집니다.

HTTP 요청/응답 기능을 테스트하는 데 사용할 수 있는 API Gateway의 로컬 인스턴스를 시작하려면 `sam local start-api` AWS SAM CLI 명령을 사용합니다. 이 기능에는 핫 리로딩 기능이 있어 함수를 빠르게 개발하고 반복할 수 있습니다.

**참고**  
*핫 리로딩*은 변경된 파일만 새로 고치고 애플리케이션 상태는 동일하게 유지되는 것을 말합니다. 반대로 *라이브 재로드*는 전체 애플리케이션을 새로 고치고 애플리케이션의 당시 상태가 손실되는 경우입니다.

`sam local start-api` 명령을 사용하는 방법은 [sam local start-api를 사용한 테스트 소개](using-sam-cli-local-start-api.md) 섹션을 참조하세요.

기본적으로는 AWS Lambda 프록시 통합을 AWS SAM 사용하고 `HttpApi` 및 `Api` 리소스 유형을 모두 지원합니다. `HttpApi` 리소스 유형의 프록시 통합에 대한 자세한 내용은 *API Gateway 개발자 안내서*의 [HTTP APIs에 대한 AWS Lambda 프록시 통합 작업을 참조하세요](https://docs.aws.amazon.com/apigateway/latest/developerguide/http-api-develop-integrations-lambda.html). 이러한 `Api` 리소스 유형으로 실행하는 프록시 통합에 대한 자세한 내용은 *API Gateway 개발자 안내서*의 [API Gateway Lambda 프록시 통합](https://docs.aws.amazon.com/apigateway/latest/developerguide/set-up-lambda-proxy-integrations.html#api-gateway-create-api-as-simple-proxy)을 참조하세요.

**예:**

```
$ sam local start-api
```

AWS SAM 는 AWS SAM 템플릿 내에서 `HttpApi` 또는 `Api` 이벤트 소스가 정의된 함수를 자동으로 찾습니다. 그런 다음 정의된 HTTP 경로에 함수를 마운트합니다.

다음 `Api` 예제에서 `Ratings` 함수는 귀하의 요청 `ratings.py:handler()` 시 `/ratings` 마운트됩니다. `GET` 

```
Ratings:
  Type: AWS::Serverless::Function
  Properties:
    Handler: ratings.handler
    Runtime: python3.9
    Events:
      Api:
        Type: Api
        Properties:
          Path: /ratings
          Method: get
```

다음은 `Api` 응답의 예시입니다.

```
// Example of a Proxy Integration response
exports.handler = (event, context, callback) => {
    callback(null, {
        statusCode: 200,
        headers: { "x-custom-header" : "my custom header value" },
        body: "hello world"
    });
}
```

귀하의 함수 코드를 수정하는 경우 `sam local start-api`를 위한 `sam build` 명령을 실행하여 변경 내용을 감지하십시오.

## 환경 변수 파일
<a name="serverless-sam-cli-using-start-api-environment-variable"></a>

템플릿에 정의된 값을 재정의하는 환경 변수를 로컬에서 선언하려면 다음을 수행하십시오.

1. 재정의할 환경 변수가 포함된 JSON 파일을 만듭니다.

1. `--env-vars` 인수를 사용하여 템플릿에 정의된 값을 재정의합니다.

### 환경 변수 선언
<a name="serverless-sam-cli-using-invoke-environment-file-declaring"></a>

모든 리소스에 전체적으로 적용되는 환경 변수를 선언하려면 다음과 같이 `Parameters` 객체를 지정합니다.

```
{
    "Parameters": {
        "TABLE_NAME": "localtable",
        "BUCKET_NAME": "amzn-s3-demo-bucket",
        "STAGE": "dev"
    }
}
```

각 리소스에 대해 서로 다른 환경 변수를 선언하려면 다음과 같이 각 리소스에 대하여 객체를 지정합니다.

```
{
    "MyFunction1": {
        "TABLE_NAME": "localtable",
        "BUCKET_NAME": "amzn-s3-demo-bucket",
    },
    "MyFunction2": {
        "TABLE_NAME": "localtable",
        "STAGE": "dev"
    }
}
```

각 리소스에 객체를 지정할 때는 우선 순위가 높은 순위에서 가장 낮은 순으로 나열된 다음 식별자를 사용할 수 있습니다.

1. `logical_id`

1. `function_id`

1. `function_name`

1. 완전 경로 식별자

단일 파일에서 환경 변수를 선언하는 위의 두 가지 방법을 모두 함께 사용할 수 있습니다. 이렇게 하면 특정 리소스에 대해 제공한 환경 변수가 글로벌 환경 변수보다 우선합니다.

귀하의 환경 변수를 JSON 파일(예:`env.json`)에 저장합니다.

### 환경 변수 값 재정의
<a name="serverless-sam-cli-using-start-api-environment-file-override"></a>

환경 변수를 JSON 파일에 정의된 변수로 재정의하려면 **invoke** 또는 **start-api** 명령과 함께 `--env-vars` 인수를 사용합니다. 예제:

```
$ sam local start-api --env-vars env.json
```

## 계층
<a name="serverless-sam-cli-using-start-api-layers"></a>

귀하의 애플리케이션에 레이어가 포함된 경우 로컬 호스트의 레이어 관련 문제를 디버깅하는 방법에 대한 자세한 내용은을 참조하세요[에서 Lambda 계층을 사용하여 효율성 향상 AWS SAM](serverless-sam-cli-layers.md).

# sam remote test-event를 사용한 클라우드 테스트 소개
<a name="using-sam-cli-remote-test-event"></a>

 AWS Serverless Application Model 명령줄 인터페이스(AWS SAM CLI) `sam remote test-event` 명령을 사용하여 AWS Lambda 함수에 대한 공유 가능한 테스트 이벤트에 액세스하고 관리합니다.

공유 가능한 테스트 이벤트에 대해 자세히 알아보려면 *AWS Lambda 개발자 안내서*의 [공유 가능한 테스트 이벤트](https://docs.aws.amazon.com/lambda/latest/dg/testing-functions.html#creating-shareable-events) 섹션을 참조하세요.

**Topics**
+ [sam remote test-event를 사용하도록 AWS SAMCLI를 설정합니다.](#using-sam-cli-remote-test-event-setup)
+ [sam remote test-event 명령 사용](#using-sam-cli-remote-test-event-use)
+ [공유 가능한 테스트 이벤트 사용](#using-sam-cli-remote-test-event-invoke)
+ [공유 가능한 테스트 이벤트 관리](#using-sam-cli-remote-test-event-manage)

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

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

가 AWS SAM CLI 이미 설치되어 있는 경우 최신 버전의 버전으로 업그레이드하는 AWS SAM CLI 것이 좋습니다. 자세한 내용은 [AWS SAMCLI업그레이드](manage-sam-cli-versions.md#manage-sam-cli-versions-upgrade) 섹션을 참조하세요.

`sam remote test-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).
+ [를 사용하여 sam sync에 동기화 소개 AWS 클라우드](using-sam-cli-sync.md).

## sam remote test-event를 사용하도록 AWS SAMCLI를 설정합니다.
<a name="using-sam-cli-remote-test-event-setup"></a>

`sam remote test-event` 명령을 사용하려면 다음 설정 단계를 완료합니다. AWS SAM CLI 

1. **를 AWS SAM CLI 사용하도록 구성 AWS 계정** - Lambda에 대한 공유 가능한 테스트 이벤트는 동일한 내의 사용자가 액세스하고 관리할 수 있습니다 AWS 계정. 를 AWS SAM CLI 사용하도록를 구성하려면 섹션을 AWS 계정참조하세요[AWS SAM CLI 구성](using-sam-cli-configure.md).

1. **공유 가능한 테스트 이벤트에 대한 권한을 구성합니다.** - 공유 가능한 테스트 이벤트에 액세스하고 관리하려면 적절한 권한이 있어야 합니다. 자세히 알아보려면 *AWS Lambda 개발자 안내서*의 [공유 가능한 테스트 이벤트](https://docs.aws.amazon.com/lambda/latest/dg/testing-functions.html#creating-shareable-events) 섹션을 참조하세요.

## sam remote test-event 명령 사용
<a name="using-sam-cli-remote-test-event-use"></a>

`sam remote test-event` 명령은 AWS SAM CLI 공유 가능한 테스트 이벤트에 액세스하고 관리하는 데 사용할 수 있는 다음 하위 명령을 제공합니다.
+ `delete` - Amazon EventBridge 스키마 레지스트리에서 공유 가능한 테스트 이벤트를 삭제합니다.
+ `get` - EventBridge 스키마 레지스트리에서 공유 가능한 테스트 이벤트를 가져옵니다.
+ `list` - EventBridge 스키마 레지스트리에서 함수에 대한 기존의 공유 가능한 테스트 이벤트를 나열합니다.
+ `put` - 로컬 파일의 이벤트를 EventBridge 스키마 레지스트리에 저장합니다.

를 사용하여 이러한 하위 명령을 나열하려면 다음을 AWS SAM CLI실행합니다.

```
$ sam remote test-event --help
```

### 공유 가능한 테스트 이벤트 삭제
<a name="using-sam-cli-remote-test-event-use-delete"></a>

다음과 함께 `delete` 하위 명령을 사용하여 공유 가능한 테스트 이벤트를 삭제할 수 있습니다.
+ 삭제할 공유 가능한 테스트 이벤트의 이름을 제공합니다.
+ 이벤트와 연결된 Lambda 함수의 허용 가능한 ID를 제공합니다.
+ Lambda 함수 논리적 ID를 제공하는 경우 Lambda 함수와 연결된 AWS CloudFormation 스택 이름도 제공해야 합니다.

다음은 예제입니다.

```
$ sam remote test-event delete HelloWorldFunction --stack-name sam-app --name demo-event
```

`delete` 하위 명령과 함께 사용할 옵션 목록은 [sam remote test-event delete](sam-cli-command-reference-remote-test-event-delete.md) 섹션을 참조하세요. AWS SAM CLI다음에서 다음을 실행할 수도 있습니다.

```
$ sam remote test-event delete --help
```

### 공유 가능한 테스트 이벤트 생성
<a name="using-sam-cli-remote-test-event-use-get"></a>

다음과 함께 `get` 하위 명령을 사용하여 EventBridge 스키마 레지스트리에서 공유 가능한 테스트 이벤트를 가져올 수 있습니다.
+ 가져올 공유 가능한 테스트 이벤트의 이름을 제공합니다.
+ 이벤트와 연결된 Lambda 함수의 허용 가능한 ID를 제공합니다.
+ Lambda 함수 논리적 ID를 제공하는 경우 Lambda 함수와 연결된 AWS CloudFormation 스택 이름도 제공해야 합니다.

다음은 `sam-app` 스택의 `HelloWorldFunction` Lambda 함수와 연결된 `demo-event`라는 공유 가능한 테스트 이벤트를 가져오는 예제입니다. 이 명령은 이벤트를 콘솔에 인쇄합니다.

```
$ sam remote test-event get HelloWorldFunction --stack-name sam-app --name demo-event
```

공유 가능한 테스트 이벤트를 가져와 로컬 컴퓨터에 저장하려면 `--output-file` 옵션을 사용하고 파일 경로와 이름을 제공합니다. 다음은 현재 작업 디렉터리에 `demo-event`를 `demo-event.json`로 저장하는 예제입니다.

```
$ sam remote test-event get HelloWorldFunction --stack-name sam-app --name demo-event --output-file demo-event.json
```

`get` 하위 명령과 함께 사용할 옵션 목록은 [sam remote test-event get](sam-cli-command-reference-remote-test-event-get.md) 섹션을 참조하세요. AWS SAM CLI다음에서 다음을 실행할 수도 있습니다.

```
$ sam remote test-event get --help
```

### 공유 가능한 테스트 이벤트 나열
<a name="using-sam-cli-remote-test-event-use-list"></a>

스키마 레지스트리에서 특정 Lambda 함수에 대한 모든 공유 가능한 테스트 이벤트를 나열할 수 있습니다. 다음과 함께 `list` 하위 명령을 사용합니다.
+ 이벤트와 연결된 Lambda 함수의 허용 가능한 ID를 제공합니다.
+ Lambda 함수 논리적 ID를 제공하는 경우 Lambda 함수와 연결된 CloudFormation 스택 이름도 제공해야 합니다.

다음은 `sam-app` 스택의 `HelloWorldFunction` Lambda 함수와 관련된 모든 공유 가능한 테스트 이벤트 목록을 가져오는 예제입니다.

```
$ sam remote test-event list HelloWorldFunction --stack-name sam-app
```

`list` 하위 명령과 함께 사용할 옵션 목록은 [sam remote test-event list](sam-cli-command-reference-remote-test-event-list.md) 섹션을 참조하세요. AWS SAM CLI다음에서 다음을 실행할 수도 있습니다.

```
$ sam remote test-event list --help
```

### 공유 가능한 테스트 이벤트 저장
<a name="using-sam-cli-remote-test-event-use-put"></a>

공유 가능한 테스트 이벤트를 EventBridge 스키마 레지스트리에 저장할 수 있습니다. 다음과 함께 `put` 하위 명령을 사용합니다.
+ 공유 가능한 테스트 이벤트와 관련된 Lambda 함수의 허용 가능한 ID를 제공합니다.
+ 공유 가능한 테스트 이벤트의 이름을 제공합니다.
+ 업로드할 로컬 이벤트의 파일 경로와 이름을 제공합니다.

다음은 로컬 `demo-event.json` 이벤트를 `demo-event`로 저장하고 이를 `sam-app` 스택의 `HelloWorldFunction` Lambda 함수와 연결하는 예제입니다.

```
$ sam remote test-event put HelloWorldFunction --stack-name sam-app --name demo-event --file demo-event.json
```

동일한 이름의 공유 가능한 테스트 이벤트가 EventBridge 스키마 레지스트리 AWS SAM CLI에 있는 경우는 이를 덮어쓰지 않습니다. 덮어쓰려면 `--force` 옵션을 명령에 추가합니다.

`put` 하위 명령과 함께 사용할 옵션 목록은 [sam remote test-event put](sam-cli-command-reference-remote-test-event-put.md) 섹션을 참조하세요. AWS SAM CLI다음에서 다음을 실행할 수도 있습니다.

```
$ sam remote test-event put --help
```

## 공유 가능한 테스트 이벤트 사용
<a name="using-sam-cli-remote-test-event-invoke"></a>

공유 가능한 테스트 이벤트를 사용하여 `sam remote invoke` 명령을 사용하여에서 Lambda 함수 AWS 클라우드 를 테스트합니다. 자세한 내용은 [공유 가능한 테스트 이벤트를 클라우드의 Lambda 함수에 전달](using-sam-cli-remote-invoke.md#using-sam-cli-remote-invoke-shareable)를 참조하세요.

## 공유 가능한 테스트 이벤트 관리
<a name="using-sam-cli-remote-test-event-manage"></a>

이 주제에는 공유 가능한 테스트 이벤트를 관리하고 사용하는 방법에 대한 예제가 포함되어 있습니다.

### 공유 가능한 테스트 이벤트를 가져와 수정하고 사용하기
<a name="using-sam-cli-remote-test-event-manage-example1"></a>

EventBridge 스키마 레지스트리에서 공유 가능한 테스트 이벤트를 가져오고, 로컬에서 수정하고, AWS 클라우드에서 Lambda 함수와 함께 로컬 테스트 이벤트를 사용할 수 있습니다. 다음은 예제입니다.

1. **공유 가능한 테스트 이벤트 검색** - `sam remote test-event get` 하위 명령을 사용하여 특정 Lambda 함수에 대한 공유 가능한 테스트 이벤트를 검색하고 로컬에 저장합니다.

   ```
   $ sam remote test-event get HelloWorldFunction --stack-name sam-app --name demo-event --output-file demo-event.json
   ```

1. **공유 가능한 테스트 이벤트 수정** - 원하는 텍스트 편집기를 사용하여 공유 가능한 테스트 이벤트를 수정합니다.

1. **공유 가능한 테스트 이벤트 사용** - `sam remote invoke` 명령을 사용하고 이벤트의 파일 경로와 이름을 `--event-file`로 입력합니다.

   ```
   $ sam remote invoke HelloWorldFunction --stack-name sam-app --event-file demo-event.json
   ```

### 공유 가능한 테스트 이벤트를 가져와 수정하고 업로드하고 사용하기
<a name="using-sam-cli-remote-test-event-manage-example2"></a>

EventBridge 스키마 레지스트리에서 공유 가능한 테스트 이벤트를 가져와서 로컬에서 수정하고 업로드할 수 있습니다. 그런 다음 공유 가능한 테스트 이벤트를 AWS 클라우드의 Lambda 함수에 직접 전달할 수 있습니다. 다음은 예제입니다.

1. **공유 가능한 테스트 이벤트 검색** - `sam remote test-event get` 하위 명령을 사용하여 특정 Lambda 함수에 대한 공유 가능한 테스트 이벤트를 검색하고 로컬에 저장합니다.

   ```
   $ sam remote test-event get HelloWorldFunction --stack-name sam-app --name demo-event --output-file demo-event.json
   ```

1. **공유 가능한 테스트 이벤트 수정** - 원하는 텍스트 편집기를 사용하여 공유 가능한 테스트 이벤트를 수정합니다.

1. **공유 가능한 테스트 이벤트 업로드** - `sam remote test-event put` 하위 명령을 사용하여 공유 가능한 테스트 이벤트를 EventBridge 스키마 레지스트리에 업로드하고 저장합니다. 이 예제에서는 `--force` 옵션을 사용하여 공유 가능 테스트의 이전 버전을 덮어씁니다.

   ```
   $ sam remote test-event put HelloWorldFunction --stack-name sam-app --name demo-event --file demo-event.json --force
   ```

1. **공유 가능한 테스트 이벤트를 Lambda 함수로 전달** - `sam remote invoke` 명령을 사용하여 공유 가능한 테스트 이벤트를 AWS 클라우드의 Lambda 함수에 직접 전달합니다.

   ```
   $ sam remote invoke HelloWorldFunction --stack-name sam-app --test-event-name demo-event
   ```

# sam remote invoke를 사용하여 클라우드에서 테스트 소개
<a name="using-sam-cli-remote-invoke"></a>

 AWS Serverless Application Model 명령줄 인터페이스(AWS SAM CLI) `sam remote invoke` 명령을 사용하여에서 지원되는 AWS 리소스와 상호 작용합니다 AWS 클라우드. 다음 리소스를 간접 호출하기 위해 `sam remote invoke`를 사용할 수 있습니다.
+ **Amazon Kinesis Data Streams** - 데이터 레코드를 Kinesis Data Streams 애플리케이션으로 전송합니다.
+ **AWS Lambda** - 이벤트를 간접 호출하고 Lambda 함수로 전달합니다.
+ **Amazon Simple Queue Service (Amazon SQS)** – 메시지를 Amazon Simple Queue Service(Amazon SQS) 대기열에 전송합니다.
+ **AWS Step Functions** – Step Functions 상태 머신을 간접 호출하여 실행을 시작합니다.

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

일반적인 개발 워크플로 중 `sam remote invoke`를 사용하는 예는 [5단계:에서 함수와 상호 작용 AWS 클라우드](serverless-getting-started-hello-world.md#serverless-getting-started-hello-world-remote-invoke) 섹션을 참조하세요.

**Topics**
+ [sam remote invoke 명령 사용](#using-sam-cli-remote-invoke-use)
+ [sam remote invoke 명령 옵션 사용](#using-sam-cli-remote-invoke-options)
+ [프로젝트 구성 파일을 구성합니다.](#using-sam-cli-remote-invoke-configure)
+ [예제](#using-sam-cli-remote-invoke-examples)
+ [관련 링크](#using-sam-cli-remote-invoke-links)

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

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

또한 최신 버전의 로 업그레이드하는 것이 좋습니다 AWS SAM CLI. 자세한 내용은 [AWS SAMCLI업그레이드](manage-sam-cli-versions.md#manage-sam-cli-versions-upgrade) 섹션을 참조하세요.

`sam remote 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).
+ [를 사용하여 sam sync에 동기화 소개 AWS 클라우드](using-sam-cli-sync.md).

## sam remote invoke 명령 사용
<a name="using-sam-cli-remote-invoke-use"></a>

이 명령을 사용하기 전에 리소스를 AWS 클라우드에 배포해야 합니다.

다음 명령 구조를 사용하고 프로젝트의 루트 디렉터리에서 실행합니다.

```
$ sam remote invoke <arguments> <options>
```

**참고**  
이 페이지에는 명령 프롬프트에서 제공되는 옵션이 표시됩니다. 명령 프롬프트에서 옵션을 전달하는 대신 프로젝트의 구성 파일에서 옵션을 구성할 수도 있습니다. 자세한 내용은 [프로젝트 설정 구성](using-sam-cli-configure.md#using-sam-cli-configure-project) 섹션을 참조하세요.

`sam remote invoke` 인수 및 옵션에 대한 설명은 [sam remote invoke](sam-cli-command-reference-remote-invoke.md) 섹션을 참조하세요.

### Kinesis Data Streams 사용
<a name="using-sam-cli-remote-invoke-use-kinesis"></a>

Kinesis Data Streams 애플리케이션에 데이터 레코드를 보낼 수 있습니다. AWS SAM CLI는 데이터 레코드를 전송하고 샤드 ID와 시퀀스 번호를 반환합니다. 다음은 예제입니다.

```
$ sam remote invoke KinesisStream --stack-name kinesis-example --event hello-world
	
	Putting record to Kinesis data stream KinesisStream                                                             
	Auto converting value 'hello-world' into JSON '"hello-world"'. If you don't want auto-conversion, please provide
	a JSON string as event                                                                                          
	{
	  "ShardId": "shardId-000000000000",
	  "SequenceNumber": "49646251411914806775980850790050483811301135051202232322"
	}%
```

**데이터 기록을 보내려면**

1. 리소스 ID 값을 Kinesis Data Streams 애플리케이션의 인수로 제공합니다. 자세한 내용은 [리소스 ID](sam-cli-command-reference-remote-invoke.md#sam-cli-command-reference-remote-invoke-args-resource-id)를 참조하세요.

1. 데이터 레코드를 이벤트로 제공하여 Kinesis Data Streams 애플리케이션에 전송합니다. `--event` 옵션을 사용하여 명령줄에서 이벤트를 제공하거나 `--event-file`을 사용하는 파일에서 이벤트를 제공할 수 있습니다. 이벤트를 제공하지 않으면가 AWS SAM CLI 빈 이벤트를 보냅니다.

### Lambda 함수와 함께 사용
<a name="using-sam-cli-remote-invoke-use-lambda"></a>

클라우드에서 Lambda 함수를 간접 호출하고 빈 이벤트를 전달하거나 명령줄 또는 파일에서 이벤트를 제공할 수 있습니다. 는 AWS SAM CLI Lambda 함수를 호출하고 응답을 반환합니다. 다음은 예제입니다.

```
$ sam remote invoke HelloWorldFunction --stack-name sam-app

Invoking Lambda Function HelloWorldFunction                                       
START RequestId: d5ef494b-5f45-4086-86fd-d7322fa1a1f9 Version: $LATEST
END RequestId: d5ef494b-5f45-4086-86fd-d7322fa1a1f9
REPORT RequestId: d5ef494b-5f45-4086-86fd-d7322fa1a1f9  Duration: 6.62 ms       Billed Duration: 7 ms     Memory Size: 128 MB     Max Memory Used: 67 MB  Init Duration: 164.06 ms
{"statusCode":200,"body":"{\"message\":\"hello world\"}"}%
```

**Lambda 함수를 간접 호출하기 위해**

1. 리소스 ID 값을 Lambda 함수에 대한 인수로 제공합니다. 자세한 내용은 [리소스 ID](sam-cli-command-reference-remote-invoke.md#sam-cli-command-reference-remote-invoke-args-resource-id)를 참조하세요.

1. Lambda 함수에 전송할 이벤트를 제공합니다. `--event` 옵션을 사용하여 명령줄에서 이벤트를 제공하거나 `--event-file`을 사용하는 파일에서 이벤트를 제공할 수 있습니다. 이벤트를 제공하지 않으면가 AWS SAM CLI 빈 이벤트를 보냅니다.

#### 응답 스트리밍으로 구성된 Lambda 함수
<a name="using-sam-cli-remote-invoke-invoke-stream"></a>

이 `sam remote invoke` 명령은 응답을 스트리밍하도록 구성된 Lambda 함수를 지원합니다. AWS SAM 템플릿의 `FunctionUrlConfig` 속성을 사용하여 응답을 스트리밍하도록 Lambda 함수를 구성할 수 있습니다. `sam remote invoke`를 사용하면 AWS SAMCLI가 Lambda 구성을 자동으로 감지하고 응답 스트리밍을 통해 간접 호출합니다.

예시는 [응답을 스트리밍하도록 Lambda 함수 구성](#using-sam-cli-remote-invoke-examples-lambda-stream) 섹션을 참조하세요.

#### 공유 가능한 테스트 이벤트를 클라우드의 Lambda 함수에 전달
<a name="using-sam-cli-remote-invoke-shareable"></a>

공유 가능한 테스트 이벤트는 동일한 AWS 계정계정의 다른 사용자와 공유할 수 있는 테스트 이벤트입니다. 자세히 알아보려면 *AWS Lambda 개발자 안내서*의 [공유 가능한 테스트 이벤트](https://docs.aws.amazon.com/lambda/latest/dg/testing-functions.html#creating-shareable-events) 섹션을 참조하세요.

##### 공유 가능한 테스트 이벤트 액세스 및 관리
<a name="using-sam-cli-remote-invoke-shareable-access"></a>

`sam remote test-event` 명령을 사용하여 AWS SAM CLI 공유 가능한 테스트 이벤트에 액세스하고 관리할 수 있습니다. 예를 들면, 다음을 수행하기 위해 `sam remote test-event`를 사용할 수 있습니다.
+ Amazon EventBridge 스키마 레지스트리에서 공유 가능한 테스트 이벤트를 검색합니다.
+ 공유 가능한 테스트 이벤트를 로컬에서 수정하고 EventBridge 스키마 레지스트리에 업로드합니다.
+ EventBridge 스키마 레지스트리에서 공유 가능한 테스트 이벤트를 삭제합니다.

자세한 내용은 [sam remote test-event를 사용한 클라우드 테스트 소개](using-sam-cli-remote-test-event.md)를 참조하세요.

##### 공유 가능한 테스트 이벤트를 클라우드의 Lambda 함수에 전달
<a name="using-sam-cli-remote-invoke-shareable-pass"></a>

EventBridge 스키마 레지스트리에서 클라우드의 Lambda 함수로 공유 가능한 테스트 이벤트를 전달하려면 `--test-event-name` 옵션을 사용하고 공유 가능한 테스트 이벤트의 이름을 제공합니다. 다음은 예제입니다.

```
$ sam remote invoke HelloWorldFunction --stack-name sam-app --test-event-name demo-event
```

공유 가능한 테스트 이벤트를 로컬에 저장하는 경우 `--event-file` 옵션을 사용하여 로컬 테스트 이벤트의 파일 경로와 이름을 제공할 수 있습니다. 다음은 예제입니다.

```
$ sam remote invoke HelloWorldFunction --stack-name sam-app --event-file demo-event.json
```

### Amazon SQS에서 사용
<a name="using-sam-cli-remote-invoke-use-sqs"></a>

메시지를 Amazon SQS 대기열로 전송할 수 있습니다. 는 AWS SAM CLI 다음을 반환합니다.
+ 메시지 ID
+ 메시지 본문의 MD5
+ 응답 메타데이터

 다음은 예제입니다.

```
$ sam remote invoke MySqsQueue --stack-name sqs-example -event hello

Sending message to SQS queue MySqsQueue                                                                         
{
  "MD5OfMessageBody": "5d41402abc4b2a76b9719d911017c592",
  "MessageId": "05c7af65-9ae8-4014-ae28-809d6d8ec652"
}%
```

**메시지 전송**

1. Amazon SQS 대기열의 인수로 리소스 ID 값을 제공합니다. 자세한 내용은 [리소스 ID](sam-cli-command-reference-remote-invoke.md#sam-cli-command-reference-remote-invoke-args-resource-id)를 참조하세요.

1. Amazon SQS 대기열로 전송할 이벤트를 제공합니다. `--event` 옵션을 사용하여 명령줄에서 이벤트를 제공하거나 `--event-file`을 사용하는 파일에서 이벤트를 제공할 수 있습니다. 이벤트를 제공하지 않으면가 AWS SAM CLI 빈 이벤트를 보냅니다.

### Step Functions와 함께 사용
<a name="using-sam-cli-remote-invoke-use-sf"></a>

 Step Functions 상태 시스템 실행을 시작합니다. AWS SAM CLI는 상태 시스템 워크플로가 완료되고 실행의 마지막 단계의 출력이 반환될 때까지 기다립니다. 다음은 예제입니다.

```
$ sam remote invoke HelloWorldStateMachine --stack-name state-machine-example --event '{"is_developer": true}'

Invoking Step Function HelloWorldStateMachine                                                                   
"Hello Developer World"%
```

**상태 머신을 실행하려면**

1. Step Functions 상태 시스템의 인수로 리소스 ID 값을 제공합니다. 자세한 내용은 [리소스 ID](sam-cli-command-reference-remote-invoke.md#sam-cli-command-reference-remote-invoke-args-resource-id)를 참조하세요.

1. 상태 시스템에 전송할 이벤트를 제공합니다. `--event` 옵션을 사용하여 명령줄에서 이벤트를 제공하거나 `--event-file`을 사용하는 파일에서 이벤트를 제공할 수 있습니다. 이벤트를 제공하지 않으면가 AWS SAM CLI 빈 이벤트를 보냅니다.

## sam remote invoke 명령 옵션 사용
<a name="using-sam-cli-remote-invoke-options"></a>

이 섹션에서는 `sam remote invoke` 명령과 함께 사용할 수 있는 몇 가지 주요 옵션을 다룹니다. 옵션의 전체 목록은 [sam remote invoke](sam-cli-command-reference-remote-invoke.md) 섹션을 참조하세요.

### 리소스에 이벤트 전달
<a name="using-sam-cli-remote-invoke-options-event"></a>

다음 옵션을 사용하여 클라우드의 리소스에 이벤트를 전달할 수 있습니다.
+ `--event` - 명령줄에서 이벤트를 전달합니다.
+ `--event-file` - 파일에서 이벤트를 전달합니다.

#### Lambda 예제
<a name="using-sam-cli-remote-invoke-options-event-lambda-examples"></a>

**`--event`를 사용하여 명령줄에서 이벤트를 문자열 값으로 전달합니다.**

```
$ sam remote invoke HelloWorldFunction --stack-name sam-app --event '{"message": "hello!"}'

Invoking Lambda Function HelloWorldFunction                                                                                                                                                                                                                     
START RequestId: b992292d-1fac-4aa2-922a-c9dc5c6fceab Version: $LATEST
END RequestId: b992292d-1fac-4aa2-922a-c9dc5c6fceab
REPORT RequestId: b992292d-1fac-4aa2-922a-c9dc5c6fceab  Duration: 16.41 ms      Billed Duration: 17 ms  Memory Size: 128 MB     Max Memory Used: 67 MB  Init Duration: 185.96 ms
{"statusCode":200,"body":"{\"message\":\"hello!\"}"}%
```

**`--event-file`를 사용하여 파일에서 이벤트를 전달하고 파일 경로를 제공합니다.**

```
$ cat event.json
			
{"message": "hello from file"}%    
			
$ sam remote invoke HelloWorldFunction --stack-name sam-app --event-file event.json       

Invoking Lambda Function HelloWorldFunction                                                                                                                                                                                                                     
START RequestId: 3bc71f7d-153a-4b1e-8c9a-901d91b1bec9 Version: $LATEST
END RequestId: 3bc71f7d-153a-4b1e-8c9a-901d91b1bec9
REPORT RequestId: 3bc71f7d-153a-4b1e-8c9a-901d91b1bec9  Duration: 21.15 ms      Billed Duration: 22 ms  Memory Size: 128 MB     Max Memory Used: 67 MB
{"statusCode":200,"body":"{\"message\":\"hello from file\"}"}%
```

**`stdin`를 사용하여 이벤트를 전달합니다.**

```
$ cat event.json
			
{"message": "hello from file"}%    
                                                                       
$ cat event.json | sam remote invoke HelloWorldFunction --stack-name sam-app --event-file -

Reading event from stdin (you can also pass it from file with --event-file)                               
Invoking Lambda Function HelloWorldFunction                                                               
START RequestId: 85ecc902-8ad0-4a2b-a8c8-9bb4f65f5a7a Version: $LATEST
END RequestId: 85ecc902-8ad0-4a2b-a8c8-9bb4f65f5a7a
REPORT RequestId: 85ecc902-8ad0-4a2b-a8c8-9bb4f65f5a7a  Duration: 1.36 ms       Billed Duration: 2 ms   Memory Size: 128 MB       Max Memory Used: 67 MB
{"statusCode":200,"body":"{\"message\":\"hello from file\"}"}%
```

### AWS SAMCLI 응답 출력을 구성합니다.
<a name="using-sam-cli-remote-invoke-options-output"></a>

`sam remote invoke`를 사용하여 지원되는 리소스를 간접 호출하면 AWS SAMCLI는 다음을 포함하는 응답을 반환합니다.
+ **요청 메타데이터** - 요청과 관련된 메타데이터입니다. 여기에는 요청 ID 및 요청 시작 시간이 포함됩니다.
+ **리소스 응답** - 클라우드에서 간접 호출된 후 리소스가 보내는 응답입니다.

`--output` 옵션을 사용하여 출력 응답을 구성할 수 있습니다 AWS SAM CLI. 다음과 같은 값을 사용할 수 있습니다.
+ `json` - 메타데이터 및 리소스 응답이 JSON 구조로 반환됩니다. 응답에는 전체 SDK 출력이 포함됩니다.
+ `text` - 메타데이터가 텍스트 구조로 반환됩니다. 리소스 응답은 리소스의 출력 형식으로 반환됩니다.

다음은 `json` 출력의 예제입니다.

```
$ sam remote invoke --stack-name sam-app --output json

Invoking Lambda Function HelloWorldFunction                                                                                                                                                                                                                     
{
  "ResponseMetadata": {
    "RequestId": "3bdf9a30-776d-4a90-94a6-4cccc0fc7b41",
    "HTTPStatusCode": 200,
    "HTTPHeaders": {
      "date": "Mon, 19 Jun 2023 17:15:46 GMT",
      "content-type": "application/json",
      "content-length": "57",
      "connection": "keep-alive",
      "x-amzn-requestid": "3bdf9a30-776d-4a90-94a6-4cccc0fc7b41",
      "x-amzn-remapped-content-length": "0",
      "x-amz-executed-version": "$LATEST",
      "x-amz-log-result": "U1RBUlQgUmVxdWVzdElkOiAzYmRmOWEzMC03NzZkLTRhOTAtOTRhNi00Y2NjYzBmYzdiNDEgVmVyc2lvbjogJExBVEVTVApFTkQgUmVxdWVzdElkOiAzYmRmOWEzMC03NzZkLTRhOTAtOTRhNi00Y2NjYzBmYzdiNDEKUkVQT1JUIFJlcXVlc3RJZDogM2JkZjlhMzAtNzc2ZC00YTkwLTk0YTYtNGNjY2MwZmM3YjQxCUR1cmF0aW9uOiA4LjIzIG1zCUJpbGxlZCBEdXJhdGlvbjogOSBtcwlNZW1vcnkgU2l6ZTogMTI4IE1CCU1heCBNZW1vcnkgVXNlZDogNjggTUIJCg==",
      "x-amzn-trace-id": "root=1-64908d42-17dab270273fcc6b527dd6b8;sampled=0;lineage=2301f8dc:0"
    },
    "RetryAttempts": 0
  },
  "StatusCode": 200,
  "LogResult": "U1RBUlQgUmVxdWVzdElkOiAzYmRmOWEzMC03NzZkLTRhOTAtOTRhNi00Y2NjYzBmYzdiNDEgVmVyc2lvbjogJExBVEVTVApFTkQgUmVxdWVzdElkOiAzYmRmOWEzMC03NzZkLTRhOTAtOTRhNi00Y2NjYzBmYzdiNDEKUkVQT1JUIFJlcXVlc3RJZDogM2JkZjlhMzAtNzc2ZC00YTkwLTk0YTYtNGNjY2MwZmM3YjQxCUR1cmF0aW9uOiA4LjIzIG1zCUJpbGxlZCBEdXJhdGlvbjogOSBtcwlNZW1vcnkgU2l6ZTogMTI4IE1CCU1heCBNZW1vcnkgVXNlZDogNjggTUIJCg==",
  "ExecutedVersion": "$LATEST",
  "Payload": "{\"statusCode\":200,\"body\":\"{\\\"message\\\":\\\"hello world\\\"}\"}"
}%
```

`json` 출력을 지정하면 전체 응답이 `stdout`에 반환됩니다. 다음은 예제입니다.

```
$ sam remote invoke --stack-name sam-app --output json 1> stdout.log

Invoking Lambda Function HelloWorldFunction           
                                                                                                                                                                                                          
$ cat stdout.log
			
{
  "ResponseMetadata": {
    "RequestId": "d30d280f-8188-4372-bc94-ce0f1603b6bb",
    "HTTPStatusCode": 200,
    "HTTPHeaders": {
      "date": "Mon, 19 Jun 2023 17:35:56 GMT",
      "content-type": "application/json",
      "content-length": "57",
      "connection": "keep-alive",
      "x-amzn-requestid": "d30d280f-8188-4372-bc94-ce0f1603b6bb",
      "x-amzn-remapped-content-length": "0",
      "x-amz-executed-version": "$LATEST",
      "x-amz-log-result": "U1RBUlQgUmVxdWVzdElkOiBkMzBkMjgwZi04MTg4LTQzNzItYmM5NC1jZTBmMTYwM2I2YmIgVmVyc2lvbjogJExBVEVTVApFTkQgUmVxdWVzdElkOiBkMzBkMjgwZi04MTg4LTQzNzItYmM5NC1jZTBmMTYwM2I2YmIKUkVQT1JUIFJlcXVlc3RJZDogZDMwZDI4MGYtODE4OC00MzcyLWJjOTQtY2UwZjE2MDNiNmJiCUR1cmF0aW9uOiA0LjE2IG1zCUJpbGxlZCBEdXJhdGlvbjogNSBtcwlNZW1vcnkgU2l6ZTogMTI4IE1CCU1heCBNZW1vcnkgVXNlZDogNjcgTUIJSW5pdCBEdXJhdGlvbjogMTU4LjM5IG1zCQo=",
      "x-amzn-trace-id": "root=1-649091fc-771473c7778689627a6122b7;sampled=0;lineage=2301f8dc:0"
    },
    "RetryAttempts": 0
  },
  "StatusCode": 200,
  "LogResult": "U1RBUlQgUmVxdWVzdElkOiBkMzBkMjgwZi04MTg4LTQzNzItYmM5NC1jZTBmMTYwM2I2YmIgVmVyc2lvbjogJExBVEVTVApFTkQgUmVxdWVzdElkOiBkMzBkMjgwZi04MTg4LTQzNzItYmM5NC1jZTBmMTYwM2I2YmIKUkVQT1JUIFJlcXVlc3RJZDogZDMwZDI4MGYtODE4OC00MzcyLWJjOTQtY2UwZjE2MDNiNmJiCUR1cmF0aW9uOiA0LjE2IG1zCUJpbGxlZCBEdXJhdGlvbjogNSBtcwlNZW1vcnkgU2l6ZTogMTI4IE1CCU1heCBNZW1vcnkgVXNlZDogNjcgTUIJSW5pdCBEdXJhdGlvbjogMTU4LjM5IG1zCQo=",
  "ExecutedVersion": "$LATEST",
  "Payload": "{\"statusCode\":200,\"body\":\"{\\\"message\\\":\\\"hello world\\\"}\"}"
}%
```

다음은 `text` 출력의 예제입니다.

```
$ sam remote invoke --stack-name sam-app --output text

Invoking Lambda Function HelloWorldFunction                                                                                                                                                                                                                     
START RequestId: 4dbacc43-1ec6-47c2-982b-9dc4620144d6 Version: $LATEST
END RequestId: 4dbacc43-1ec6-47c2-982b-9dc4620144d6
REPORT RequestId: 4dbacc43-1ec6-47c2-982b-9dc4620144d6  Duration: 9.13 ms       Billed Duration: 10 ms  Memory Size: 128 MB     Max Memory Used: 67 MB  Init Duration: 165.50 ms
{"statusCode":200,"body":"{\"message\":\"hello world\"}"}%
```

`text` 출력을 지정하면 Lambda 함수 런타임 출력(예: 로그)이 `stderr`로 반환됩니다. Lambda 함수 페이로드가 `stdout`로 반환됩니다. 다음은 예제입니다.

```
$ sam remote invoke --stack-name sam-app --output text 2> stderr.log

{"statusCode":200,"body":"{\"message\":\"hello world\"}"}% 
                                                                                                                                                                                                     
$ cat stderr.log

Invoking Lambda Function HelloWorldFunction
START RequestId: 82273c3b-aa3a-4d16-8f1c-1d2ad3ace891 Version: $LATEST
END RequestId: 82273c3b-aa3a-4d16-8f1c-1d2ad3ace891
REPORT RequestId: 82273c3b-aa3a-4d16-8f1c-1d2ad3ace891  Duration: 40.62 ms      Billed Duration: 41 ms  Memory Size: 128 MB     Max Memory Used: 68 MB

$ sam remote invoke --stack-name sam-app --output text 1> stdout.log
 
Invoking Lambda Function HelloWorldFunction                                                                                                                                                                                                                     
START RequestId: 74acaa9f-5b80-4a5c-b3b8-ffaccb84cbbd Version: $LATEST
END RequestId: 74acaa9f-5b80-4a5c-b3b8-ffaccb84cbbd
REPORT RequestId: 74acaa9f-5b80-4a5c-b3b8-ffaccb84cbbd  Duration: 2.31 ms       Billed Duration: 3 ms   Memory Size: 128 MB     Max Memory Used: 67 MB

$ cat stdout.log

{"statusCode":200,"body":"{\"message\":\"hello world\"}"}%
```

### Boto3 파라미터를 사용자 지정합니다.
<a name="using-sam-cli-remote-invoke-options-boto3"></a>

의 AWS SAM CLI 경우 `sam remote invoke`는 Python용 AWS SDK(Boto3)를 활용하여 클라우드의 리소스와 상호 작용합니다. `--parameter` 옵션을 사용하여 Boto3 파라미터를 사용자 지정할 수 있습니다. 사용자 지정할 수 있는 지원되는 파라미터 목록은 `--parameter` 섹션을 참조하세요.

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

**Lambda 함수를 간접 호출하여 파라미터 값을 검증하고 권한을 확인합니다.**

```
$ sam remote invoke HelloWorldFunction --stack-name sam-app --parameter InvocationType="DryRun"
```

**단일 명령으로 `--parameter` 옵션을 여러 번 사용하여 여러 파라미터를 제공합니다.**

```
$ sam remote invoke HelloWorldFunction --stack-name sam-app --parameter InvocationType="Event" --parameter LogType="None"
```

### 기타 옵션
<a name="using-sam-cli-remote-invoke-options-other"></a>

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

## 프로젝트 구성 파일을 구성합니다.
<a name="using-sam-cli-remote-invoke-configure"></a>

구성 파일에서 `sam remote invoke`를 구성하려면 테이블에서 `remote_invoke`를 사용합니다. 다음은 `sam remote invoke` 명령의 기본값을 구성하는 `samconfig.toml` 파일의 예입니다.

```
...
version =0.1

[default]
...
[default.remote_invoke.parameters]
stack_name = "cloud-app"
event = '{"message": "Hello!"}'
```

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

사용의 기본 예제는 *AWS 컴퓨팅 블로그*의 [AWS SAM 원격을 사용하여 함수 테스트를 AWS Lambda](https://aws.amazon.com/blogs/compute/testing-aws-lambda-functions-with-aws-sam-remote-invoke/) `sam remote invoke`참조하세요.

### Kinesis Data Streams 예제
<a name="using-sam-cli-remote-invoke-examples-kinesis"></a>

#### 기본 예제
<a name="using-sam-cli-remote-invoke-examples-kinesis-basic"></a>

**파일에서 Kinesis Data Streams 애플리케이션으로 데이터 레코드를 전송합니다. 리소스 ID에 대한 ARN을 제공하여 Kinesis Data Streams 애플리케이션을 식별할 수 있습니다.**

```
$ sam remote invoke arn:aws:kinesis:us-west-2:01234567890:stream/kinesis-example-KinesisStream-BgnLcAey4xUQ --event-file event.json
```

**명령줄에 제공된 이벤트를 Kinesis Data Streams 애플리케이션으로 전송합니다.**

```
$ sam remote invoke KinesisStream --stack-name kinesis-example --event hello-world

Putting record to Kinesis data stream KinesisStream                                                             
Auto converting value 'hello-world' into JSON '"hello-world"'. If you don't want auto-conversion, please provide
a JSON string as event                                                                                          
{
  "ShardId": "shardId-000000000000",
  "SequenceNumber": "49646251411914806775980903986194508740483329854174920706"
}%
```

**Kinesis Data Streams 애플리케이션의 물리적 ID를 가져옵니다. 그런 다음 명령줄에서 이벤트를 제공합니다.**

```
$ sam list resources --stack-name kinesis-example --output json

[
  {
    "LogicalResourceId": "KinesisStream",
    "PhysicalResourceId": "kinesis-example-KinesisStream-ZgnLcQey4xUQ"
  }
]

$ sam remote invoke kinesis-example-KinesisStream-ZgnLcQey4xUQ --event hello

Putting record to Kinesis data stream KinesisStream                                                             
Auto converting value 'hello' into JSON '"hello"'. If you don't want auto-conversion, please provide a JSON     
string as event                                                                                                 
{
  "ShardId": "shardId-000000000000",
  "SequenceNumber": "49646251411914806775980904340716841045751814812900261890"
}%
```

**명령줄에 JSON 문자열을 이벤트로 제공합니다.**

```
$ sam remote invoke KinesisStream --stack-name kinesis-example --event '{"method": "GET", "body": ""}'                      

Putting record to Kinesis data stream KinesisStream                                                             
{
  "ShardId": "shardId-000000000000",
  "SequenceNumber": "49646251411914806775980904492868617924990209230536441858"
}%
```

**Kinesis Data Streams 애플리케이션에 빈 이벤트를 전송합니다.**

```
$ sam remote invoke KinesisStream --stack-name kinesis-example

Putting record to Kinesis data stream KinesisStream                                                             
{
  "ShardId": "shardId-000000000000",
  "SequenceNumber": "49646251411914806775980904866469008589597168190416224258"
}%
```

**응답을 JSON 형식으로 반환합니다 AWS SAM CLI.**

```
$ sam remote invoke KinesisStream --stack-name kinesis-example --event '{"hello": "world"}' --output json

Putting record to Kinesis data stream KinesisStream                                                             
{
  "ShardId": "shardId-000000000000",
  "SequenceNumber": "49646251411914806775980905078409420803696667195489648642",
  "ResponseMetadata": {
    "RequestId": "ebbbd307-3e9f-4431-b67c-f0715e9e353e",
    "HTTPStatusCode": 200,
    "HTTPHeaders": {
      "x-amzn-requestid": "ebbbd307-3e9f-4431-b67c-f0715e9e353e",
      "x-amz-id-2": "Q3yBcgTwtPaQTV26IKclbECmZikUYOzKY+CzcxA84ZHgCkc5T2N/ITWg6RPOQcWw8Gn0tNPcEJBEHyVVqboJAPgCritqsvCu",
      "date": "Thu, 09 Nov 2023 18:13:10 GMT",
      "content-type": "application/x-amz-json-1.1",
      "content-length": "110"
    },
    "RetryAttempts": 0
  }
}%
```

**JSON 출력을 stdout으로 반환합니다.**

```
$ sam remote invoke KinesisStream --stack-name kinesis-example --event '{"hello": "world"}' --output json 1> stdout.log

Putting record to Kinesis data stream KinesisStream                                                             

$ cat stdout.log
{
  "ShardId": "shardId-000000000000",
  "SequenceNumber": "49646251411914806775980906397777867595039988349006774274",
  "ResponseMetadata": {
    "RequestId": "f4290006-d84b-b1cd-a9ee-28306eeb2939",
    "HTTPStatusCode": 200,
    "HTTPHeaders": {
      "x-amzn-requestid": "f4290006-d84b-b1cd-a9ee-28306eeb2939",
      "x-amz-id-2": "npCqz+IBKpoL4sQ1ClbUmxuJlbeA24Fx1UgpIrS6mm2NoIeV2qdZSN5AhNurdssykXajBrXaC9anMhj2eG/h7Hnbf+bPuotU",
      "date": "Thu, 09 Nov 2023 18:33:26 GMT",
      "content-type": "application/x-amz-json-1.1",
      "content-length": "110"
    },
    "RetryAttempts": 0
  }
}%
```

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

#### 기본 예제
<a name="using-sam-cli-remote-invoke-examples-lambda-basic"></a>

**ARN을 리소스 ID로 제공하여 Lambda 함수를 간접 호출합니다.**

```
$ sam remote invoke arn:aws:lambda:us-west-2:012345678910:function:sam-app-HelloWorldFunction-ohRFEn2RuAvp
```

**논리적 ID를 리소스 ID로 제공하여 Lambda 함수를 간접 호출합니다.**

또한 `--stack-name` 옵션을 사용하여 CloudFormation 스택 이름을 제공해야 합니다. 다음은 예제입니다.

```
$ sam remote invoke HelloWorldFunction --stack-name sam-app
```

애플리케이션에 단일 Lambda 함수가 포함된 경우 해당 함수의 논리적 ID를 지정하지 않아도 됩니다. `--stack-name` 옵션만 제공할 수 있습니다. 다음은 예제입니다.

```
$ sam remote invoke --stack-name sam-app
```

**물리적 ID를 리소스 ID로 제공하여 Lambda 함수를 간접 호출합니다.**

를 사용하여 배포할 때 물리적 ID가 생성됩니다 CloudFormation.

```
$ sam remote invoke sam-app-HelloWorldFunction-TZvxQRFNv0k4
```

**하위 스택의 Lambda 함수를 간접 호출합니다.**

이 예제에서 애플리케이션에는 다음과 같은 디렉터리 구조를 포함합니다.

```
lambda-example
├── childstack
│   ├── function
│   │   ├── __init__.py
│   │   ├── app.py
│   │   └── requirements.txt
│   └── template.yaml
├── events
│   └── event.json
├── samconfig.toml
└── template.yaml
```

`childstack`에 대한 Lambda 함수를 간접 호출하기 위해 다음을 실행합니다.

```
$ sam remote invoke ChildStack/HelloWorldFunction --stack-name lambda-example

Invoking Lambda Function HelloWorldFunction                                                                     
START RequestId: 207a864b-e67c-4307-8478-365b004d4bcd Version: $LATEST
END RequestId: 207a864b-e67c-4307-8478-365b004d4bcd
REPORT RequestId: 207a864b-e67c-4307-8478-365b004d4bcd  Duration: 1.27 ms       Billed Duration: 2 ms   Memory Size: 128 MB     Max Memory Used: 36 MB  Init Duration: 111.07 ms
{"statusCode": 200, "body": "{\"message\": \"Hello\", \"received_event\": {}}"}%
```

#### 응답을 스트리밍하도록 Lambda 함수 구성
<a name="using-sam-cli-remote-invoke-examples-lambda-stream"></a>

이 예제에서는 AWS SAMCLI를 사용하여 응답을 스트리밍하도록 구성된 Lambda 함수를 포함하는 새로운 서버리스 애플리케이션을 초기화합니다. 애플리케이션을에 배포 AWS 클라우드 하고 `sam remote invoke`를 사용하여 클라우드에서 함수와 상호 작용합니다.

먼저 `sam init` 명령을 실행하여 새 서버리스 애플리케이션을 생성합니다. **Lambda 응답 스트리밍** 빠른 시작 템플릿을 선택하고 애플리케이션 이름을 **lambda-streaming-nodejs-app**으로 지정합니다.

```
$ sam init
	
	You can preselect a particular runtime or package type when using the `sam init` experience.
	Call `sam init --help` to learn more.
	
	Which template source would you like to use?
	        1 - AWS Quick Start Templates
	        2 - Custom Template Location
	Choice: 1
	
	Choose an AWS Quick Start application template
	        1 - Hello World Example
	        ...
	        9 - Lambda Response Streaming
	        ...
	        15 - Machine Learning
	Template: 9
	
	Which runtime would you like to use?
	        1 - go (provided.al2)
	        2 - nodejs18.x
	        3 - nodejs16.x
	Runtime: 2
	
	Based on your selections, the only Package type available is Zip.
	We will proceed to selecting the Package type as Zip.
	
	Based on your selections, the only dependency manager available is npm.
	We will proceed copying the template using npm.
	
	Would you like to enable X-Ray tracing on the function(s) in your application?  [y/N]: ENTER
	
	Would you like to enable monitoring using CloudWatch Application Insights?
	For more info, please view https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/cloudwatch-application-insights.html [y/N]: ENTER
	
	Project name [sam-app]: lambda-streaming-nodejs-app
	
	    -----------------------
	    Generating application:
	    -----------------------
	    Name: lambda-streaming-nodejs-app
	    Runtime: nodejs18.x
	    Architectures: x86_64
	    Dependency Manager: npm
	    Application Template: response-streaming
	    Output Directory: .
	    Configuration file: lambda-streaming-nodejs-app/samconfig.toml
	    
	    Next steps can be found in the README file at lambda-streaming-nodejs-app/README.md
	        
	
	Commands you can use next
	=========================
	[*] Create pipeline: cd lambda-streaming-nodejs-app && sam pipeline init --bootstrap
	[*] Validate SAM template: cd lambda-streaming-nodejs-app && sam validate
	[*] Test Function in the Cloud: cd lambda-streaming-nodejs-app && sam sync --stack-name {stack-name} --watch
```

는 AWS SAM CLI 다음 구조로 프로젝트를 생성합니다.

```
lambda-streaming-nodejs-app
	├── README.md
	├── __tests__
	│   └── unit
	│       └── index.test.js
	├── package.json
	├── samconfig.toml
	├── src
	│   └── index.js
	└── template.yaml
```

다음은 Lambda 함수 코드의 예제입니다.

```
exports.handler = awslambda.streamifyResponse(
	  async (event, responseStream, context) => {
	    const httpResponseMetadata = {
	      statusCode: 200,
	      headers: {
	        "Content-Type": "text/html",
	        "X-Custom-Header": "Example-Custom-Header"
	      }
	    };
	
	    responseStream = awslambda.HttpResponseStream.from(responseStream, httpResponseMetadata);
	    // It's recommended to use a `pipeline` over the `write` method for more complex use cases.
	    // Learn more: https://docs.aws.amazon.com/lambda/latest/dg/configuration-response-streaming.html
	    responseStream.write("<html>");
	    responseStream.write("<p>First write!</p>");
	
	    responseStream.write("<h1>Streaming h1</h1>");
	    await new Promise(r => setTimeout(r, 1000));
	    responseStream.write("<h2>Streaming h2</h2>");
	    await new Promise(r => setTimeout(r, 1000));
	    responseStream.write("<h3>Streaming h3</h3>");
	    await new Promise(r => setTimeout(r, 1000));
	
	    // Long strings will be streamed
	    const loremIpsum1 = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque vitae mi tincidunt tellus ultricies dignissim id et diam. Morbi pharetra eu nisi et finibus. Vivamus diam nulla, vulputate et nisl cursus, pellentesque vehicula libero. Cras imperdiet lorem ante, non posuere dolor sollicitudin a. Vestibulum ipsum lacus, blandit nec augue id, lobortis dictum urna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Morbi auctor orci eget tellus aliquam, non maximus massa porta. In diam ante, pulvinar aliquam nisl non, elementum hendrerit sapien. Vestibulum massa nunc, mattis non congue vitae, placerat in quam. Nam vulputate lectus metus, et dignissim erat varius a.";
	    responseStream.write(`<p>${loremIpsum1}</p>`);
	    await new Promise(r => setTimeout(r, 1000));
	
	    responseStream.write("<p>DONE!</p>");
	    responseStream.write("</html>");
	    responseStream.end();
	  }
	);
```

다음은 `template.yaml` 파일의 예제입니다. Lambda 함수의 응답 스트리밍은 `FunctionUrlConfig` 속성을 사용하여 구성됩니다.

```
AWSTemplateFormatVersion: '2010-09-09'
	Transform: AWS::Serverless-2016-10-31
	
	Description: >
	  Sample SAM Template for lambda-streaming-nodejs-app
	  
	Resources:
	  StreamingFunction:
	    Type: AWS::Serverless::Function
	    Properties:
	      CodeUri: src/
	      Handler: index.handler
	      Runtime: nodejs18.x
	      Architectures:
	        - x86_64
	      Timeout: 10
	      FunctionUrlConfig:
	        AuthType: AWS_IAM
	        InvokeMode: RESPONSE_STREAM
	
	Outputs:
	  StreamingFunction:
	    Description: "Streaming Lambda Function ARN"
	    Value: !GetAtt StreamingFunction.Arn
	  StreamingFunctionURL:
	    Description: "Streaming Lambda Function URL"
	    Value: !GetAtt StreamingFunctionUrl.FunctionUrl
```

일반적으로 `sam build` 및 `sam deploy --guided`를 사용하여 프로덕션 애플리케이션을 빌드하고 배포할 수 있습니다. 이 예제에서는 개발 환경을 가정하고 `sam sync` 명령을 사용하여 애플리케이션을 빌드하고 배포해 보겠습니다.

**참고**  
이 `sam sync` 명령은 개발 환경에 권장됩니다. 자세한 내용은 [를 사용하여 sam sync에 동기화 소개 AWS 클라우드](using-sam-cli-sync.md)를 참조하세요.

`sam sync`를 실행하기 전에 `samconfig.toml` 파일에 프로젝트가 올바르게 구성되어 있는지 확인합니다. 가장 중요한 것은 `stack_name` 및 `watch`의 값을 검증하는 것입니다. 구성 파일에 이러한 값을 지정하면 명령줄에서 값을 제공할 필요가 없습니다.

```
version = 0.1
	
	[default]
	[default.global.parameters]
	stack_name = "lambda-streaming-nodejs-app"
	
	[default.build.parameters]
	cached = true
	parallel = true
	
	[default.validate.parameters]
	lint = true
	
	[default.deploy.parameters]
	capabilities = "CAPABILITY_IAM"
	confirm_changeset = true
	resolve_s3 = true
	s3_prefix = "lambda-streaming-nodejs-app"
	region = "us-west-2"
	image_repositories = []
	
	[default.package.parameters]
	resolve_s3 = true
	
	[default.sync.parameters]
	watch = true
	
	[default.local_start_api.parameters]
	warm_containers = "EAGER"
	
	[default.local_start_lambda.parameters]
	warm_containers = "EAGER"
```

다음으로 `sam sync`를 실행하여 애플리케이션을 빌드하고 배포합니다. `--watch` 옵션이 구성 파일에 구성되어 있으므로 AWS SAMCLI는 애플리케이션을 빌드하고, 애플리케이션을 배포하고, 변경 사항을 확인합니다.

```
$ sam sync
	
	The SAM CLI will use the AWS Lambda, Amazon API Gateway, and AWS StepFunctions APIs to upload your code   
	without                                                                                                   
	performing a CloudFormation deployment. This will cause drift in your CloudFormation stack.               
	**The sync command should only be used against a development stack**.                                     
	                                                                                                          
	Queued infra sync. Waiting for in progress code syncs to complete...                                      
	Starting infra sync.                                                                                      
	Building codeuri:                                                                                         
	/Users/.../lambda-streaming-nodejs-app/src runtime: nodejs18.x metadata: {} architecture: x86_64 functions: StreamingFunction  
	package.json file not found. Continuing the build without dependencies.                                   
	Running NodejsNpmBuilder:CopySource                                                                       
	
	Build Succeeded
	
	Successfully packaged artifacts and wrote output template to file /var/folders/45/5ct135bx3fn2551_ptl5g6_80000gr/T/tmpavrzdhgp.
	Execute the following command to deploy the packaged template
	sam deploy --template-file /var/folders/45/5ct135bx3fn2551_ptl5g6_80000gr/T/tmpavrzdhgp --stack-name <YOUR STACK NAME>
	
	
	        Deploying with following values
	        ===============================
	        Stack name                   : lambda-streaming-nodejs-app
	        Region                       : us-west-2
	        Disable rollback             : False
	        Deployment s3 bucket         : aws-sam-cli-managed-default-samclisam-s3-demo-bucket-1a4x26zbcdkqr
	        Capabilities                 : ["CAPABILITY_NAMED_IAM", "CAPABILITY_AUTO_EXPAND"]
	        Parameter overrides          : {}
	        Signing Profiles             : null
	
	Initiating deployment
	=====================
	
	
	2023-06-20 12:11:16 - Waiting for stack create/update to complete
	
	CloudFormation events from stack operations (refresh every 0.5 seconds)
	-----------------------------------------------------------------------------------------------------
	ResourceStatus            ResourceType              LogicalResourceId         ResourceStatusReason    
	-----------------------------------------------------------------------------------------------------
	CREATE_IN_PROGRESS        AWS::CloudFormation::St   lambda-streaming-         Transformation          
	                          ack                       nodejs-app                succeeded               
	CREATE_IN_PROGRESS        AWS::IAM::Role            StreamingFunctionRole     -                       
	CREATE_IN_PROGRESS        AWS::CloudFormation::St   AwsSamAutoDependencyLay   -                       
	                          ack                       erNestedStack                                     
	CREATE_IN_PROGRESS        AWS::IAM::Role            StreamingFunctionRole     Resource creation       
	                                                                              Initiated               
	CREATE_IN_PROGRESS        AWS::CloudFormation::St   AwsSamAutoDependencyLay   Resource creation       
	                          ack                       erNestedStack             Initiated               
	CREATE_COMPLETE           AWS::IAM::Role            StreamingFunctionRole     -                       
	CREATE_COMPLETE           AWS::CloudFormation::St   AwsSamAutoDependencyLay   -                       
	                          ack                       erNestedStack                                     
	CREATE_IN_PROGRESS        AWS::Lambda::Function     StreamingFunction         -                       
	CREATE_IN_PROGRESS        AWS::Lambda::Function     StreamingFunction         Resource creation       
	                                                                              Initiated               
	CREATE_COMPLETE           AWS::Lambda::Function     StreamingFunction         -                       
	CREATE_IN_PROGRESS        AWS::Lambda::Url          StreamingFunctionUrl      -                       
	CREATE_IN_PROGRESS        AWS::Lambda::Url          StreamingFunctionUrl      Resource creation       
	                                                                              Initiated               
	CREATE_COMPLETE           AWS::Lambda::Url          StreamingFunctionUrl      -                       
	CREATE_COMPLETE           AWS::CloudFormation::St   lambda-streaming-         -                       
	                          ack                       nodejs-app                                        
	-----------------------------------------------------------------------------------------------------
	
	CloudFormation outputs from deployed stack
	-------------------------------------------------------------------------------------------------------
	Outputs                                                                                               
	-------------------------------------------------------------------------------------------------------
	Key                 StreamingFunction                                                                 
	Description         Streaming Lambda Function ARN                                                     
	Value               arn:aws:lambda:us-west-2:012345678910:function:lambda-streaming-nodejs-app-       
	StreamingFunction-gUmhO833A0vZ                                                                        
	
	Key                 StreamingFunctionURL                                                              
	Description         Streaming Lambda Function URL                                                     
	Value               https://wxgkcc2dyntgtrwhf2dgdcvylu0rnnof.lambda-url.us-west-2.on.aws/             
	-------------------------------------------------------------------------------------------------------
	
	                                                                                                          
	Stack creation succeeded. Sync infra completed.                                                           
	                                                                                                          
	Infra sync completed.
```

이제 함수가 클라우드에 배포되었으므로 `sam remote invoke`를 사용하여 함수와 상호 작용할 수 있습니다. AWS SAMCLI는 함수가 응답 스트리밍을 위해 구성되었음을 자동으로 감지하고 즉시 함수의 스트리밍된 응답을 실시간으로 출력하기 시작합니다.

```
$ sam remote invoke StreamingFunction
	
	Invoking Lambda Function StreamingFunction                                              
	{"statusCode":200,"headers":{"Content-Type":"text/html","X-Custom-Header":"Example-Custom-Header"}}<html><p>First write!</p><h1>Streaming h1</h1><h2>Streaming h2</h2><h3>Streaming h3</h3><p>Lorem ipsum dolor sit amet, consectetur adipiscing elit. Quisque vitae mi tincidunt tellus ultricies dignissim id et diam. Morbi pharetra eu nisi et finibus. Vivamus diam nulla, vulputate et nisl cursus, pellentesque vehicula libero. Cras imperdiet lorem ante, non posuere dolor sollicitudin a. Vestibulum ipsum lacus, blandit nec augue id, lobortis dictum urna. Vestibulum ante ipsum primis in faucibus orci luctus et ultrices posuere cubilia curae; Morbi auctor orci eget tellus aliquam, non maximus massa porta. In diam ante, pulvinar aliquam nisl non, elementum hendrerit sapien. Vestibulum massa nunc, mattis non congue vitae, placerat in quam. Nam vulputate lectus metus, et dignissim erat varius a.</p><p>DONE!</p></html>START RequestId: 1e4cdf04-60de-4769-b3a2-c1481982deb4 Version: $LATEST
	END RequestId: 1e4cdf04-60de-4769-b3a2-c1481982deb4
	REPORT RequestId: 1e4cdf04-60de-4769-b3a2-c1481982deb4  Duration: 4088.66 ms    Billed Duration: 4089 ms        Memory Size: 128 MB     Max Memory Used: 68 MB  Init Duration: 168.45 ms
```

함수 코드를 수정하면 AWS SAMCLI는 변경 사항을 즉시 감지하고 즉시 배포합니다. 다음은 함수 코드를 변경한 후의 AWS SAMCLI 출력의 예입니다.

```
Syncing Lambda Function StreamingFunction...                                             
	Building codeuri:                                                                        
	/Users/.../lambda-streaming-nodejs-app/src runtime: nodejs18.x metadata: {} architecture:    
	x86_64 functions: StreamingFunction                                                      
	package.json file not found. Continuing the build without dependencies.                  
	Running NodejsNpmBuilder:CopySource                                                      
	Finished syncing Lambda Function StreamingFunction.                                      
	Syncing Layer StreamingFunctione9cfe924DepLayer...                                       
	SyncFlow [Layer StreamingFunctione9cfe924DepLayer]: Skipping resource update as the      
	content didn't change                                                                    
	Finished syncing Layer StreamingFunctione9cfe924DepLayer.
```

이제 다시 `sam remote invoke`를 사용하여 클라우드에서 함수와 상호 작용하고 변경 사항을 테스트할 수 있습니다.

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

#### 기본 예제
<a name="using-sam-cli-remote-invoke-examples-sqs-basic"></a>

**ARN을 리소스 ID로 제공하여 Amazon SQS 대기열을 간접 호출합니다.**

```
$ sam remote invoke arn:aws:sqs:us-west-2:01234567890:sqs-example-4DonhBsjsW1b --event '{"hello": "world"}' --output json

Sending message to SQS queue MySqsQueue                                                                         
{
  "MD5OfMessageBody": "49dfdd54b01cbcd2d2ab5e9e5ee6b9b9",
  "MessageId": "4f464cdd-15ef-4b57-bd72-3ad225d80adc",
  "ResponseMetadata": {
    "RequestId": "95d39377-8323-5ef0-9223-ceb198bd09bd",
    "HTTPStatusCode": 200,
    "HTTPHeaders": {
      "x-amzn-requestid": "95d39377-8323-5ef0-9223-ceb198bd09bd",
      "date": "Wed, 08 Nov 2023 23:27:26 GMT",
      "content-type": "application/x-amz-json-1.0",
      "content-length": "106",
      "connection": "keep-alive"
    },
    "RetryAttempts": 0
  }
}%
```

### Step Functions 예제
<a name="using-sam-cli-remote-invoke-examples-sf"></a>

#### 기본 예제
<a name="using-sam-cli-remote-invoke-examples-sf-basic"></a>

**물리적 ID를 리소스 ID로 제공하여 상태 시스템을 간접 호출합니다.**

먼저 `sam list resources`를 사용하여 물리적 ID를 가져옵니다.

```
$ sam list resources --stack-name state-machine-example --output json

[
  {
    "LogicalResourceId": "HelloWorldStateMachine",
    "PhysicalResourceId": "arn:aws:states:us-west-2:513423067560:stateMachine:HelloWorldStateMachine-z69tFEUx0F66"
  },
  {
    "LogicalResourceId": "HelloWorldStateMachineRole",
    "PhysicalResourceId": "simple-state-machine-HelloWorldStateMachineRole-PduA0BDGuFXw"
  }
]
```

다음으로 물리적 ID를 리소스 ID로 사용하여 상태 시스템을 간접 호출합니다. 명령줄에서 `--event` 옵션을 사용하여 이벤트를 전달합니다.

```
$ sam remote invoke arn:aws:states:us-west-2:01234567890:stateMachine:HelloWorldStateMachine-z69tFEUx0F66 --event '{"is_developer": true}'

Invoking Step Function arn:aws:states:us-west-2:01234567890:stateMachine:HelloWorldStateMachine-z69tFEUx0F66   
"Hello Developer World"%
```

**빈 이벤트를 전달하여 상태 시스템을 간접 호출합니다.**

```
$ sam remote invoke HelloWorldStateMachine --stack-name state-machine-example

Invoking Step Function HelloWorldStateMachine                                                                   
"Hello World"%
```

## 관련 링크
<a name="using-sam-cli-remote-invoke-links"></a>

`sam remote invoke` 및 사용과 관련된 설명서는 다음을 AWS SAM CLI참조하세요.
+ [sam remote invoke](sam-cli-command-reference-remote-invoke.md)
+ [AWS SAMCLI 문제 해결](sam-cli-troubleshooting.md)

# 를 사용하여 로컬 통합 테스트 자동화 AWS SAM
<a name="serverless-sam-cli-using-automated-tests"></a>

[sam local invoke를 사용한 테스트 소개](using-sam-cli-local-invoke.md)를 사용하여 코드를 수동으로 테스트할 수 있지만를 사용하면 자동 통합 테스트를 사용하여 코드를 테스트할 AWS SAM 수도 있습니다. 통합 테스트를 사용하면 개발 주기 초기에 문제를 감지하고, 코드 품질을 개선하고, 시간을 절약하면서 비용을 절감할 수 있습니다.

에서 자동 통합 테스트를 작성하려면 AWS SAM먼저 AWS 클라우드에 배포하기 전에 로컬 Lambda 함수에 대한 테스트를 실행합니다. [sam local start-lambda를 사용한 테스트 소개](using-sam-cli-local-start-lambda.md) 명령은 Lambda 간접 호출 엔드포인트를 에뮬레이션하는 로컬 엔드포인트를 시작합니다. 자동화된 테스트에서 이를 간접 호출할 수 있습니다. 이 엔드포인트는 Lambda 간접 호출 엔드포인트를 에뮬레이션하므로 테스트를 한 번 작성한 다음 로컬 Lambda 함수 또는 배포된 Lambda 함수에 대해 수정 없이 테스트를 실행할 수 있습니다. CI/CD 파이프라인에 배포된 AWS SAM 스택에 대해 동일한 테스트를 실행할 수도 있습니다.

프로세스 방법은 다음과 같습니다.

1. 로컬 Lambda 엔드포인트를 시작합니다.

    AWS SAM 템플릿이 포함된 디렉터리에서 다음 명령을 실행하여 로컬 Lambda 엔드포인트를 시작합니다.

   ```
   sam local start-lambda
   ```

   이 명령은 AWS Lambda를 에뮬레이션하는 `http://127.0.0.1:3001`에서 로컬 엔드포인트를 시작합니다. 이 로컬 Lambda 엔드포인트에 대해 자동 테스트를 실행할 수 있습니다. AWS CLI 또는 SDK를 사용하여이 엔드포인트를 호출하면 요청에 지정된 Lambda 함수를 로컬로 실행하고 응답을 반환합니다.

1. 로컬 Lambda 엔드포인트에 대해 통합 테스트를 실행합니다.

   통합 테스트에서 AWS SDK를 사용하여 테스트 데이터로 Lambda 함수를 호출하고, 응답을 기다리고, 응답이 예상과 일치하는지 확인할 수 있습니다. 통합 테스트를 로컬에서 실행하려면 Lambda 간접 호출 API 직접 호출을 전송하여 이전 단계에서 시작한 로컬 Lambda 엔드포인트를 간접 호출하도록 AWS SDK를 구성해야 합니다.

   다음은 Python 예제입니다(다른 언어용 AWS SDKs의 구성은 비슷함).

   ```
   import boto3
   import botocore
   
   # Set "running_locally" flag if you are running the integration test locally
   running_locally = True
   
   if running_locally:
   
       # Create Lambda SDK client to connect to appropriate Lambda endpoint
       lambda_client = boto3.client('lambda',
           region_name="us-west-2",
           endpoint_url="http://127.0.0.1:3001",
           use_ssl=False,
           verify=False,
           config=botocore.client.Config(
               signature_version=botocore.UNSIGNED,
               read_timeout=15,
               retries={'max_attempts': 0},
           )
       )
   else:
       lambda_client = boto3.client('lambda')
   
   
   # Invoke your Lambda function as you normally usually do. The function will run
   # locally if it is configured to do so
   response = lambda_client.invoke(FunctionName="HelloWorldFunction")
   
   # Verify the response
   assert response == "Hello World"
   ```

   `running_locally`을 `False`로 설정함으로써 배포된 Lambda 함수를 테스트하기 위해 이 코드를 사용할 수 있습니다. 이렇게 하면 AWS 클라우드에서에 연결할 AWS SDK AWS Lambda 가 설정됩니다.

# 를 사용하여 샘플 이벤트 페이로드 생성 AWS SAM
<a name="serverless-sam-cli-using-generate-event"></a>

Lambda 함수를 테스트하기 위해 다른 AWS 서비스에 의해 트리거될 때 Lambda 함수가 수신할 데이터를 모방하는 샘플 이벤트 페이로드를 생성하고 사용자 지정할 수 있습니다. 여기에는 API Gateway, CloudFormation, Amazon S3 등과 같은 서비스가 포함됩니다.

샘플 이벤트 페이로드를 생성하면 라이브 환경에서 작업할 필요 없이 다양한 입력을 사용하여 Lambda 함수의 동작을 테스트할 수 있습니다. 또한이 접근 방식은 함수를 테스트하기 위한 AWS 서비스 이벤트 샘플을 수동으로 생성하는 것과 비교할 때 시간을 절약합니다.

샘플 이벤트 페이로드를 생성할 수 있는 전체 서비스 목록을 보려면 다음 명령을 사용합니다.

```
sam local generate-event --help
```

특정 서비스에 사용할 수 있는 옵션 목록을 보려면 다음 명령을 사용합니다.

```
sam local generate-event [SERVICE] --help
```

예시:

```
#Generates the event from S3 when a new object is created
sam local generate-event s3 put

# Generates the event from S3 when an object is deleted
sam local generate-event s3 delete
```

# 내구성 함수 테스트 및 디버깅
<a name="test-and-debug-durable-functions"></a>

내구성 있는 함수를 로컬에서 테스트하고 디버깅하는 작업은 체크포인트 및 재생을 자동으로 지원하는 일반 Lambda 함수와 비슷하게 작동합니다. 이 가이드에서는 일반적인 테스트 시나리오와 문제 해결 기법을 다룹니다.

## 로컬 테스트 워크플로
<a name="test-and-debug-durable-functions-workflow"></a>

내구성이 뛰어난 함수를 로컬에서 테스트할 때 워크플로는 일반 Lambda 함수와 다릅니다.

**내구성 있는 함수 테스트 워크플로**

1. 애플리케이션을 빌드합니다.

   ```
   $ sam build
   ```

1. 내구성 있는 함수를 호출합니다.

   ```
   $ sam local invoke MyDurableFunction --durable-execution-name test 
   ```

1. 필요한 경우 실행 기록을 확인합니다.

   ```
   $ sam local execution history execution-id
   ```

## 일반적인 테스트 시나리오
<a name="test-and-debug-durable-functions-scenarios"></a>

### 체크포인트 동작 테스트
<a name="test-and-debug-durable-functions-scenarios-checkpoints"></a>

함수가 상태를 올바르게 체크포인트하는지 테스트하려면:

```
# Example Python durable function
def handler(event, context):
    # This will create a checkpoint
    context.wait(10)  # Wait 10 seconds
    
    # Function resumes here after wait
    return {"message": "Function resumed after wait"}
```

이 함수를 로컬에서 호출하면 대기 기간이 자동으로 처리됩니다.

### 콜백 시나리오 테스트
<a name="test-and-debug-durable-functions-scenarios-callbacks"></a>

외부 콜백을 기다리는 함수의 경우:

1. 콜백을 기다리는 내구성 함수 시작

1. 다른 터미널에서 콜백을 해결합니다.

   ```
   $ sam local callback succeed callback-id
   ```

1. 함수 재개 실행 관찰

## 문제 해결
<a name="test-and-debug-durable-functions-troubleshooting"></a>

### 내구성 함수가 제대로 실행되지 않음
<a name="test-and-debug-durable-functions-troubleshooting-config"></a>

**문제:** 함수가 내구성 있는 함수로 동작하지 않습니다.

**솔루션:**
+ SAM 템플릿에 `DurableConfig`이 설정되어 있는지 확인
+ 함수 코드가 내구성 있는 함수 SDK 메서드(예: `context.wait()`)를 사용하는지 확인합니다.
+ 지원되는 런타임(TypeScript, JavaScript, Python)을 사용하고 있는지 확인합니다.

### 실행 기록을 검색할 수 없음
<a name="test-and-debug-durable-functions-troubleshooting-history"></a>

**문제:** `local execution history` 명령이 결과를 반환하지 않습니다.

**솔루션:**
+ 실행 ID가 올바른지 확인
+ 함수가 한 번 이상 호출되었는지 확인

### 콜백 명령이 작동하지 않음
<a name="test-and-debug-durable-functions-troubleshooting-callbacks"></a>

**문제:** 콜백 명령이 보류 중인 작업을 해결하지 못합니다.

**솔루션:**
+ 콜백 ID가 올바른지 확인
+ 함수가 실제로 콜백을 기다리고 있는지 확인합니다.
+ 올바른 콜백 명령 구문을 사용하고 있는지 확인

## 디버깅 팁
<a name="test-and-debug-durable-functions-debugging"></a>
+ **실행 기록 사용** - 실행 기록을 검토하여 내구성 있는 함수의 흐름을 이해합니다.
+ **점진적으로 테스트** - 복잡한 로직을 추가하기 전에 간단한 대기 작업으로 시작
+ **상세 로깅 사용** - 세부 로깅을 활성화하여 실행 흐름 추적

## 자세히 알아보기
<a name="test-and-debug-durable-functions-learn"></a>

테스트 및 디버깅에 대한 자세한 내용은 다음을 참조하세요.
+ [sam local invoke를 사용한 테스트 소개](using-sam-cli-local-invoke.md) - 로컬 호출 설명서
+ [sam local execution history](sam-cli-command-reference-sam-local-execution-history.md) - 실행 기록