AWS Lambda Web AdapterでASP.NET Core Web APIを動作させてみる

普段のお仕事に役立つ普遍的なプログラミングTIPSや、業界で注目度が高い最新情報をお届けする「編集部ピックアップ」。
今回は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 Web Adapterとは?
AWS Lambda Web Adapterとは?

しかしこれはあくまでAWS Lambdaのみで動作するアプリケーションであり、既存のコンテナサービスやオンプレミスで動作させているASP.NET Coreアプリケーションをそのまま動作させたり、同じようなテストを実施することができません。

Lambda Web Adapterを使用するとこれらの問題を解決することができます。ローカル環境およびオンプレミス環境、あるいはAzureなどの他のパブリッククラウドで開発・テスト・運用しているASP.NET Coreアプリケーションを、そのままAWS Lambdaにデプロイして動作させるといったことが可能になります。

アプリケーションを作成

アプリケーションを作成する前に以下を済ませておきます。

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」をクリックします。

Amazon Elastic Container Registry(ECR)に発行

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

Amazon Elastic Container Registry(ECR)に発行

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

Amazon Elastic Container Registry(ECR)に発行

Lambda関数の作成

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

Lambda関数の作成

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

Lambda関数の作成

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

Lambda関数の作成

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

Lambda関数の作成

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

Lambda関数の作成

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

Lambda関数の作成

さいごに

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

\  この記事をシェアする  /