AWS Lambda上でWebアプリケーションを実行するツール
AWS Lambda Web Adaptor を使用すると、開発者は使い慣れたフレームワーク (例: Express.js、Next.js、Flask、SpringBoot、ASP.NET、Laravel、HTTP 1.1/1.0 を通信するもの) を使用して Web アプリ (http API) を構築し、AWS Lambda で実行できます。 。同じ Docker イメージを AWS Lambda、Amazon EC2、AWS Fargate、およびローカル コンピューター上で実行できます。
AWS Lambda Web Adaptor は、Docker イメージと Zip パッケージの両方としてパッケージ化された Lambda 関数を操作します。
Docker イメージで Lambda Web Adaptor を使用するには、Web アプリ (http API) を Dockerfile にパッケージ化し、Lambda Web Adaptor バイナリをコンテナ内の /opt/extensions にコピーする 1 行を追加します。
COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.8.4 /lambda-adapter /opt/extensions/lambda-adapter
ランタイム インターフェイス クライアントは Lambda Web Adaptor に同梱されているため、AWS 以外のベース イメージを使用できます。
デフォルトでは、Lambda Web Adaptor は Web アプリがポート 8080 でリッスンしていると想定します。そうでない場合は、設定でポートを指定できます。
コンパイル済みの Lambda Web Adaptor バイナリは、ECR パブリック リポジトリ: public.ecr.aws/awsguru/aws-lambda-adapter で提供されます。このリポジトリでは、マルチ アーチ イメージも提供されます。 x86_64 と arm64 の両方の CPU アーキテクチャで動作します。
以下は、nodejs アプリケーションの例の Dockerfile です。
FROM public.ecr.aws/docker/library/node:20-slim
COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.8.4 /lambda-adapter /opt/extensions/lambda-adapter
ENV PORT=7000
WORKDIR "/var/task"
ADD src/package.json /var/task/package.json
ADD src/package-lock.json /var/task/package-lock.json
RUN npm install --omit=dev
ADD src/ /var/task
CMD [ "node" , "index.js" ]
これは、AWS 管理のベース イメージを除くすべてのベース イメージで機能します。 AWS 管理のベースイメージを使用するには、ENTRYPOINT をオーバーライドして Web アプリを開始する必要があります。
AWS Lambda Web Adaptor は、AWS 管理の Lambda ランタイムでも動作します。次の 3 つのことを行う必要があります。
Lambda Web Adaptor レイヤーを関数にアタッチします。
arn:aws:lambda:${AWS::Region}:753240598075:layer:LambdaAdapterLayerX86:23
arn:aws:lambda:${AWS::Region}:753240598075:layer:LambdaAdapterLayerArm64:23
arn:aws-cn:lambda:cn-north-1:041581134020:layer:LambdaAdapterLayerX86:23
arn:aws-cn:lambda:cn-northwest-1:069767869989:layer:LambdaAdapterLayerX86:23
Lambda 環境変数AWS_LAMBDA_EXEC_WRAPPER
を/opt/bootstrap
に設定します。
Web アプリケーションの起動スクリプトに関数ハンドラーを設定します。たとえば、 run.sh
。
詳細については、Node.js アプリケーションのサンプルを確認してください。
新しい Lambda 実行環境が起動すると、Lambda Web Adaptor が Lambda 拡張機能として起動し、続いて Web アプリケーションが起動します。
デフォルトでは、Lambda Web Adaptor はhttp://127.0.0.1:8080/
の Web アプリケーションに HTTP GET リクエストを送信します。ポートとパスは、 AWS_LWA_READINESS_CHECK_PORT
とAWS_LWA_READINESS_CHECK_PATH
2 つの環境変数を使用してカスタマイズできます。
Lambda Web Adaptor は、Web アプリケーションが HTTP 応答 (ステータス コード >= 100 かつ < 500 ) を返すか、関数がタイムアウトするまで、このリクエストを 10 ミリ秒ごとに再試行します。
さらに、 AWS_LWA_READINESS_CHECK_PROTOCOL
tcp
に設定することで、TCP 接続で準備状況チェックを実行するようにアダプターを設定できます。
準備状況チェックに合格すると、Lambda Web Adaptor は Lambda ランタイムを起動し、呼び出しを Web アプリケーションに転送します。
準備状況チェック ポート/パスとトラフィック ポートは、環境変数を使用して設定できます。これらの環境変数は、docker ファイル内で定義することも、Lambda 関数設定として定義することもできます。
環境変数 | 説明 | デフォルト |
---|---|---|
AWS_LWA_PORT / ポート* | トラフィックポート | 「8080」 |
AWS_LWA_READINESS_CHECK_PORT / READINESS_CHECK_PORT* | 準備状況チェック ポート、デフォルトはトラフィック ポート | ポート |
AWS_LWA_READINESS_CHECK_PATH / READINESS_CHECK_PATH* | 準備状況チェックパス | 「/」 |
AWS_LWA_READINESS_CHECK_PROTOCOL / READINESS_CHECK_PROTOCOL* | 準備状況チェック プロトコル: 「http」または「tcp」、デフォルトは「http」です | 「http」 |
AWS_LWA_READINESS_CHECK_MIN_UNHEALTHY_STATUS | 異常とみなされる最小の HTTP ステータス コード | 「500」 |
AWS_LWA_ASYNC_INIT / ASYNC_INIT* | 長い初期化関数の非同期初期化を有効にする | "間違い" |
AWS_LWA_REMOVE_BASE_PATH / REMOVE_BASE_PATH* | リクエストパスから削除されるベースパス | なし |
AWS_LWA_ENABLE_COMPRESSION | 応答本文の gzip 圧縮を有効にする | "間違い" |
AWS_LWA_INVOKE_MODE | Lambda 関数呼び出しモード: "buffered" または "response_stream"、デフォルトは "buffered" | "緩衝" |
AWS_LWA_PASS_THROUGH_PATH | 非 http トリガーから渡されるイベント ペイロードを受信するためのパス | "/イベント" |
AWS_LWA_AUTHORIZATION_SOURCE | Authorization に置き換えられるヘッダー名 | なし |
注: Lambda Web Adaptor で使用されるすべての環境変数の名前空間には、「AWS_LWA_」プレフィックスを使用します。オリジナルのものはバージョン 1.0 に達するまでサポートされます。
AWS_LWA_PORT / PORT - Lambda Web Adaptor はこのポートにトラフィックを送信します。これは、Web アプリケーションがリッスンするポートです。 Lambda 実行環境内では、Web アプリケーションは非 root ユーザーとして実行され、1024 より低いポートでリッスンすることはできません。また、ポート 9001 と 3000 も避けてください。Lambda ランタイム API はポート 9001 上にあります。CloudWatch Lambda Insight 拡張機能はポート 3000 を使用します。 。
AWS_LWA_ASYNC_INIT / ASYNC_INIT - Lambda 管理のランタイムでは、関数の初期化に最大 10 秒かかります。この期間中、Lambda 関数は初期化を加速するために CPU をバーストし、無料です。 Lambda 関数が 10 秒以内に初期化を完了できなかった場合、Lambda は関数を再起動し、初期化の料金を請求します。関数がこの 10 秒の無料初期化時間を利用し、再起動を回避できるようにするために、Lambda Web Adaptor は非同期初期化をサポートしています。この機能が有効になっている場合、Lambda Web Adaptor は最大 9.8 秒間準備状況チェックを実行します。それまでに Web アプリの準備ができていない場合、Lambda Web Adaptor は初期化が完了したことを Lambda サービスに通知し、ハンドラーで準備状況チェックを続行します。この機能はデフォルトでは無効になっています。環境変数AWS_LWA_ASYNC_INIT
をtrue
に設定して有効にします。
AWS_LWA_REMOVE_BASE_PATH / REMOVE_BASE_PATH - この環境変数の値は、アプリケーションがベースパスで実行されているかどうかをアダプターに伝えます。たとえば、/orders/{proxy+} リソースと /catalog/{proxy+} リソースを持つように API ゲートウェイを構成できます。各リソースは個別の Lambda 関数によって処理されます。このため、Lambda 内のアプリケーションは /orders パスが存在するという事実を認識していない可能性があります。 REMOVE_BASE_PATH を使用して、リクエストをアプリケーションにルーティングするときに /orders プレフィックスを削除します。デフォルトは空の文字列です。 SpringBoot のサンプルをチェックアウトします。
AWS_LWA_ENABLE_COMPRESSION - Lambda Web Adaptor は、レスポンス本文の gzip 圧縮をサポートしています。この機能はデフォルトでは無効になっています。環境変数AWS_LWA_ENABLE_COMPRESSION
true
に設定して有効にします。有効にすると、 image
で始まるコンテンツ タイプによって決定される画像であるか、応答が 32 バイト未満でない限り、応答が圧縮されます。これにより、HTTP/1.1 チャンク化されたストリーミング応答も圧縮されます。
AWS_LWA_INVOKE_MODE - Lambda 関数呼び出しモード。これは関数 URL 呼び出しモードと一致する必要があります。デフォルトは「バッファリング」です。 「response_stream」として設定すると、Lambda Web Adaptor は応答を Lambda サービス ブログにストリーミングします。 FastAPI と応答ストリーミングの例を確認してください。
AWS_LWA_READINESS_CHECK_MIN_UNHEALTHY_STATUS - どの HTTP ステータス コードが正常とみなされるか、どの HTTP ステータス コードが正常でないとみなされるかをカスタマイズできます。
AWS_LWA_PASS_THROUGH_PATH - 非 http イベントトリガーからパススルーされたイベントペイロードを受信するパス。デフォルトは「/events」です。
AWS_LWA_AUTHORIZATION_SOURCE - 設定すると、Lambda Web Adaptor はリクエストをプロキシする前に、指定されたヘッダー名をAuthorization
に置き換えます。これは、IAM 認証タイプで Lambda 関数 URL を使用し、IAM 認証用に Authorization ヘッダーを予約するが、バックエンド アプリには引き続き Authorization ヘッダーを使用したい場合に便利です。この機能はデフォルトでは無効になっています。
リクエストコンテキストは、API Gateway がリクエストのために Lambda に送信するメタデータです。通常、これには requestId、requestTime、apiId、ID、および authorizer が含まれます。 ID と承認者は、承認用のクライアント ID を取得するのに役立ちます。詳細については、「API Gateway 開発者ガイド」を参照してください。
Lambda Web Adaptor は、この情報を「x-amzn-request-context」という名前の HTTP ヘッダーで Web アプリケーションに転送します。 Web アプリケーションでは、この http ヘッダーの値を取得し、それを JSON オブジェクトに逆シリアル化できます。使用方法については、Zip 内の Express.js を参照してください。
Lambda Context は、 Lambda が関数ハンドラーに渡すオブジェクトです。このオブジェクトは、呼び出し、関数、および実行環境に関する情報を提供します。ここで、Lambda コンテキストを通じてアクセスできるプロパティの完全なリストを見つけることができます。
Lambda Web Adaptor は、この情報を「x-amzn-lambda-context」という名前の HTTP ヘッダーで Web アプリケーションに転送します。 Web アプリケーションでは、この http ヘッダーの値を取得し、それを JSON オブジェクトに逆シリアル化できます。使用方法については、Zip 内の Express.js を参照してください。
Lambda 拡張機能が登録されている関数の場合、Lambda は関数のシャットダウン フェーズを有効にします。 Lambda サービスは、Lambda 実行環境をシャットダウンしようとすると、SIGTERM シグナルをランタイムに送信してから、登録されている各外部拡張機能に SHUTDOWN イベントを送信します。開発者は、ラムダ関数で SIGTERM シグナルをキャッチし、正常なシャットダウン タスクを実行できます。 Express.js には簡単な例が示されています。詳細については、このリポジトリをご覧ください。
Lambda Web Adaptor を使用すると、開発者は使い慣れたツールやデバッガーを使用してローカルで Web アプリケーションを開発できます。Web アプリケーションをローカルで実行してテストするだけです。 Lambda ランタイム環境をローカルでシミュレートする場合は、AWS SAM CLI を使用できます。次のコマンドは、ローカル API ゲートウェイ エンドポイントを起動し、Lambda ランタイム実行環境をシミュレートします。
sam local start-api
sam local
ポート 8080 で Lambda ランタイム インターフェイス エミュレータを起動することに注意してください。そのため、 sam local
使用する予定がある場合、Web アプリケーションはポート8080
を回避する必要があります。
Lambda Web Adaptor は、SQS、SNS、S3、DynamoDB、Kinesis、Kafka、EventBridge、Bedrock Agents など、HTTP 以外のすべてのイベント トリガーもサポートします。アダプターは、 AWS_LWA_PASS_THROUGH_PATH
環境変数で定義されたパスへの http ポストを介して、イベント ペイロードを Web アプリケーションに転送します。デフォルトでは、このパスは/events
に設定されます。リクエスト本文からイベント ペイロードを受信すると、Web アプリケーションはそれを処理し、結果を JSON 応答として返す必要があります。 SQS Express.js と Bedrock Agent FastAPI in Zip の例をチェックしてください。
このプロジェクトは、いくつかのコミュニティ プロジェクトからインスピレーションを受けました。
いくつかのプロジェクトでは、言語固有のパッケージ/フレームワークとして同様の機能も提供しています。
詳細については、「貢献」を参照してください。
このプロジェクトは、Apache-2.0 ライセンスに基づいてライセンスされています。