mybook

エピローグ — サーバーレスの未来と適材適所

1年後。ダイチは新入社員のオリエンテーションで登壇していた。

「去年、深夜3時に叩き起こされたのが何回あったと思いますか?」

参加者が苦笑いする。

「ゼロです。一度もなかった」

拍手が起きた。インフラ担当としてのダイチの夜は、サーバーレスへの移行とともに変わった。

1年間で学んだこと

サーバーレスが「正解」だった場面

Loading diagram...

ダイチがサーバーレスで成功した共通点は明確だった。

  • 予測できないトラフィックスパイク: セール時の商品検索
  • イベントに反応する処理: ファイルアップロード後の変換
  • 散発的に実行されるバッチ: 週1回のレポート
  • 外部サービスのWebhook: 常時起動している必要がない

サーバーレスを「選ばなかった」場面

Loading diagram...

全部を移行しなくて良かった、とダイチは思っている。

残したもの理由
コア注文処理(Rails)ActiveRecordのトランザクション管理が堅牢
管理画面(Rails Admin)複雑な画面をLambdaで再実装するコスト > メリット
ユーザー認証(Devise)枯れたライブラリを使い続けるほうがリスクが低い
在庫リアルタイム更新コールドスタートが許容できなかった

サーバーレスを選ぶ判断フレームワーク

ダイチが後輩に伝えている判断の流れ。

Loading diagram...

サーバーレスの未来

オリエンテーションでダイチが話した、サーバーレスの現在地と展望。

コンテナとサーバーレスの融合

Lambda は現在、コンテナイメージをサポートしている。最大10GBのコンテナイメージをそのままLambdaで動かせる。

# Lambda 用の Dockerfile(ECR に push して Lambda で動かす)
FROM public.ecr.aws/lambda/ruby:3.2
 
COPY Gemfile Gemfile.lock ./
RUN bundle install --path vendor/bundle --jobs 4
 
COPY . .
 
CMD ["app.lambda_handler"]
# コンテナイメージを ECR に push
aws ecr get-login-password --region ap-northeast-1 | \
  docker login --username AWS --password-stdin \
  123456789012.dkr.ecr.ap-northeast-1.amazonaws.com
 
docker build -t ec-site-products .
docker tag ec-site-products:latest \
  123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/ec-site-products:latest
docker push \
  123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/ec-site-products:latest

これにより「既存のDockerワークフローをそのまま使いながら、サーバーレスの利点を得る」ことができる。

Lambda SnapStart(Java向け、将来的に他言語も)

JVM言語向けに既に提供されている SnapStart は、初期化済みのスナップショットからコンテナを起動することでコールドスタートをほぼゼロにする。Ruby 向けにも将来的な展開が期待される。

AWS Lambda Web Adapter

HTTP サーバーをそのまま Lambda で動かす仕組み。Rack/Sinatra/Railsアプリを最小限の変更でLambdaにデプロイできる。

# Rack/Rails アプリを Lambda で動かす
FROM public.ecr.aws/lambda/ruby:3.2
 
# Lambda Web Adapter を追加
COPY --from=public.ecr.aws/awsguru/aws-lambda-adapter:0.8.1 \
  /lambda-adapter /opt/extensions/lambda-adapter
 
ENV PORT=8080
ENV AWS_LAMBDA_EXEC_WRAPPER=/opt/bootstrap
 
COPY . .
RUN bundle install
 
# Puma を起動するだけ
CMD ["bundle", "exec", "puma", "-b", "tcp://0.0.0.0:8080"]

INFO

Lambda Web Adapter を使えば、既存のRailsアプリをほぼそのまま Lambda でホストできる。EC2/ECSからの移行コストを大幅に下げる手段として注目されている。ただし15分のタイムアウト制限は変わらない。

よくある落とし穴と対策

ダイチが過去1年で踏んだ失敗と、その対策をまとめた。

1. Lambda地獄(関数の乱立)

Before: Lambda関数が100個以上に増殖
After: 機能ドメインでグルーピング、1関数に複数ルートをまとめる

判断基準:
- 同じコードを共有するなら1つの関数にまとめる
- デプロイを分けたい理由があるなら別関数

2. ローカル開発のつらさ

# Docker を使った sam local では遅くなる
sam local start-api  # Docker起動で20-30秒待つ
 
# 改善: ビジネスロジックをLambdaから分離してユニットテストを充実させる
# Lambdaハンドラは「薄い入出力変換レイヤー」に留める
# ハンドラは薄く、ビジネスロジックは別クラスに
def lambda_handler(event:, context:)
  product_id = event.dig('pathParameters', 'id')
  # ビジネスロジックはPOROクラスに切り出す
  product = ProductFinder.find(product_id)
  success_response(product.to_h)
end
 
# spec/product_finder_spec.rb でローカルにテストできる
# LambdaはRSpecで動く必要すらない

3. 分散トレーシングの不足

Before: "どのLambdaで何が起きたか" が全く分からない
After: X-Ray + 構造化ログで全トレース可能

必須の設定:
- Globals.Function.Tracing: Active
- 全ログに requestId, correlationId を含める
- CloudWatch Logs Insights でのダッシュボード作成

4. テスト環境のドリフト

問題: ローカルと本番でIAMポリシーが違い、本番でのみ権限エラー
対策:
- sam validate --lint でポリシーを静的チェック
- IAM Access Analyzer で最小権限の検証
- Staging環境を本番と同じSAMテンプレートから生成

チームへのメッセージ

オリエンテーションの最後に、ダイチは新入社員にこう言った。

「サーバーレスは目的ではなく手段です。深夜の呼び出しをなくしたい、スケーリングの心配をなくしたい、そういう具体的な課題に対して、サーバーレスが有効な解決策かどうかを考えてください」

「ゼロからLambdaで全部作る必要もない。うちみたいに、Railsと組み合わせるハイブリッドアーキテクチャで始めるのが現実的です」

「大事なのは、小さく始めて、学んで、改善すること。それだけです」


ダイチの旅はここで終わりではない。

次のチャレンジは、機械学習モデルをSageMaker Serverless Inferenceで動かし、商品のレコメンド機能をサーバーレスで実現することだ。Lambda、Step Functions、EventBridge——これらで培った「イベント駆動の思考」が、次の挑戦でも活きてくる予感がしていた。

この本で学んだこと まとめ

学んだこと
1サーバー管理の課題とサーバーレスへの動機
2FaaS・BaaS の概念、Lambda の実行モデル
3SAM を使った Lambda 関数の作成とデプロイ
4API Gateway + Lambda で REST API を構築
5S3・SQS・EventBridge によるイベント駆動設計
6DynamoDB と Aurora Serverless の使い分け
7Step Functions でのワークフロー設計
8IAM 最小権限・Secrets Manager・VPC 配置
9コールドスタート対策・Provisioned Concurrency・料金計算
10Rails + Lambda ハイブリッドアーキテクチャ
11適材適所・意思決定フレームワーク

INFO

サーバーレスアーキテクチャの全コードサンプルは、serverless-ec-api という名前のSAMプロジェクトとしてまとめて使えるよう構成されています。sam build && sam deploy --guided で、この本で学んだアーキテクチャを自分のAWSアカウントにデプロイして試してみてください。


ダイチのようなインフラエンジニアが、深夜の呼び出しから解放されて、本当に価値ある開発に集中できる日が、サーバーレスアーキテクチャとともに広がっていくことを願っています。