36
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Serverless Laravel を振り返る※お金のお話もあるよ!

Last updated at Posted at 2021-01-27

※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

まとめない

以上。

36
27
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
27

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?