HEARTBEATS

AWS Lambda Web Adapterを利用したWebアプリケーションの開発

   

こんにちは、技術開発チームの小嶋です。

本記事では、AWS Lambdaを利用してWebアプリケーションを開発するために導入した AWS Lambda Web Adapter について、その導入経緯や簡単な利用方法を紹介します。

AWS LambdaはAWSが提供しているサーバレスなコンピューティングサービスです。また、AWS Lambda Web AdapterはAWSが中心となって開発しているOSSライブラリです。AWS Lambda Web Adapterを使用することで、Dockerfileに1行の設定を追加するだけで、AWS Lambda上で動作するWebアプリケーションを簡単に開発できます。

AWS Lambda Web Adapterを利用した経緯

私が所属するチームではコンテナによる開発・運用を積極的に取り入れています。本番環境においては、クラウドのマネージド・サービスを利用して運用負荷を軽減したいという要望もあり、社内システムをAmazon ECS上で稼働させているケースが多くあります。Amazon ECSはAWSが提供しているコンテナオーケストレーションサービスの1つです。

今回開発した社内システムについても、当初はAmazon ECSによる稼働を想定していました。しかしながら、今回開発した社内システムは実験的な位置づけということもあり、スモールスタートでコストを抑えて運用をしたいという要望がありました。そのため、将来的にはAmazon ECSによる運用を想定しつつも、運用開始時はAWS Lambdaを利用してコストを抑える方針をとりました。

AWS Lambdaを利用してWebアプリケーションを開発する場合、特定の形式に従ったハンドラ関数を定義する必要があります。そのため、通常のWebアプリケーションのコードをそのままAWS Lambda上で動作させることはできず、ハンドラ関数のシグネチャを満たすようにコードを修正する必要があります。また、私が所属するチームではAWS LambdaをWebアプリケーションの基盤として本格的に利用するのが初めてだったため、ローカル開発環境の整備も必要な状況でした。

こうした課題を解決する手段を調査する中で、AWS Lambda Web Adapterの存在を知りました。以降はAWS Lambda Web Adapterで解決できる課題と簡単な利用方法について紹介します。

AWS Lambda Web Adapterとは

AWS Lambda Web AdapterはAWS社が中心となって開発しているOSSライブラリです。   AWS Lambda特有のハンドラ関数を定義せずに通常のWebアプリケーションをAWS Lambda上で実行できる点がAWS Lambda Web Adapterを利用する大きなメリットです。また、ローカルの開発環境についても通常のWebアプリケーション開発と同様の環境を利用できる点もメリットの1つです。

AWS Lambda Web AdapterはAWS LambdaランタイムとWebアプリケーションの間で動作するアダプターです。具体的な動作としては、AWS LambdaランタイムとWebアプリケーションの間で通信を仲介し、リクエスト・レスポンスを変換します。そのため、AWS Lambda特有のハンドラ関数を定義する必要がなく、通常と同じWebアプリケーションとしてコードを作成するだけでAWS Lambda上でアプリケーションを実行できます。

AWS Lambda Web Adapter

AWS Lambda Web Adapterの使い方

AWS Lambda Web Adapterの説明のため、コンテナ化されたWebアプリケーションについて考えます。例えば、PythonとFastAPIフレームワークを利用してWebアプリケーションを開発する場合、Dockerfileは下記のようなイメージとなります。

FROM python:3.13

WORKDIR /code

# ライブラリをインストールする
COPY ./requirements.txt /code/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt

# アプリケーションコードをコピーする
COPY ./app /code/app

# アプリケーションを起動する
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8080"]

AWS Lambda Web Adapterはコンテナ化されたWebアプリケーションと合わせて利用します。具体的にはAWS Lambda Web Adapterのコードをコピーする設定をDockerfileに1行追加します。

FROM python:3.13

WORKDIR /code

# -- この行を追加する --
COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.9.1 /lambda-adapter /opt/extensions/lambda-adapter

# ライブラリをインストールする
COPY ./requirements.txt /code/requirements.txt
RUN pip install --no-cache-dir --upgrade -r /code/requirements.txt

# アプリケーションコードをコピーする
COPY ./app /code/app

# アプリケーションを起動する
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8080"]

上記のように、Dockerfileのその他の内容は通常のWebアプリケーション開発と同じものを利用できます。そのため、AWS Lambda特有のハンドラ関数のシグネチャを満たすように修正する場合と比較して、修正を大幅に簡略化できます。また、AWS Lambda Web Adapterの利用をやめる際にもDockerfileから設定を1行削除するのみで対応が完了します。Amazon ECSなどへ運用基盤を移行する際にも修正が容易です。

AWS Lambda Web Adapterはいくつかの項目を環境変数で設定できます。環境変数の設定は、ローカルで開発する場合はターミナルで設定し、Lambdaで実行する場合はAWSマネジメントコンソールでLambda環境変数として設定します。例えば、Webアプリケーションのポート番号(AWS_LWA_PORT)やヘルスチェックのパス(AWS_LWA_READINESS_CHECK_PATH)といった項目です。今回開発したWebアプリケーションでは、AWS Lambda Web Adapterがデフォルトで利用するポート番号(8080)を変更する必要があったため、AWS_LWA_PORTを利用してポート番号を設定しました。設定項目の一覧はGitHubリポジトリのドキュメントを参照してください。

以上のように、Dockerfileへ設定を1行追加するだけでAWS Lambda上で動作するWebアプリケーションを開発できます。今回開発した社内システムについても通常のWebアプリケーション開発と同じ感覚で開発を進めることができ、開発者体験としてもよいものだったと感じています。

おわりに

本記事では、AWS Lambdaを利用してWebアプリケーションを開発するために導入した AWS Lambda Web Adapter について、その導入経緯や簡単な利用方法を紹介しました。AWS LambdaでWebアプリケーションを開発する際に便利なのでぜひ試してみてください。

株式会社ハートビーツの技術情報やイベント情報などをお届けする公式ブログです。



ハートビーツをフォロー

  • Twitter:HEARTBEATS
  • Facebook:HEARTBEATS
  • HATENA:HEARTBEATS
  • RSS:HEARTBEATS

殿堂入り記事