供養記事:単一EC2で動いてたMastodonサーバをECSに移行
Overview
注意
この記事書いてる最中にECSからdocker swarmに載せ替えました。
文章ほぼ出来上がってる状態だったので勿体なく感じてしまい公開します。
swarm構成については後ほど投稿予定。
まえがき
ここ半年ほどMastodonお一人様サーバをt3smallの上でほぼ公式のdocker-compose.ymlそのまま使って運用していましたが、ECSに載せ替えました。
主に「スポットフリート使えば安くならんかなー」という希望的観測 + ECSのお勉強として実施。
構成とか
構成図などの用意はまだなので今回は未掲載ですが文面で書くと、
- リバースプロキシ用EC2 t3.nano
- データベース用EC2 t3.micro
- ECSホスト EC2スポットインスタンス 1vCPU, 1GB RAM * 3
- サービスディスカバリはECSの機能でRoute53の内部用ゾーンへ
- メディア用ストレージ Wasabi
- メディア用CDN Cloudflare
- データベースバックアップはS3へ(未実装)
DBは色々迷いましたがネイティブでEC2にインストール。
nanoでいい気もしますがswapするとRedisでバシバシEBSのIOPS食ってサーバ止まっちゃいそうな気がするので。(過去似たような経験があり……)
ECSのホストはスポットフリート。
コストメリットはほぼ無し(むしろ上がっちゃうのでsshの踏み台鯖潰しました)、運用コスト爆上り(減らしたものも多いですが、知らないものだらけなので)、可用性は多分低下(スポットフリートなのでちょいちょいコンテナホスト消えて再作成走る?まだ未経験)、といった具合。
スポットインスタンスそれぞれでweb, streaming, sidekiqを動かしています。
金額
元々
- t3small
- t3nano
現在
- t3nano
- t3micro
- スポットインスタンスでt3microが3つ
コンバーチブルRIみたいにmicroを1として数えると元々のは2.5,今のは1.5+スポット(大体1台あたり7割減なので合計約1)で2.5くらい。
ストレージは今スポットで使わせてる分が無駄使いすぎ(デフォ30GBです。そんなに使わない)ですが、元々のもDBコンテナ用に50GBとか当ててたり。
ただssh踏み台を潰したのでEIPも減り、EC2全体の金額を見るとほぼ同じですね。
ECS構成
各種サービスの設定はそれぞれについてymlを書き、ecs-cliからアップしています。
tootsuite/Mastodonのdocker-compose.ymlからそれぞれコピーしただけなので中身についてはここでは割愛(swarm構成記事に乗せるかも)。
またwebとstreamingはネットワークモードをawsvpcにし、ECSのサービスディスカバリを使ってて内部Route53のAレコードを登録、リバースプロキシさせてます。
逆にsidekiqはインターネットへ出られる必要があるためネットワークモードをhostにしています。 awsvpcモードだと、VPCのアドレスをコンテナが持てるんですがただパブリックIPは持てないんですよねぇ…。
この部分どうやればsidekiqコンテナをインターネットへ出られるようにできるか分からずめっちゃ時間かかりました。NATゲートウェイなんて必要ねーんだよ!