generated at
Herokuの無料プランが無くなるらしいのでojosamaのインフラをAWSへ移行する
こういう情報が来た
ojosamaHerokuの無料プランで稼働している
有料プランは月額700円
まぁ月額700円程度なら有料プランにしても良いが、AWSの勉強にもなるのでアプリケーションをAWSで動作する構成に作り変えたい
あとwebshAWSで動かしたいと以前から考えてたんで、それの前哨戦としてAWSに移してしまいたい
AWS Lambdaのコンテナランタイムを使えばサーバーレス構成にできるのでは、と思ってる
ということでアプリケーションの設計と移行計画を練る

現状のアプリケーション構成
フロントエンド
バックエンド
名前解決

移行後のアプリケーション構成
フロントエンド
素のHTMLとJS
バックエンド
名前解決
期待値
Amazon CloudFrontAPI GatewayAWS Lambdaは安いので月額100円もいかないんじゃないかな
無料枠に多分収まる

移行計画
pass heroku側の画面にのみお知らせを追加する
location.href をJSで強制的に書き換えて画面遷移させたり、リダイレクトで飛ばしたりしても良いんだけれど、違うドメインにいきなり飛ばすのは人によっては不安に感じるかもしれないのでやらない
あくまでユーザ自身の操作で画面遷移してもらう
pass ojosamaの各種ドキュメント(README、API仕様書など)を修正
pass ojosamaのAPIを使ってるOSSに修正PRを出す
その他
pass API Gatewayのスロットリング設定
pass CloudFrontのプライスクラス設定変更

最終的なインフラ構成
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 -[hidden]right- 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リソースを直接更新する方法もあるけれど、その場合GItHubAWSIAMユーザのアクセスキーを持たせる必要がある
AWSの認証情報をAWSの外に出したくなかったのでAWS CodeBuild経由で更新することにした
こうすればアクセスキーも発行不要だし、GItHub側に認証情報を渡さずにすむ

完了
一応移行は完了した
まだHeroku側は動いているので、AWS側と並行稼働している状態
10月中のどっかのタイミングでherokuを解約、あるいはアプリの削除すれば後始末も完了
完全サーバレス構成にできて大変満足
せっかくAWS CDKで各種リソース作れるようになったし、AWS Lambdaの知見も得られたのでwebshAWSに移したいなぁ
現状サーバはさくらVPSのを使っている
DBいらないのでAWS Lambdaのコンテナベースで動かせばいける気がしてる
・・・がユーザが任意の処理を実行できてしまうので危うさがある
少なくともLambdaに割り当てている権限分はなんらかの処理が実行できてしまう
インターネットに出ていけないように制御することはできても、何らかのAWSリソースを操作できてしまう危険がある
あとLambdaの実行環境内に何らかの認証情報や、アカウントIDなどの大事な情報が含まれてる可能性もある
なんらか頑張ってそれらのデータを引っこ抜かれたらアウトなので、移行に踏み切れないでいる
サーバの保守するの嫌なので、サーバレスな構成にしつつ値段を抑えられる構成にしたい
できないのだったらぶっちゃけアプリを停止したい気持ちが最近ある
AWS Fargate使えばコンテナベースにできるけれど高いし
EC2を使うと結局サーバが必要になるし
AWS OpsWorks使えばサーバのプロビジョニングの手間からは開放されるが、そのためにわざわざChefを書くのもなぁ
今後EC2使う機会は減っていくのでわざわざ覚えたくない気持ちがある

2022/12/31追記
毎月のAWS費用は70円程度なので、だいぶお安く運用できてる
Herokuの有料プランよりもはるかに安くて助かる