sam local invoke を使用したテストの概要 - AWS Serverless Application Model

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

sam local invoke を使用したテストの概要

AWS Serverless Application Model コマンドラインインターフェイス (AWS SAM CLI) sam local invoke サブコマンドを使用して、AWS Lambda 関数の 1 回限りの呼び出しをローカルで開始します。

sam local invoke を使用するには、次を実行して AWS SAM CLI をインストールします。

sam local invoke を使用する前に、次の基本を理解しておくことをお勧めします。

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

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>
  2. アプリケーションに複数の関数が含まれている場合は、関数の論理 ID を指定します。以下に例を示します。

    $ sam local invoke HelloWorldFunction
  3. 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\"}"}%

ログを管理する

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

これらの標準出力を使用して、ローカル開発プロセスをさらに自動化できます。

オプション

カスタムイベントを渡して Lambda 関数を呼び出す

イベントを Lambda 関数に渡すには、--event オプションを使用します。以下に例を示します。

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

sam local generate-event サブコマンドを使用してイベントを作成できます。詳細については、「を使用したテストの概要 sam local generate-event」を参照してください。

Lambda 関数を呼び出すときに環境変数を渡す

Lambda 関数で環境変数を使用する場合は、ローカルテスト中に --env-vars オプションを使用して環境変数を渡すことができます。これは、クラウドで既にデプロイされているアプリケーション内のサービスを使用して、Lambda 関数をローカルでテストするための優れた方法です。以下に例を示します。

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

テンプレートまたは関数を指定する

AWS SAM CLI が参照するテンプレートを指定するには、--template オプションを使用します。AWS SAM CLI は、その AWS SAM テンプレートとそれがポイントするリソースのみをロードします。

ネストされたアプリケーションまたはスタックの関数を呼び出すには、関数の論理 ID とともに、アプリケーションまたはスタックの論理 ID を指定します。以下に例を示します。

$ sam local invoke StackLogicalId/FunctionLogicalId

Terraform プロジェクトから Lambda 関数をテストする

--hook-name オプションを使用して、Terraform プロジェクトから Lambda 関数をローカルでテストします。詳細については、「の使用 AWS SAM CLI with Terraform ローカルデバッグとテスト用」を参照してください。

以下に例を示します。

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

ベストプラクティス

アプリケーションに .aws-sam を実行している sam build ディレクトリがある場合は、関数コードを更新するたびに必ず sam build を実行してください。その後、更新された関数コードをローカルでテストするために sam local invoke を実行します。

ローカルテストは、クラウドにデプロイする前に迅速な開発とテストを行うための優れたソリューションです。ただし、ローカルテストでは、クラウド内のリソース間の許可など、すべてが検証されるわけではありません。可能な限り、アプリケーションをクラウドでテストします。クラウドテストのワークフローを高速化するために sam sync を使用することをお勧めします。

Amazon API Gateway サンプルイベントを生成し、それを使用してローカルで Lambda 関数を呼び出す

まず、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 関数をローカルで呼び出すときに環境変数を渡す

このアプリケーションには、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":"{}"}

詳細はこちら

すべての sam local invoke オプションのリストについては、「sam local invoke」を参照してください。

sam local の使用のデモについては、「ローカル開発用の AWS SAM」を参照してください。YouTube での Serverless Land の SAM を使用したセッションのシリーズのローカル開発環境からの AWS クラウド リソースのテスト