今回はAWS Lambda Web Adapterを使用してASP.NET CoreアプリケーションをAWS Lambdaで動作させる方法についてお届けします。
本記事では、AWS Lambda Web Adapterを使用してASP.NET Core Web APIアプリケーションをAWS Lambdaで動作させる方法を紹介します。
AWS Lambda Web Adapterとは?
AWS Lambda Web Adapterは、AWS Lambdaで従来のWebアプリフレームワーク(Express.js、Next.js、FastAPI、Flask、SpringBoot、ASP.NETなど)で作成したWebアプリケーションをそのまま動かすためのLambda拡張機能(Lambda Extension)です。
元々AWS Lambdaは .NET(C#)をサポートしているので、Lambda関数アプリケーションを .NET(C#)で作成することができます。


しかしこれはあくまでAWS Lambdaのみで動作するアプリケーションであり、既存のコンテナサービスやオンプレミスで動作させているASP.NET Coreアプリケーションをそのまま動作させたり、同じようなテストを実施することができません。
Lambda Web Adapterを使用するとこれらの問題を解決することができます。ローカル環境およびオンプレミス環境、あるいはAzureなどの他のパブリッククラウドで開発・テスト・運用しているASP.NET Coreアプリケーションを、そのままAWS Lambdaにデプロイして動作させるといったことが可能になります。
アプリケーションを作成
アプリケーションを作成する前に以下を済ませておきます。
- AWSのアカウント
- AWS Toolkit for Visual Studioのインストール
- Dockerのインストール
Visual Studio 2022を起動してASP.NET Core Web APIアプリケーション「AWSLambdaAspNetCoreWebAPI」を作成します。


「コンテナーのサポートを有効にする」にチェックを入れて[作成]をクリックします。

Dockerfileとappsettings.jsonを修正
Lambda Web Adapterを使用するために、Dockerfileに以下の記載(Lambda Web Adapterのパッケージをコピー)を追加します。
# デバッグ コンテナーをカスタマイズする方法と、Visual Studio がこの Dockerfile を使用してより高速なデバッグのためにイメージをビルドする方法については、https://aka.ms/customizecontainer をご覧ください。
# このステージは、VS から高速モードで実行するときに使用されます (デバッグ構成の既定値)
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
USER $APP_UID
WORKDIR /app
EXPOSE 8080
EXPOSE 8081
# このステージは、サービス プロジェクトのビルドに使用されます
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
ARG BUILD_CONFIGURATION=Release
WORKDIR /src
COPY ["AWSLambdaAspNetCoreWebAPI/AWSLambdaAspNetCoreWebAPI.csproj", "AWSLambdaAspNetCoreWebAPI/"]
RUN dotnet restore "./AWSLambdaAspNetCoreWebAPI/AWSLambdaAspNetCoreWebAPI.csproj"
COPY . .
WORKDIR "/src/AWSLambdaAspNetCoreWebAPI"
RUN dotnet build "./AWSLambdaAspNetCoreWebAPI.csproj" -c $BUILD_CONFIGURATION -o /app/build
# このステージは、最終ステージにコピーするサービス プロジェクトを公開するために使用されます
FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "./AWSLambdaAspNetCoreWebAPI.csproj" -c $BUILD_CONFIGURATION -o /app/publish /p:UseAppHost=false
# このステージは、運用環境または VS から通常モードで実行している場合に使用されます (デバッグ構成を使用しない場合の既定)
FROM base AS final
COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.9.1 /lambda-adapter /opt/extensions/lambda-adapter
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "AWSLambdaAspNetCoreWebAPI.dll"]
appsettings.jsonには以下の記載(Lambda Web Adapterが使用するポート番号)を追加します。
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
},
"AllowedHosts": "*",
"urls": "http://*:8080"
}
Amazon Elastic Container Registry(ECR)に発行
Visual Studioのソリューションエクスプローラーでプロジェクトを右クリックして、コンテキストメニューから「Publish to AWS」をクリックします。

「Container Image to Amazon Elastic Container Registory (ECR)」を選択して[Publish]ボタンをクリックします。

ECRへの発行が成功したメッセージが表示されれば完了です。

Lambda関数の作成
AWSのコンソールからAWS Lambdaへ移動して、ダッシュボードから[関数の作成]ボタンをクリックします。

「コンテナイメージ」のオプションを選択します。関数名を設定して「コンテナイメージURI」にある[イメージを参照]ボタンをクリックします。

先ほどECRに発行したコンテナイメージを設定して[イメージを選択]ボタンをクリックします。

「その他の構成」を開いて「関数 URL を有効化」にチェックを入れて、「認証タイプ」をNONEに設定します。最後に[関数を作成]ボタンをクリックします。

作成が完了すると以下の画面に切り替わるので、「関数 URL」のURLに/weatherforecast
を追加してLambda関数の動作を確認します。

以下のようにASP.NET Core Web APIアプリケーションで設定した内容が表示されます。

さいごに
AWS Lambda Web Adapterを使用してASP.NET Core Web APIアプリケーションをLambda関数として動作させることができました。アプリケーションの動作には .NETコンテナの利用が必須となりますが、前述したようにオンプレミスや他のクラウドサービスで動作させているASP.NET Coreアプリケーションをサーバーレス環境への移行を検討する場合に、AWS Lambdaが候補にあるケースでは非常に少ない工数でアプリケーションの移行が完了するので、移行方法の一つとして押さえておくべき機能となっているように思います。