Open3

コンテナ内作業を単発ECSタスクで代用しようとしたが上手くいかなかった

mniwmniw
  • 趣味の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)
mniwmniw
  • RedisのECSタスクを他のタスクから参照する際、ServiceConnectを使っていたのが原因と思われる。
    • ServiceConnect(CloudMap)との紐付けはECSサービス単位で行っているので、ECSクラスター配下に単発で起動したタスクでは参照できないというわけ
  • 方針を変えずに実現方法を探すとすれば、コマンド実行用のECSサービスを別途作成して普段はタスク数を0個にして、Redisタスクの起動時のみ一時的にタスク数を増加させるとか
  • かえって複雑化している気もする……
mniwmniw
  • いっそRedisをマネージドに戻してしまうのも手かもしれない
    • 現在のコストがFargate料金+ServiceConnect用のホストゾーン料金=$9.2/月
    • 2024/11現在で一番安いElasticacheは、Valkeyエンジンのcache.t4g.microのリザーブドインスタンス=$112/年=$9.34/月
    • Valkeyを使ったことがないので検証は必要だが、コスト的には現状と大差なさそうだ