こんにちは。インシュアランス本部ソリューション部の照屋です。
今年、JMDCではアドベントカレンダーに参加しています。
本記事はJMDCアドベントカレンダー 11日目の記事 になります。
はじめに
私の所属するインシュアランス本部では、JMDCの保有する医療ビックデータを活用したヘルスケアコンテンツを企画・開発し、生損保領域のお客様に対して提供しています。
お客様に提供しているコンテンツの代表例として、健康診断の結果からカラダの年齢を測る「健康年齢®」や、実施しやすく・継続しやすく・効果のある健康改善タスクをレコメンドする「Health Habit®」などがあります。
本記事ではコンテンツ提供用のシステムを運用する過程で生まれた困り事と、その解決手段としてWebアプリをAWSLambdaでホスティングしたことについて書いてみたいと思います。
背景
弊部署では、お客様が運営するシステムとデータ連携が容易なことからコンテンツをWebAPI形式で提供することがあります。コンテンツを提供する際には、バックグラウンド機能を担うWebAPIの開発を弊社、取得したコンテンツを表示するUI画面の開発をお客様で行うことが多いです。 このような分担のプロジェクトでは、WebAPI開発の初期段階でコンテンツを表示するUI画面がまだ存在しないことがあります。 そのため、開発初期には社内ステークホルダーに対してWebAPIで取得したコンテンツの内容をわかりやすく説明する目的で、デモ用のWebアプリ(以下、デモアプリ)を独自に作成することがあります。 新規顧客の商談においても、お客様に利用イメージを具体的に持っていただくためにデモアプリを活用したりします。
困り事
デモアプリは社外からでもアクセスできるように専用サーバを用意してホスティングしています(利用ユーザー制限あり)。デモアプリを使う機会は不定期に発生しますが、年間を通して見ると利用頻度・時間は少ないです。このためサーバを常時稼働させ続けるのはインフラコストの観点で費用対効果が低く、代わりに利用機会に応じてサーバを毎回準備していました。ただ、繁忙期にはサーバを用意するのも負担に感じることがあり、悩みのタネの一つとなっていました。
実現したいこと
- 利用機会に応じてサーバを用意するのを止め、いつでも利用可能な実行環境にホスティングしたい。
- デモアプリを実行した時間のみコストを支払うシステム構成に転換したい。
試したこと
デモアプリは.NETのWebフレームワークであるBlazorを用いて作られており、APIキー等の露出を防ぐためにWebAPIとの通信をサーバー側で行っています。 達成要件を満たすために実行時間単位での課金で動かすことのできるAWS LambdaでWebアプリをホスティングできないか調べたところ、AWS Lambda Web Adapterを活用することで実現できそうということが分かり、実際に試してました。
AWS Lambda Web Adapterとは
Lambda Web AdapterはAWSが公式に提供するOSSで、VMやコンテナ用に実装されたWebアプリケーションをそのままLambdaで動かすことができるツールです。LambdaランタイムとWebアプリの間の通信をLambda Web Adapterが仲介し、Lambdaランタイムが外部から受け取るイベントデータをWebアプリが受け取れるHTTPメッセージ形式に変換してくれます。Webアプリ開発者はLambdaイベントデータからHTTPメッセージへの変換処理を実装する必要がなくなり、LambdaでWebアプリをホスティングするのを簡単にしてくれます。
詳細情報は公式サイトをご確認下さい。
導入方法
Webアプリをコンテナで動かす場合、Dockerfileに対して以下の定義を追加することでLambda Web Adapterを使えるようになります。
COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.8.4 /lambda-adapter /opt/extensions/lambda-adapter
Dockerfileでの記載例
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base WORKDIR /app FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build WORKDIR /src COPY ["ApiTester.csproj", "."] RUN dotnet restore "./ApiTester.csproj" COPY . . WORKDIR "/src/." RUN dotnet build "./ApiTester.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "./ApiTester.csproj" -c Release -o /app/publish /p:UseAppHost=false FROM base AS final # Lambda Web Adapterの導入 COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.8.4 /lambda-adapter /opt/extensions/lambda-adapter WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "ApiTester.dll"]
使ってみた感想
良かったこと
運用面
既成のWebアプリに対して大掛かりな変更を入れずともLambdaにホスティングできるため、とても手軽でした。Lambda Web Adapterを導入したコンテナはLambda以外の実行環境でもそのまま動かせるので移植性も高いと感じました。
コスト面
実行時間単位での請求になり、サーバ構築頻度も減ったことでコストを削減できました。 特にインフラ費用はLambdaの無料利用枠の恩恵を受けられることから、ほぼ無視できるコストになりました。
考慮すべきこと
性能面
Lambdaに移行したことでLambdaのコールドスタートの影響を受けるようになります。Lambda実行環境が立ち上がっていない状態でWebアプリにアクセスした場合は、通常よりもレイテンシが1~2sほど増しました。実行環境が立ち上がってしまえばその後のレイテンシは気にならない程度に収まりました。
上記特性のため性能要求の高いWebアプリには向かないかもしれませんが、制約を許容できるユースケースではホスティング手段の一つとして使えると思います。
おわりに
デモアプリをLambdaでホスティングしたことにより、運用の悩みが一つ減りました。 全てのユースケースでお勧めできる手段ではありませんが、システム特性を踏まえて活用できるとLambdaの恩恵を受けられるので良い手段ではないでしょうか。
明日12日目は、高橋さんによる「医療機関の業務を支えるデータウェアハウスの開発話」です。お楽しみに!
JMDCでは、ヘルスケア領域の課題解決に一緒に取り組んでいただける方を積極採用中です!フロントエンド /バックエンド/ データベースエンジニア等、様々なポジションで募集をしています。詳細は下記の募集一覧からご確認ください。
まずはカジュアルにJMDCメンバーと話してみたい/経験が活かせそうなポジションの話を聞いてみたい等ございましたら、下記よりエントリーいただけますと幸いです。
★最新記事のお知らせはぜひ X(Twitter)、またはBlueskyをご覧ください!