※2022/01/04 運用後に ElastiCache -> DynamoDB にした部分を追記&修正
AWS Lambda x Laravel でサーバーレス構築 ⇒ 本番リリースまで実施しました。
ベストプラクティスではなかったり、情報を見落としていたりもあると思いますが、
後々の Serverless Laraveler のために『こんな感じでしたよ』というのを残しておきます。
あと費用感。とても大切。
想定される読者像
- **AWS 完全に理解した!**って人。
- Laravel で Serverless したい人。
- Serverless は理解しているけど『実際の費用感どうなん?』と思っている人。
背景とお気持ち
- 情報公開時にアクセス/トランザクションがスパイクするようなWEBサービスを作る
- 小規模開発なので予算は可能な限り抑えたい
- でも開発環境で本番環境と同等の検証ができるようにしたい
- あと開発環境をわざわざ Start / Stop するようなものは作りたくない
- 本番環境は可能な限り自動的にスケールしてほしい
- 最近の Lambda は VPC でも早くて、PHP もいけて、Laravel も動くらしい
- 僕は Laravel が好き
⇒これは AWS で Laravel Serverless するしかない! やろう!!!
アーキテクチャ
基本的には下記の AWS 公式の記事のようにしました。
サーバーレス LAMP スタック – Part 4: サーバーレス Laravel アプリの構築
異なる点や補足等は以下の通り。
-
Lambda は VPC 内で動かす。
-
API Gateway の手前には CloudFront を通していない。
-
DB には Aurora Serverless を採用。
また、開発環境のみ一定時間アクセスがないとDBを止めるように設定。 -
セッション管理で ElastiCache(Redis) を入れた。⇒ 運用後に DynamoDB に変更 -
SES からメールを送るために SMTP インターフェース用の VPC endpoint を引いている。
-
デプロイ作業や SSH トンネル用に、EC2 インスタンスがある。
ここ好き!ポイント
本番環境同等の検証ができる
それだけ。でも、とても嬉しい。
Aurora Serverless でDBがスケーリングする
- 開発環境:使うのは検証用の週1ぐらい、使うときには本番環境同等の検証がしたい
- 本番環境:ユーザースパイクに合わせてDB性能も勝手にスケールして欲しい
というところを叶えてくれるポイントになった Aurora Serverless。
取り分け良いのが、一定時間アクセスがないと自動的に停止する機能で、
停止時には稼働料金が掛からなくなる。ありがてぇ。
※停止後にアクセスすると1分ぐらい起動に時間は掛かるが、自動的に起動する。
※もちろん、本番環境は停止させない設定にできる
Lambda がとにかく安い
Google Analytics でピーク時 DAU 1500 人の利用があったが、
それでも無料利用枠の範囲内に収まったので $ 0.00 / month になっている。
困ったこと
セッション管理が Cookie だと Cookie が無限増殖してクライアントがこける
決済用の外部サイトに飛んで戻ってを繰り返すと、
Cookie が無限増殖してクライアントがこける。
ElastiCache(Redis) の単一ノードでセッション管理して対応。
$20.0 / month。苦い。
スケールしないし、単一障害点にもなってしまった。超苦い。
⇒2021年中にセッション管理を DynamoDB(オンデマンド)に切り替えて $0.09 程になりました。
Lambda が VPC 内にいるのでネットに出られない
セキュリティが担保されたり VPC 内 RDS や ElastiCache にアクセスできたりと恩恵はあるが、
AWS SES で Laravel の MAIL_DRIVER='ses' でメール送信できない、という悲しみ。
対応として、VPC endpoint から SMTP インターフェースでメール送信できるようにした。
$10.0 / month。苦い。
※NAT Gateway か NAT インスタンスで対応はできるらしい。
が、NAT Gateway が $60.0/month になりそうだったり、そもそも管理対象を増やしたくなかったので見送り。
X-Ray が使えなかった
そもそも PHP だと使えないみたいだった。しょんぼり。
気にしていたけど杞憂だったこと
ElastiCache のサイジング
スケールせず単一障害点になってしまったので、メモリ容量を懸念。
Google Analytics でピーク時 DAU 1500 人ぐらい。
ビビって t3.small にしていたがメモリ使用率 1% にも満たなかったので t3.micro でも数千/数万は捌けそう。
※その際は NW 速度がボトルネックになるかも
⇒現在は DynamoDB(オンデマンド)になりました。
Aurora Serverless のサイジング
勝手にスケールするので、料金を懸念。
Google Analytics でピーク時 DAU 1500 人ぐらい。
MySQL の FOR UPDATE ロックが絡むような処理もそこそこあったが、
最後まで1番小さいサイズ( 1 ACU で t3.medium より安い)で稼働できていた。
費用感
だいたいのね。
これが見たかったんでしょう?
開発環境
⇒Total: $60.0 $40.0 / month
ElastiCache(t3.micro) $20.0- RDS(Aurora Serverless) $15.0
- EC2(t3.micro) $15.0
- VPC endpoint $10.0
本番環境
⇒Total: $120.0 $100.0 / month
- RDS(Aurora Serverless) $70.0
ElastiCache(t3.micro) $20.0- EC2(t3.micro) $15.0
- VPC endpoint $10.0
- CloudFront $5.0
まとめない
以上。