Slide 1

Slide 1 text

Lambdalithという選択肢を検討中 2024/09/09 Ryo Ichiki X: @ryichk_dev GitHub: ryichk

Slide 2

Slide 2 text

目次 ● Lambdalithとは ● 検討しようと思った背景 ○ 個人開発 ○ Next.jsの機能をフル活用したい ○ Lambdaのコストパフォーマンス ● 良さそうと思った背景 ○ SAM CLIの一般提供開始 ○ コンテナイメージをサポート ○ Lambda Web Adapterの登場 ○ Lambda関数URLの登場 ○ CloudFrontがOACをサポート ● 他コンテナサービスとの比較 ● 有効だと思うケース ● 考慮すべき点

Slide 3

Slide 3 text

Lambdalith = Lambda + Monolith

Slide 4

Slide 4 text

Lambdalith 出典:The Lambda monolith - AWS Lambda

Slide 5

Slide 5 text

LambdaでMonolithを運用したい そう思った背景

Slide 6

Slide 6 text

Lambdalith検討の背景 1. 個人開発 2. Next.jsの機能をフル活用したい 3. Lambdaのコストパフォーマンス

Slide 7

Slide 7 text

1. 個人開発 - Webアプリを低コストで運用したい - AWSを使いたい - でもEC2は高い - 新しい技術を使ってみたい - Next.js良さそう

Slide 8

Slide 8 text

2. Next.jsの機能をフル活用したい 特にStreaming with Suspenseを使いたい Streamingを使うとページのHTMLを小さなチャンクに分割し、段階的に送信可能 出典:Routing: Loading UI and Streaming | Next.js

Slide 9

Slide 9 text

2. Next.jsの機能をフル活用したい サーバーサイドで全てのデータを読み込む前にページの一部を表示できる TTFBを改善できる 出典:Routing: Loading UI and Streaming | Next.js

Slide 10

Slide 10 text

2. Next.jsの機能をフル活用したい 静的ホスティングやAmplifyではNext.jsのStreaming機能を使えない かと言って、EC2やECSでNext.jsアプリを運用するのはコスト的に辛い 出典:Amplify support for Next.js - AWS Amplify Hosting

Slide 11

Slide 11 text

3. Lambdaのコストパフォーマンス - 無料利用枠が大きい - 従量課金制で使った分だけ支払えば良い 出典:料金 - AWS Lambda |AWS

Slide 12

Slide 12 text

Lambdalith良さそうと思った背景

Slide 13

Slide 13 text

Lambdalith良さそうと思った背景 1. SAM CLIの一般提供開始 (v1.0.0) - 2020/07/21 2. Lambdaがコンテナイメージをサポート - 2020/12/04 3. Lambda Web Adapterの登場 - 2021/09/15 (Release v0.1.0) 4. Lambda Function URLs (関数URL) の登場 - 2022/04/06 5. CloudFrontがLambda Function URLsのOACをサポート - 2024/04/11 これらの技術がサポートされてきたことによって、 Lambdaでモノリスアプリを運用するのはアリなんじゃないか? と思うようになった。

Slide 14

Slide 14 text

SAMとは? AWS Serverless Application Model の略 Infrastructure as Code (IaC) を使用してサーバーレスアプリを構築するための オープンソースなフレームワーク

Slide 15

Slide 15 text

SAM CLIとは? SAM コマンドライン・インターフェイス サーバーレスアプリをローカルで構築、テスト、ビルド、デプロイできる

Slide 16

Slide 16 text

SAM CLIを使うと何が嬉しい? アプリの構築、テスト、ビルド、デプロイが簡単にできる - sam init コマンドでサーバーレスアプリを初期化できる - sam local invoke コマンドでローカルのテスト&デバッグができる - sam build コマンドでアプリ全体をビルドできる - sam deploy コマンドでアプリをデプロイできる - sam delete コマンドでデプロイされたリソースを削除できる

Slide 17

Slide 17 text

Lambdalith良さそうと思った背景 1. SAM CLIの一般提供開始 (v1.0.0) - 2020/07/21 2. Lambdaがコンテナイメージをサポート - 2020/12/04 3. Lambda Web Adapterの登場 - 2021/09/15 (Release v0.1.0) 4. Lambda Function URLs (関数URL) の登場 - 2022/04/06 5. CloudFrontがLambda Function URLsのOACをサポート - 2024/04/11 これらの技術がサポートされてきたことによって、 Lambdaでモノリスアプリを運用するのはアリなんじゃないか? と思うようになった。

