AWS 格安構成 ~個人アプリをデプロイしよう~
これは 日本CTO協会24卒 Advent Calendar 2024 の5日目の記事です!
みなさん趣味で開発してますか?
エンジニアにとってアウトプットは大事な要素だと思うのですが、お金がかかっては気軽にできませんね。
今回はAWSのみで (CloudflareやVercel、Supabaseなどに頼らずに) お金をなるだけかけないように頑張っていきたいと思います。
アプリケーションサーバー編
AWSで使えるサーバーは、主要なところだとEC2やECS、Lambdaなどがあります。
無料枠で収めたい場合、サーバーレスのLambdaがほとんど唯一の選択肢になるかと思います。
その中でも特にシンプルな方法を以下で紹介します。
① Lambda (標準のランタイムを使う)
Node.jsやPythonといった、Lambdaにランタイムが標準で提供されているものは簡単にデプロイできますね。
特徴は以下のようなものがあります。
- AWS SDKなど事前にライブラリがいくつか同梱されている
- Lambdaが期待するハンドラーを定義する必要がある
- 使える言語には限りがある
- アップロードできるZIPファイルのサイズに上限がある
ちょっとしたスクリプトを書き散らす場合はこれが便利ですね。
② Lambda (Docker + Lambda Web Adapter)
個人的に気に入っているのはこちらの方法です。
Lambda Web Adapterを使うと、ハンドラーを定義せずとも、HTTPを話すWebサーバーならなんでもLambdaに乗せられるようになります。
特にDockerコンテナを使う場合、Dockerfileに1行追加するだけで動くようになります。
特徴としては、
- 好きなWebサーバーをそのまま使える
- ローカル開発が楽
- ECSに移植する際の互換性がよい
- 長期間放置すると、Inactive状態になり呼び出しに失敗することがある
などがあります。
Rustで試した例もあるので興味があれば見てください!
フロントエンド編
① CloudFront + S3
これが王道かつシンプルな構成かなと思っています。
- SPAで作っている
- SSGで作っている
- 生のHTML, CSS, JavaScriptで作っている
というような場合によく使います。
Next.jsのApp Routerなどバックエンドの機能が乗ってくる場合は、以下の②がオススメです。
(Lambda@Edge
を使って自前で頑張ることもできますが…)
② Amplify Hosting
使ったことが無い方は、AWS純正のVercelだと思ってください。
Amplify自体にはたくさんの機能がありますが、ホスティングの機能のみ使うというイメージです。
なぜ便利かと言うと、
- GitHubなどと連携して自動デプロイできる
- モダンなフレームワークを自動で検知しデプロイしてくれる
- Next.js App Routerなど、バックエンドの機能を同梱するものもデプロイできる
という特徴があるからです。
ほとんど無料枠で動きますが、アカウント開設から1年以上経っている方は、ビルド時間に対して1分単位で課金されるので気をつけましょう。
また、Vercelのビルド時間を想像していると、Amplify Hostingの方は長いと感じるかもしれません。
HTML+CSS+JavaScriptの構成をAmplify Hostingに乗せた記事も書いているので、参考にしてみてください!
データベース編
① DynamoDB
サーバーレスのLambdaを使うなら、サーバーレスのDynamoDBですよね!
NoSQLなので、RDB畑から参戦する場合は学習コストは飲む必要があります。
注意するべきことは、
- DynamoDB用の設計を考える必要がある
- RDBと違い、インデックスが張られていないものは検索できないことに注意
- 無料で使いたかったらプロビジョンドキャパシティ
- プロビジョンドキャパシティは、25 WCU・25 RCUまで無料
※2024年11月にオンデマンドキャパシティの価格がグッと下がったため、プロダクション用ワークロードではオンデマンドキャパシティが良さそうです
② EFS + SQLite
無料でどうしてもRDBが使いたい人のための構成です。
SQLiteのファイルを持ったEFSをLambdaにマウントする形で使います。
SQLiteに対応しているORMなどを使えるのが強みでしょうか。
- 同時アクセス時の整合性やバックアップなどが懸念
- LambdaはVPCに置く必要がある
書き込みの少ないアプリを1年ほど動かしていますが、今のところ耐えています。
③ Aurora Serverless v2
Aurora Serverless v2は、今まで最低のキャパシティが0.5 ACUでした。
しかし、2024年11月のアップデートで、ゼロキャパシティへのスケーリングがサポートされました!
- キャパシティが0になると再接続まで時間がかかる
- キャパシティが0以外のときは通常通り課金される
- Auroraなのでデータの整合性や耐久性は安心
- コネクションを真面目に考える場合、RDS Data APIを使うことになる
- この場合はVPC Lambdaにする必要がない
- RDS Proxyを使うと固定費が爆上がりするので今回はダメ (最低料金が8 ACUなので)
多少お金をかける覚悟があれば、RDBを使いたい人にとってはとても良い選択肢になります。
複数のアプリケーションでDBを共有するのもアリかもしれません。
アーキテクチャの例
- アプリケーションサーバー: Lambda (Docker + Lambda Web Adapter)
- フロントエンド: CloudFront + S3
- データベース: DynamoDB
で組み立てる場合の構成図例です。とても簡略化しています。
CloudFrontに好きなドメインを紐づける想定です(このとき、Route 53のホストゾーンに毎月固定で0.5ドルかかります)。
まとめ
AWSでアプリケーションをデプロイできるイメージは湧いたでしょうか?
もちろん、無料枠をたくさん用意してくれている他のプラットフォームを使うのは賢い選択肢だと思います。
「AWSで完結したい!」というアツい思いがある人は、チャレンジしてくれると嬉しいです!