翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
Lambda コンテナイメージをローカルでテストする
Lambda ランタイムインターフェイスエミュレーターを使用すると、Amazon Elastic Container Registry (Amazon ECR) にアップロードして Lambda にデプロイする前に、コンテナイメージ関数をローカルでテストできます。エミュレータは Lambda Runtime API のプロキシです。これは HTTP リクエストを JSON イベントに変換して、コンテナイメージ内の Lambda 関数に渡す、軽量なウェブサーバーです。
AWS のベースイメージと OS 専用ベースイメージには、ランタイムインターフェイスエミュレータが含まれています。Alpine Linux や Debian イメージなどの代替ベースイメージを使用する場合は、エミュレーターをイメージにビルドすることもできますし、ローカルマシンにインストールすることもできます。
ランタイムインターフェイスエミュレータは、AWS GitHub リポジトリ で使用できます。x86-64 アーキテクチャと arm64 アーキテクチャ用の個別パッケージがあります。
ランタイムインターフェイスエミュレータのガイドライン
ランタイムインターフェイスエミュレータを使用する場合は、次のガイドラインに注意してください。
-
RIE は、Lambda のセキュリティと認証の設定や、Lambda オーケストレーションをエミュレートしません。
Lambda は、命令セットアーキテクチャごとにエミュレータを提供します。
エミュレーターは、AWS X-Ray トレースや、その他の Lambda の統合をサポートしていません。
環境変数
Runtime Interface Emulator は、ローカルで実行しているイメージにある Lambda 関数の、環境変数のサブセットをサポートします。
関数でセキュリティ認証情報を使用する場合は、次の環境変数を設定して、認証情報を設定できます。
AWS_ACCESS_KEY_ID
AWS_SECRET_ACCESS_KEY
AWS_SESSION_TOKEN
AWS_DEFAULT_REGION
関数のタイムアウトを設定するには、AWS_LAMBDA_FUNCTION_TIMEOUT
を設定します。関数の実行を許可する最大秒数を入力します。
エミュレーターは、次の Lambda 環境変数を設定しません。ただし、Lambda サービスで関数を実行するときには、期待される値と一致するように設定できます。
AWS ベースイメージから構築されたイメージのテスト
AWSLambda のベースイメージには、ランタイムインターフェイスエミュレータが含まれています。Docker イメージをビルドした後で、以下の手順に従ってローカルでテストします。
-
docker run コマンドを使用して、Docker イメージを起動します。この例では、docker-image
はイメージ名、test
はタグです。
docker run --platform linux/amd64 -p 9000:8080 docker-image
:test
このコマンドはイメージをコンテナとして実行し、localhost:9000/2015-03-31/functions/function/invocations
でローカルエンドポイントを作成します。
ARM64 命令セットアーキテクチャ用に Docker イメージをビルドした場合は、--platform linux/amd64
の代わりに --platform linux/arm64
オプションを使用してください。
-
新しいターミナルウィンドウから、イベントをローカルエンドポイントにポストします。
- Linux/macOS
-
Linux および macOS では、次の curl
コマンドを実行します。
curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
このコマンドは、空のイベントで関数を呼び出し、応答を返します。サンプル関数コードではなく独自の関数コードを使用している場合は、JSON ペイロードを使用して関数を呼び出すことをお勧めします。例:
curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}
'
- PowerShell
-
で PowerShell、次のInvoke-WebRequest
コマンドを実行します。
Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{}' -ContentType "application/json"
このコマンドは、空のイベントで関数を呼び出し、応答を返します。サンプル関数コードではなく独自の関数コードを使用している場合は、JSON ペイロードを使用して関数を呼び出すことをお勧めします。例:
Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{"payload":"hello world!"}
' -ContentType "application/json"
-
コンテナ ID を取得します。
docker ps
-
「docker kill」コマンドを使用してコンテナを停止します。このコマンドでは、3766c4ab331c
を前のステップのコンテナ ID で置き換えます。
docker kill 3766c4ab331c
代替ベースイメージからビルドされたイメージのテスト
Alpine Linux や Debian イメージなどの代替ベースイメージを使用する場合は、エミュレーターをイメージにビルドすることもできますし、ローカルマシンにインストールすることもできます。
ランタイムインターフェイスエミュレータをイメージに組み込む
イメージにエミュレータを組み込むには
-
スクリプトを作成し、プロジェクトディレクトリに保存します。スクリプトファイルの実行許可を設定します。
スクリプトが AWS_LAMBDA_RUNTIME_API
環境変数の存在を確認したということは、ランタイム API が存在していることを示します。ランタイム API が存在する場合、スクリプトがランタイムインターフェイスクライアントを実行します。それ以外の場合、スクリプトはランタイムインターフェイスエミュレータを実行します。
言語を選択すると、サンプルスクリプトが表示されます。
- Node.js
-
次の例で、/usr/local/bin/npx aws-lambda-ric
は Node.js ランタイムインターフェイスクライアントを起動する npx
コマンドです。
例 entry_script.sh
#!/bin/sh
if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then
exec /usr/local/bin/aws-lambda-rie /usr/local/bin/npx aws-lambda-ric
$@
else
exec /usr/local/bin/npx aws-lambda-ric
$@
fi
Windows を使用している場合は、スクリプトの行末を LF にして保存してください。スクリプトが CRLF を使用している場合、Docker イメージを実行しようとすると次のようなエラーが表示されます。
exec /entry_script.sh: no such file or directory
- Python
-
次の例で、/usr/local/bin/python -m awslambdaric
は Python ランタイムインターフェイスクライアントをスクリプトとして実行するための Python インタープリタコマンドです。
例 entry_script.sh
#!/bin/sh
if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then
exec /usr/local/bin/aws-lambda-rie /usr/local/bin/python -m awslambdaric
$@
else
exec /usr/local/bin/python -m awslambdaric
$@
fi
Windows を使用している場合は、スクリプトの行末を LF にして保存してください。スクリプトが CRLF を使用している場合、Docker イメージを実行しようとすると次のようなエラーが表示されます。
exec /entry_script.sh: no such file or directory
- Java
-
次の例で、/usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda
はクラスパスを Java ランタイムインターフェイスクライアントに設定します。
例 entry_script.sh
#!/bin/sh
if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then
exec /usr/local/bin/aws-lambda-rie /usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda
$@
else
exec /usr/bin/java -cp './*' com.amazonaws.services.lambda.runtime.api.client.AWSLambda
$@
fi
Windows を使用している場合は、スクリプトの行末を LF にして保存してください。スクリプトが CRLF を使用している場合、Docker イメージを実行しようとすると次のようなエラーが表示されます。
exec /entry_script.sh: no such file or directory
- Go
-
次の例では、/main
は Docker のビルド中にコンパイルされたバイナリです。
例 entry_script.sh
#!/bin/sh
if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then
exec /usr/local/bin/aws-lambda-rie /main
$@
else
exec /main
$@
fi
Windows を使用している場合は、スクリプトの行末を LF にして保存してください。スクリプトが CRLF を使用している場合、Docker イメージを実行しようとすると次のようなエラーが表示されます。
exec /entry_script.sh: no such file or directory
- Ruby
-
次の例では、aws_lambda_ric
は Ruby のランタイムインターフェイスクライアントです。
例 entry_script.sh
#!/bin/sh
if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then
exec /usr/local/bin/aws-lambda-rie aws_lambda_ric
$@
else
exec aws_lambda_ric
$@
fi
Windows を使用している場合は、スクリプトの行末を LF にして保存してください。スクリプトが CRLF を使用している場合、Docker イメージを実行しようとすると次のようなエラーが表示されます。
exec /entry_script.sh: no such file or directory
-
ターゲットアーキテクチャのランタイムインターフェイスエミュレータを からプロジェクトディレクトリ GitHub にダウンロードします。Lambda は、命令セットアーキテクチャごとにエミュレータを提供します。
- Linux/macOS
-
curl -Lo aws-lambda-rie https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie \
&& chmod +x aws-lambda-rie
arm64 エミュレータをインストールするには、前のコマンドの GitHub リポジトリ URL を次のように置き換えます。
https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
- PowerShell
-
Invoke-WebRequest -Uri https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie -OutFile aws-lambda-rie
arm64 エミュレーターをインストールするには、Uri
を次のように置き換えます。
https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64
-
Dockerfile ファイルに以下の行を追加します。ENTRYPOINT
には、ステップ 1 で作成したスクリプトと関数ハンドラーが含まれています。
例 Dockerfile に追加する行
次の例では、lambda_function.handler
を自分の関数ハンドラーに置き換えます。
COPY ./entry_script.sh /entry_script.sh
RUN chmod +x /entry_script.sh
ADD aws-lambda-rie /usr/local/bin/aws-lambda-rie
ENTRYPOINT [ "/entry_script.sh","lambda_function.handler
" ]
-
Docker イメージを「Docker の構築」コマンドで構築します。次の例では、イメージを docker-image
と名付けて test
タグを付けます。
docker build --platform linux/amd64 -t docker-image
:test
.
このコマンドは、ビルドマシンのアーキテクチャに関係なく、コンテナが Lambda の実行環境と互換性があることを確認する --platform linux/amd64
オプションを特定します。ARM64 命令セットアーキテクチャを使用して Lambda 関数を作成する場合は、代わりに --platform linux/arm64
オプションを使用するようにコマンドを変更してください。
-
docker run コマンドを使用して、Docker イメージを起動します。この例では、docker-image
はイメージ名、test
はタグです。
docker run --platform linux/amd64 -p 9000:8080 docker-image
:test
このコマンドはイメージをコンテナとして実行し、localhost:9000/2015-03-31/functions/function/invocations
でローカルエンドポイントを作成します。
ARM64 命令セットアーキテクチャ用に Docker イメージをビルドした場合は、--platform linux/amd64
の代わりに --platform linux/arm64
オプションを使用してください。
-
新しいターミナルウィンドウから、イベントをローカルエンドポイントにポストします。
- Linux/macOS
-
Linux および macOS では、次の curl
コマンドを実行します。
curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'
このコマンドは、空のイベントで関数を呼び出し、応答を返します。サンプル関数コードではなく独自の関数コードを使用している場合は、JSON ペイロードを使用して関数を呼び出すことをお勧めします。例:
curl "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hello world!"}
'
- PowerShell
-
で PowerShell、次のInvoke-WebRequest
コマンドを実行します。
Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{}' -ContentType "application/json"
このコマンドは、空のイベントで関数を呼び出し、応答を返します。サンプル関数コードではなく独自の関数コードを使用している場合は、JSON ペイロードを使用して関数を呼び出すことをお勧めします。例:
Invoke-WebRequest -Uri "http://localhost:9000/2015-03-31/functions/function/invocations" -Method Post -Body '{"payload":"hello world!"}
' -ContentType "application/json"
-
コンテナ ID を取得します。
docker ps
-
「docker kill」コマンドを使用してコンテナを停止します。このコマンドでは、3766c4ab331c
を前のステップのコンテナ ID で置き換えます。
docker kill 3766c4ab331c
ランタイムインターフェイスエミュレータをローカルにインストール
ランタイムインターフェイスエミュレータをローカルマシンにインストールするには、 からお好みのアーキテクチャのパッケージをダウンロードします GitHub。次に、docker run コマンドを使用してコンテナイメージを起動し、--entrypoint
をエミュレータに設定します。詳細については、ご希望の言語の説明を選択してください。