EventBridge Scheduler で RunTask するときにタスク定義をオーバーライドする方法

表題の How To 記事です。内容的には2023/4/2の日記に書いていたものとほぼ同じだけど、たどり着きやすいように独立した記事にしておく。


例えば Rails アプリにおける定期実行を EventBridge Scheduler から RunTask する形で組む場合、処理の種類ごとにタスク定義を用意するのは煩雑だと思う。だいたいの場合は、アプリケーション本体のために用意したタスク定義のコマンドを上書きするだけでよいはず。例えば lib/cron.rake に定期実行するタスクを書いておいて、コンテナのコマンドとして bin/rake cron:my_task, bin/rake cron:my_task_2 を指定する感じ。

また、処理の種類によってはタスク実行基盤に用意させるリソースを増やしたり減らしたりしたいかもしれない。

一言で言えば、EventBridge Scheduler から RunTask する際に、aws ecs run-task--overrides 相当のパラメータを指定したい。

これを実現する方法にたどり着くのに苦労した。create_scheduleecs_parameters には overridecontainerOverrides の項目がない。ではどうするかというと、input という項目に override 相当の JSON 文字列を突っ込む。例えばこんな感じ(関係ない部分は省略):

create_schedule({
  target: {
    ecs_parameters: {
      task_definition_arn:,
    },
    input: { cpu: '512', containerOverrides: [{ name: 'app', command: %w[echo hello] }] }.to_json
  },
})

これでタスク定義の CPU を 512 に、app コンテナのコマンドを ["echo", "hello"] にオーバーライドできる。