Lambda コンテナイメージをローカルでテストする - AWS Lambda

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

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_LAMBDA_FUNCTION_VERSION

  • AWS_LAMBDA_FUNCTION_NAME

  • AWS_LAMBDA_FUNCTION_MEMORY_SIZE

AWS ベースイメージから構築されたイメージのテスト

AWSLambda のベースイメージには、ランタイムインターフェイスエミュレータが含まれています。Docker イメージをビルドした後で、以下の手順に従ってローカルでテストします。

  1. 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 オプションを使用してください。

  2. 新しいターミナルウィンドウから、イベントをローカルエンドポイントにポストします。

    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"
  3. コンテナ ID を取得します。

    docker ps
  4. docker kill」コマンドを使用してコンテナを停止します。このコマンドでは、3766c4ab331c を前のステップのコンテナ ID で置き換えます。

    docker kill 3766c4ab331c

代替ベースイメージからビルドされたイメージのテスト

Alpine Linux や Debian イメージなどの代替ベースイメージを使用する場合は、エミュレーターをイメージにビルドすることもできますし、ローカルマシンにインストールすることもできます。

ランタイムインターフェイスエミュレータをイメージに組み込む

イメージにエミュレータを組み込むには
  1. スクリプトを作成し、プロジェクトディレクトリに保存します。スクリプトファイルの実行許可を設定します。

    スクリプトが 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
  2. ターゲットアーキテクチャのランタイムインターフェイスエミュレータを からプロジェクトディレクトリ 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
  3. 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" ]
  4. Docker イメージを「Docker の構築」コマンドで構築します。次の例では、イメージを docker-image と名付けて test タグを付けます。

    docker build --platform linux/amd64 -t docker-image:test .
    注記

    このコマンドは、ビルドマシンのアーキテクチャに関係なく、コンテナが Lambda の実行環境と互換性があることを確認する --platform linux/amd64 オプションを特定します。ARM64 命令セットアーキテクチャを使用して Lambda 関数を作成する場合は、代わりに --platform linux/arm64 オプションを使用するようにコマンドを変更してください。

  5. 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 オプションを使用してください。

  6. 新しいターミナルウィンドウから、イベントをローカルエンドポイントにポストします。

    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"
  7. コンテナ ID を取得します。

    docker ps
  8. docker kill」コマンドを使用してコンテナを停止します。このコマンドでは、3766c4ab331c を前のステップのコンテナ ID で置き換えます。

    docker kill 3766c4ab331c

ランタイムインターフェイスエミュレータをローカルにインストール

ランタイムインターフェイスエミュレータをローカルマシンにインストールするには、 からお好みのアーキテクチャのパッケージをダウンロードします GitHub。次に、docker run コマンドを使用してコンテナイメージを起動し、--entrypoint をエミュレータに設定します。詳細については、ご希望の言語の説明を選択してください。