Slide 18

Slide 18 text

Lambdaでコンテナイメージが使えると何が嬉しい? - 10GBまでのコンテナイメージをLambdaにデプロイできる - .zipファイルアーカイブの場合は 50MB (解凍後250MB) - 依存関係の解決が容易 - ローカルの開発環境とデプロイ先の実行環境を揃えられる (Docker使うメリットと同じ)

Slide 19

Slide 19 text

しかし... コンテナイメージであってもLambdaのエントリーポイント (handler関数)が必要 つまり、Lambda専用のコンテナイメージを作らなければならず ECSやEKS、App Runnerといった他のコンテナサービスへの移行容易性がない

Slide 20

Slide 20 text

Lambdalith良さそうと思った背景 1. SAM CLIの一般提供開始 - 2020/07/21 2. Lambdaがコンテナイメージをサポート - 2020/12/04 3. Lambda Web Adapterの登場 - 2021/09/15 (Release v0.1.0) 4. Lambda Function URLs (関数URL) の登場 - 2022/04/06 5. CloudFrontがLambda Function URLsのOACをサポート - 2024/04/11 これらの技術がサポートされてきたことによって、 Lambdaでモノリスアプリを運用するのはアリなんじゃないか? と思うようになった。

Slide 21

Slide 21 text

Do you know “Lambda Web Adapter”?

Slide 22

Slide 22 text

Lambda Web Adapterとは LambdaでWebアプリを動かすためのOSSツール - あらゆるプログラミング言語・Webフレームワークをサポート - Dockerfileにコードを1行追加するだけで使える - 同じDockerイメージをEC2やFargate、ローカルPCでも実行可能 - Rustで構築されている (安全で効率的)

Slide 23

Slide 23 text

仕組み 出典: Lambda Web Adapter でウェブアプリを (ほぼ) そのままサーバーレス化する Lambda Web Adapter - 変化を求めるデベロッパーを応援するウェブ マガジン | AWS

Slide 24

Slide 24 text

Lambda Web Adapterを使うと何が嬉しい? - WebアプリをそのままLambdaで動かせる! - Webアプリ側のコードはLambdaを意識する必要がない - handler関数も不要 - ECSなど他のコンテナサービスへの移行も容易になった! - handler関数が不要なのでコンテナイメージを Lambda専用にする必要がなくなった - Node.jsやRubyなどランタイム埋め込み系アダプターを使う必要がなくなった - ランタイム埋め込み系アダプターはそのまま ECSでは動かない

Slide 25

Slide 25 text

Lambdalith良さそうと思った背景 1. SAM CLIの一般提供開始 - 2020/07/21 2. Lambdaがコンテナイメージをサポート - 2020/12/04 3. Lambda Web Adapterの登場 - 2021/09/15 (Release v0.1.0) 4. Lambda Function URLs (関数URL) の登場 - 2022/04/06 5. CloudFrontがLambda Function URLsのOACをサポート - 2024/04/11 これらの技術がサポートされてきたことによって、 Lambdaでモノリスアプリを運用するのはアリなんじゃないか? と思うようになった。

Slide 26

Slide 26 text

Lambda Function URLs (関数URL) とは 任意のLambda関数にHTTPSエンドポイントを生やせる オプションでCORSヘッダーも設定できる つまり、発行されたURLにリクエストを送ったらLambda関数を実行できる

Slide 27

Slide 27 text

Lambda 関数 URL を使うと何が嬉しい? - Lambda関数を実行可能なHTTPSのURLが発行される - API Gatewayを使わずにLambdaだけでWeb APIを構築できる - API Gatewayのコストを支払わずに済む - CloudFrontと組み合わせて独自ドメインの設定やキャッシュ活用が可能 - WAFを適用してセキュリティを強化することもできる

Slide 28

Slide 28 text

しかし... CloudFront使うならLambda関数URLへの直アクセスはできないようにしたい Lambda関数URLの実行認可はIAMベースしかない CloudFrontからLambda関数URLにIAMベースのリクエストを行うにはLambda@Edge を利用するしかない Lambda@Edgeの実行にはコストがかかるし複雑さが増す

