Herokuの無料プランが無くなるらしいのでojosamaのインフラをAWSへ移行する
2022/8/27 #インフラ #AWS
こういう情報が来た
PaaS「Heroku」が無料プラン廃止、11月から 非アクティブなアカウントとストレージも削除 - ITMedia
ojosamaはHerokuの無料プランで稼働している
有料プランは月額700円
まぁ月額700円程度なら有料プランにしても良いが、AWSの勉強にもなるのでアプリケーションをAWSで動作する構成に作り変えたい
あとwebshもAWSで動かしたいと以前から考えてたんで、それの前哨戦としてAWSに移してしまいたい
AWS Lambdaのコンテナランタイムを使えばサーバーレス構成にできるのでは、と思ってる
ということでアプリケーションの設計と移行計画を練る
現状のアプリケーション構成
フロントエンド
Go + heroku
バックエンド
Go + heroku
名前解決
heroku
移行後のアプリケーション構成
フロントエンド
素のHTMLとJS
Amazon CloudFront+S3
バックエンド
API Gateway + AWS Lambda
名前解決
Route53
期待値
Amazon CloudFrontもAPI GatewayもAWS Lambdaは安いので月額100円もいかないんじゃないかな
無料枠に多分収まる
移行計画
/icons/pass.icon ドメイン管理をAmazon Route53に移行
/icons/pass.icon AWS CDKでojosamaのWeb APIを作成する (Lambda + API Gateway)
/icons/pass.icon AWS CDKでCloudFront+S3 Webサイトをホスティングする
/icons/pass.icon heroku側の画面にのみお知らせを追加する
location.hrefをJSで強制的に書き換えて画面遷移させたり、リダイレクトで飛ばしたりしても良いんだけれど、違うドメインにいきなり飛ばすのは人によっては不安に感じるかもしれないのでやらない
あくまでユーザ自身の操作で画面遷移してもらう
https://github.com/jiro4989/ojosama-web/pull/19
/icons/pass.icon ojosamaの各種ドキュメント(README、API仕様書など)を修正
/icons/pass.icon ojosamaのAPIを使ってるOSSに修正PRを出す
https://github.com/jiro4989/ojosama-web/issues/23
その他
/icons/pass.icon API Gatewayのスロットリング設定
/icons/pass.icon CloudFrontのプライスクラス設定変更
最終的なインフラ構成
https://gyazo.com/f65e9af157bf9d87162d07365be0abc3
code:plantuml
@startuml
actor ユーザ as u
actor 開発者 as dev
cloud AWS {
package ユーザがアクセスする領域 {
CloudFront as cf
database S3 as s3
Route53 as r53
API Gateway as apigw
Lambda as l
}
package デプロイ機構 {
CodePipeline as pipe
Codebuild as build
}
}
node GitHub as gh
r53 -hiddenright- l
u -down-> r53 : 名前解決
u -down-> cf : GET index.html
cf -down-> s3
u -down-> apigw : POST /
apigw -down-> l : Lambdaプロキシ
dev -up-> gh : push
pipe -down-> gh : 更新チェック
pipe -up-> build : 起動
build -up-> s3 : 静的ファイル更新
build -up-> l : UpdateFunctionCode
build -up-> cf : Invalidation
@enduml
GitHubActionsからAWSリソースを直接更新する方法もあるけれど、その場合GItHubにAWSのIAMユーザのアクセスキーを持たせる必要がある
AWSの認証情報をAWSの外に出したくなかったのでAWS CodeBuild経由で更新することにした
こうすればアクセスキーも発行不要だし、GItHub側に認証情報を渡さずにすむ
完了
一応移行は完了した
https://ojosama.jiro4989.com
まだHeroku側は動いているので、AWS側と並行稼働している状態
10月中のどっかのタイミングでherokuを解約、あるいはアプリの削除すれば後始末も完了
完全サーバレス構成にできて大変満足
せっかくAWS CDKで各種リソース作れるようになったし、AWS Lambdaの知見も得られたのでwebshもAWSに移したいなぁ
現状サーバはさくらVPSのを使っている
DBいらないのでAWS Lambdaのコンテナベースで動かせばいける気がしてる
・・・がユーザが任意の処理を実行できてしまうので危うさがある
少なくともLambdaに割り当てている権限分はなんらかの処理が実行できてしまう
インターネットに出ていけないように制御することはできても、何らかのAWSリソースを操作できてしまう危険がある
あとLambdaの実行環境内に何らかの認証情報や、アカウントIDなどの大事な情報が含まれてる可能性もある
なんらか頑張ってそれらのデータを引っこ抜かれたらアウトなので、移行に踏み切れないでいる
サーバの保守するの嫌なので、サーバレスな構成にしつつ値段を抑えられる構成にしたい
できないのだったらぶっちゃけアプリを停止したい気持ちが最近ある
AWS Fargate使えばコンテナベースにできるけれど高いし
EC2を使うと結局サーバが必要になるし
AWS OpsWorks使えばサーバのプロビジョニングの手間からは開放されるが、そのためにわざわざChefを書くのもなぁ
今後EC2使う機会は減っていくのでわざわざ覚えたくない気持ちがある
2022/12/31追記
毎月のAWS費用は70円程度なので、だいぶお安く運用できてる
Herokuの有料プランよりもはるかに安くて助かる