実現したいこと
- Rakeタスクのスクリプトを内包したDockerイメージがあり、AWS ECRにpush済みである
- 別々のRakeタスクをAWS Fargate上で定期実行したい
- A Rakeタスクは毎分
- B Rakeタスクは毎時
サンプルコードとして以下の foo、bar Rakeタスクを定期実行したいとします。
Rakeタスク
task default: %w[foo]
task :foo do
puts "Hello Foo"
end
task :bar do
puts "Hello Bar"
end
Dockerイメージ
FROM ruby:2.6.3
ENV LANG ja_JP.UTF-8
RUN gem install bundler
RUN mkdir /app
WORKDIR /app
ADD Gemfile /app/Gemfile
ADD Gemfile.lock /app/Gemfile.lock
ADD Rakefile /app/Rakefile
RUN bundle install
CMD ["bundle", "exec", "rake", "foo"]
前提
- AWS ECRにイメージはpush済みとする
- AWS ECSクラスターは作成済みとする
環境構築
今回のポイントはここです。ECS タスクの定義作成時のコンテナ追加画面でコマンドの上書きをすることができます。これを利用して、foo, bar Rakeタスクを実行するタスク定義を2つ用意します。
タスク定義を2つ用意しました。
最後に各々のタスク定義用にタスクのスケジューリングを設定すれば完了。
これで複数Rakeタスクスクリプトを内容したDockerイメージを利用して、各々のRakeタスクを別々のスケジュールで定期実行することが実現でした。
今回は簡単なスクリプトの実現例だが、他の言語やフレームワークのバッチ処理もECS + Fargateに移植できるようになるはずです。