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

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

AWS Lambda Runtime Interface Emulator (RIE) は、Lambda ランタイム API のプロキシで、コンテナイメージとしてパッケージ化された Lambda 関数をローカルでテストできます。エミュレーターは、HTTP リクエストを JSON イベントに変換して、コンテナイメージ内の Lambda 関数に渡す、軽量なウェブサーバーです。

Lambda 用の AWS ベースイメージには、RIE コンポーネントが含まれます。代わりのベースイメージを使用する場合は、イメージに RIE を追加せずにイメージをテストできます。RIE コンポーネントをベースイメージ内にビルドすることもできます。AWS は、AWS GitHub リポジトリにオープンソースの RIE コンポーネントを提供します。x86-64 アーキテクチャと arm64 アーキテクチャには個別の RIE コンポーネントがあることに注意してください。

エミュレーターを使用して、関数コードが Lambda 環境と互換性があるかどうかをテストできます。また、エミュレーターを使用して、Lambda 関数が正常に完了するまで実行され、期待通りの出力が得られるかどうかをテストします。コンテナイメージに拡張機能およびエージェントをビルドした場合は、エミュレーターを使用すると、拡張機能とエージェントが Lambda Extensions API で正しく動作することをテストできます。

RIE の使用方法の例については、AWS ブログの「Lambda のコンテナイメージのサポート」を参照してください。

RIE 使用のガイドライン

Runtime Interface Emulator を使用する場合は、次のガイドラインに注意してください。

  • RIE は、Lambda のセキュリティと認証の設定や、Lambda オーケストレーションをエミュレートしません。

  • Lambda は、命令セットアーキテクチャごとにエミュレータを提供します。

  • エミュレーターは、AWS X-Ray トレースや、その他の Lambda の統合をサポートしていません。

環境変数

Runtime Interface Emulator は、ローカルで実行しているイメージにある Lambda 関数の、環境変数のサブセットをサポートします。

関数でセキュリティ認証情報を使用する場合は、次の環境変数を設定して、認証情報を設定できます。

  • AWS_ACCESS_KEY_ID

  • AWS_SECRET_ACCESS_KEY

  • AWS_SESSION_TOKEN

  • AWS_REGION

関数のタイムアウトを設定するには、AWS_LAMBDA_FUNCTION_TIMEOUT を設定します。関数の実行を許可する最大秒数を入力します。

エミュレーターは、次の Lambda 環境変数を設定しません。ただし、Lambda サービスで関数を実行するときには、期待される値と一致するように設定できます。

  • AWS_LAMBDA_FUNCTION_VERSION

  • AWS_LAMBDA_FUNCTION_NAME

  • AWS_LAMBDA_FUNCTION_MEMORY_SIZE

RIE が含まれているイメージをテストする

Lambda の AWS ベースイメージには、Runtime Interface Emulator が含まれています。代わりのベースイメージに RIE を構築した後で、これらのステップを実行することもできます。

エミュレーターを使用して Lambda 関数をテストするには

  1. docker build コマンドを使用して、イメージをローカルにビルドします。

    docker build -t myfunction:latest .
  2. docker run コマンドを使用して、コンテナイメージをローカルで実行します。

    docker run -p 9000:8080 myfunction:latest

    このコマンドはイメージをコンテナとして実行し、ローカルの localhost:9000/2015-03-31/functions/function/invocations でエンドポイントを起動します 。

  3. 新しいターミナルウィンドウから curl コマンドを使用して、次のエンドポイントにイベントをポストします。

    curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'

    このコマンドは、コンテナイメージで実行されている Lambda 関数を呼び出し、応答を返します。

ベースイメージに RIE を組み込む

RIE をベースイメージに組み込むことができます。次のステップは、GitHub からローカルマシンに RIE をダウンロードし、Dockerfile を更新して RIE をインストールする方法を示しています。

イメージにエミュレーターを組み込むには

  1. スクリプトを作成し、プロジェクトディレクトリに保存します。スクリプトファイルの実行許可を設定します。

    スクリプトが AWS_LAMBDA_RUNTIME_API 環境変数の存在を確認したということは、ランタイム API が存在していることを示します。ランタイム API が存在する場合、スクリプトがランタイムインターフェイスクライアントを実行します。それ以外の場合、スクリプトは Runtime Interface Emulator を実行します。

    次の例は、典型的な Node.js 関数のスクリプトを示しています。

    #!/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

    次の例は、典型的な Python 関数のスクリプトを示しています。

    #!/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
  2. GitHub からプロジェクトディレクトリにターゲットアーキテクチャのランタイムインターフェイスエミュレータをダウンロードします。Lambda は、命令セットアーキテクチャごとにエミュレータを提供します。

  3. スクリプトをコピーし、エミュレータパッケージをインストールし、Dockerfile に次の行を追加して、新しいスクリプトを実行するようにENTRYPOINTを変更します。

    デフォルトの x86-64 アーキテクチャを使用するには:

    COPY ./entry_script.sh /entry_script.sh ADD aws-lambda-rie-x86_64 /usr/local/bin/aws-lambda-rie ENTRYPOINT [ "/entry_script.sh" ]

    arm64 アーキテクチャを使用するには:

    COPY ./entry_script.sh /entry_script.sh ADD aws-lambda-rie-arm64 /usr/local/bin/aws-lambda-rie ENTRYPOINT [ "/entry_script.sh" ]
  4. docker build コマンドを使用して、イメージをローカルにビルドします。

    docker build -t myfunction:latest .

イメージに RIE を追加せずにイメージをテストする

ローカルマシンに Runtime Interface Emulator をインストールします。コンテナイメージを起動するときに、エミュレーターにエントリポイントを設定します。

イメージに RIE を追加せずにイメージをテストするには

  1. プロジェクトディレクトリから次のコマンドを実行して、GitHub から RIE (x86-64 アーキテクチャ) をダウンロードし、ローカルマシンにインストールします。

    mkdir -p ~/.aws-lambda-rie && curl -Lo ~/.aws-lambda-rie/aws-lambda-rie \ https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie \ && chmod +x ~/.aws-lambda-rie/aws-lambda-rie

    RIE for arm64 アーキテクチャをダウンロードするには、別の GitHub ダウンロード URL で前のコマンドを使用します。

    https://github.com/aws/aws-lambda-runtime-interface-emulator/releases/latest/download/aws-lambda-rie-arm64 \
  2. docker run コマンドを使用して Lambda 関数を実行します。

    docker run -d -v ~/.aws-lambda-rie:/aws-lambda -p 9000:8080 \ --entrypoint /aws-lambda/aws-lambda-rie hello-world:latest <image entrypoint> \ <(optional) image command>

    このコマンドはイメージをコンテナとして実行し、ローカルの localhost:9000/2015-03-31/functions/function/invocations でエンドポイントを起動します。

  3. curl コマンドを使用して、次のエンドポイントにイベントをポストします。

    curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{}'

    このコマンドは、コンテナイメージで実行されている 関数を呼び出し、応答を返します。