

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# 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 関数の 1 回限りの呼び出しをローカルで開始します。
+ **[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 のサービス はイベントを生成し、各サービスのイベントはそのサービスに合わせて独自にフォーマットされます。

1 つのサービスによって生成されたイベントは、イベントソースとして他のサービスに渡されます。例えば、Amazon Simple Storage Service (Amazon 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 シリーズを使用した Serverless Land Sessions YouTube*のローカル開発環境からの AWS クラウド リソースのテスト](https://www.youtube.com/watch?v=NzPqMrdgD1s&list=PLJo-rJlep0ED198FJnTzhIB5Aut_1vDAd&index=24)。

# sam local invoke を使用したテストの概要
<a name="using-sam-cli-local-invoke"></a>

 AWS Serverless Application Model コマンドラインインターフェイス (AWS SAM CLI) `sam local invoke`サブコマンドを使用して、 AWS Lambda 関数の 1 回限りの呼び出しをローカルで開始します。
+ の概要については 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 SAM CLI は現在の作業ディレクトリがプロジェクトのルートディレクトリであると想定します。 AWS SAM CLI は最初に `.aws-sam` サブフォルダ内の `template.[yaml|yml]` ファイルを検索します。見つからない場合、 AWS SAM CLI は現在の作業ディレクトリ内で `template.[yaml|yml]` ファイルを探します。

**Lambda 関数をローカルで呼び出すには**

1. プロジェクトのルートディレクトリから次のコマンドを実行します。

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

1. アプリケーションに複数の関数が含まれている場合は、関数の論理 ID を指定します。以下に例を示します。

   ```
   $ sam local invoke HelloWorldFunction
   ```

1.  AWS SAM CLI は、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 SAM CLI が参照するテンプレートを指定するには、`--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 SAM CLI をローカルでのデバッグおよびテストに使用する方法](using-samcli-terraform.md)を参照してください。

以下に例を示します。

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

## ベストプラクティス
<a name="using-sam-cli-local-invoke-best"></a>

アプリケーションに `.aws-sam` を実行している `sam build` ディレクトリがある場合は、関数コードを更新するたびに必ず `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 シリーズを使用した Serverless Land Sessions YouTube*のローカル開発環境からの AWS クラウド リソースのテスト](https://www.youtube.com/watch?v=NzPqMrdgD1s&list=PLJo-rJlep0ED198FJnTzhIB5Aut_1vDAd&index=24)。

# 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 SAM CLI は現在の作業ディレクトリがプロジェクトのルートディレクトリであると想定します。 AWS SAM CLI は最初に `.aws-sam` サブフォルダ内の `template.[yaml|yml]` ファイルを検索します。見つからない場合、 AWS SAM CLI は現在の作業ディレクトリ内で `template.[yaml|yml]` ファイルを探します。

**ローカル HTTP サーバーを起動するには**

1. プロジェクトのルートディレクトリから次のコマンドを実行します。

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

1.  AWS SAM CLI は、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 SAM CLI は新しいコンテナを作成してホストすることで関数を自動的に更新します。
   + アプリケーションに `.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 SAM CLI のアップグレード](manage-sam-cli-versions.md#manage-sam-cli-versions-upgrade) を参照してください。

Lambda オーソライザーを使用する Lambda 関数の場合、 AWS SAM CLI は 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 SAM CLI は最初に Lambda オーソライザーを呼び出します。認可が成功すると、 AWS SAM CLI は 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>

デフォルトでは、ローカル HTTP サーバー経由で関数が呼び出されるたびに、 AWS SAM CLI は新しいコンテナを作成します。関数呼び出しのためにコンテナを自動的に再利用する `--warm-containers` オプションを使用します。これは、 AWS SAM CLI がローカル呼び出しのために Lambda 関数を準備するのにかかる時間を短縮します。`eager` または `lazy` 引数を指定することで、このオプションをさらにカスタマイズできます。
+ `eager` – 起動時にすべての関数のコンテナがロードされ、呼び出し間で保持されます。
+ `lazy` – 各関数が初めて呼び出される場合に限り、コンテナがロードされます。その後、追加の呼び出しのために永続化されます。

以下に例を示します。

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

`--warm-containers` を使用して Lambda 関数コードを変更する場合:
+ アプリケーションに `.aws-sam` ディレクトリがある場合は、`sam build` を実行してアプリケーションのビルドアーティファクト内の関数コードを更新します。
+ コードの変更が検出されると、 AWS SAM CLI は Lambda 関数コンテナを自動的にシャットダウンします。
+ 関数を再度呼び出すと、 AWS SAM CLI は新しいコンテナを自動的に作成します。

### Lambda 関数に使用するコンテナイメージを指定する
<a name="using-sam-cli-local-start-api-options-specify"></a>

デフォルトでは、 AWS SAM CLI は 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 SAM CLI が参照するテンプレートを指定するには、`--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>

アプリケーションに `.aws-sam` を実行している `sam build` ディレクトリがある場合は、関数コードを更新するたびに必ず `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`sam local start-lambda`、 AWS CLI および 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 SAM CLI は現在の作業ディレクトリがプロジェクトのルートディレクトリであると想定します。 AWS SAM CLI は最初に `.aws-sam` サブフォルダ内の `template.[yaml|yml]` ファイルを検索します。見つからない場合、 AWS SAM CLI は現在の作業ディレクトリ内で `template.[yaml|yml]` ファイルを探します。

**sam local start-lambda を使用するには**

1. プロジェクトのルートディレクトリから次のコマンドを実行します。

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

1.  AWS SAM CLI は、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 SAM CLI が参照するテンプレートを指定するには、`--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>

アプリケーションに `.aws-sam` を実行している `sam build` ディレクトリがある場合は、関数コードを更新するたびに必ず `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)」を参照してください。