Slide 29

Slide 29 text

Lambdalith良さそうと思った背景 1. SAM CLIの一般提供開始 - 2020/07/21 2. Lambdaがコンテナイメージをサポート - 2020/12/04 3. Lambda Web Adapterの登場 - 2021/09/15 (Release v0.1.0) 4. Lambda Function URLs (関数URL) の登場 - 2022/04/06 5. CloudFrontがLambda Function URLsのOACをサポート - 2024/04/11 これらの技術がサポートされてきたことによって、 Lambdaでモノリスアプリを運用するのはアリなんじゃないか? と思うようになった。

Slide 30

Slide 30 text

OACとは? オリジンアクセスコントロールの略 指定されたCloudFrontディストリビューションからのアクセスのみを許可することで Lambda関数URLのオリジンを保護できる

Slide 31

Slide 31 text

OACサポートの何が嬉しい? CloudFrontからLambda関数URLへのアクセスを認証できる - Lambda関数URLへの直接アクセスを防げる - なのでセキュリティ的によろしい

Slide 32

Slide 32 text

Lambdalith良さそうと思った背景 1. SAM CLIの一般提供開始 - 2020/07/21 2. Lambdaがコンテナイメージをサポート - 2020/12/04 3. Lambda Web Adapterの登場 - 2021/09/15 (Release v0.1.0) 4. Lambda Function URLs (関数URL) の登場 - 2022/04/06 5. CloudFrontがLambda Function URLsのOACをサポート - 2024/04/11 これらの技術がサポートされてきたことによって、 Lambdaでモノリスアプリを運用するのはアリなんじゃないか? と思うようになった。

Slide 33

Slide 33 text

他のコンテナサービスとの比較 (ECS, App Runner) メリット - コスパ(充実の無料枠・実行時間のみ課金 ) - スケーラビリティ - デプロイ容易性 デメリット - コールドスタート - Provisioned Concurrencyで緩和可能 - スケールアップ・ダウンの柔軟性不足 - vRAMの設定可能

Slide 34

Slide 34 text

有効だと思うケース - WebサービスをSmallスタートさせたいとき - 初期コストを低く運用できる - ex: スタートアップ、新規事業、個人開発 - スケールアップ・ダウンがあまり必要ないサービスの場合 - ユーザー数やリクエスト数の上限が見えている安定したサービス - ex: 社内向けシステムとか ? - プロトタイピングやPoC

Slide 35

Slide 35 text

考慮すべき点 - パッケージサイズ - アプリが大きくなるほどコールドスタートが長くなる - スケールアップ・ダウンの柔軟性 - … 他には?

Slide 36

Slide 36 text

Lambdalithはアンチパターン? 出典:The Lambda monolith - AWS Lambda

Slide 37

Slide 37 text

Rehan van der Merweさんは肯定的 AWS Community HEROにも選ばれているRehanさんはLambdalith推しの模様 - The Lambda monolith - AWS Lambdaで挙げられている欠点について反論の述 べている 出典:Should you use a Lambda Monolith, aka Lambdalith, for your API? | Rehan van der Merwe

Slide 38

Slide 38 text

引き続き調査・検討していきたいと思い ます🫡

Slide 39

Slide 39 text

参考 - The Lambda monolith - AWS Lambda - Should you use a Lambda Monolith, aka Lambdalith, for your API? | Rehan van der Merwe - What is the AWS Serverless Application Model (AWS SAM)? - AWS Serverless Application Model - AWS SAM CLI command reference - AWS Serverless Application Model - AWS Lambda Function URLs の提供開始: 単一機能のマイクロサービス向けの組み込み - Lambda クォータ - AWS Lambda - HTTPS エンドポイント | Amazon Web Services ブログ - Amazon CloudFront が Lambda 関数 URL オリジンのオリジンアクセスコントロール (OAC) を新た にサポート - コンテナランタイムとしての AWS Lambda - 変化を求めるデベロッパーを応援するウェブマガジン | AWS - AWS Lambda の上でいろんなWEB フレームワークを動かそう! / Web Frameworks on Lambda - Speaker Deck