Open3
コンテナ内作業を単発ECSタスクで代用しようとしたが上手くいかなかった
- 趣味のAWSアカウントでマストドンサーバを動かしている。料金をケチってRedisをElasticacheではなくECSタスクで動かしているが、Fargateなので定期的にタスクが再起動し、そのたびにWebアプリケーションのタスクにログインして再生成コマンドを叩く必要がある。
# tootctl feeds build
- さすがに面倒くさくなってきたので、Eventbridgeから単発のECSタスクを起動して代替できないか考えた。
- ECSタスク定義は既存のWebアプリケーションを流用し、起動時のコマンドをオーバーライドすれば良さそうだ。
- 想定通りに動作したなら、RedisのECSタスクの起動イベントをトリガーに設定すれば良いはず
- ……と思ったが、いざ起動してみるとRedisが見つからない的なエラーが発生。なぜ?
/opt/mastodon/vendor/bundle/ruby/3.0.0/gems/redis-4.5.1/lib/redis/connection/hiredis.rb:20:in `connect': Name or service not known (RuntimeError)
- RedisのECSタスクを他のタスクから参照する際、ServiceConnectを使っていたのが原因と思われる。
- ServiceConnect(CloudMap)との紐付けはECSサービス単位で行っているので、ECSクラスター配下に単発で起動したタスクでは参照できないというわけ
- 方針を変えずに実現方法を探すとすれば、コマンド実行用のECSサービスを別途作成して普段はタスク数を0個にして、Redisタスクの起動時のみ一時的にタスク数を増加させるとか
- かえって複雑化している気もする……
- いっそRedisをマネージドに戻してしまうのも手かもしれない
- 現在のコストがFargate料金+ServiceConnect用のホストゾーン料金=$9.2/月
- 2024/11現在で一番安いElasticacheは、Valkeyエンジンのcache.t4g.microのリザーブドインスタンス=$112/年=$9.34/月
- Valkeyを使ったことがないので検証は必要だが、コスト的には現状と大差なさそうだ