

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

# 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)。