Be an Engineer.

社会人からWEBエンジニアになった人間の備忘録的勉強記録

Amazon ECSのScheduling tasksのターゲットの設定変更を行う場合はCloudWatch EventsのAPIを叩かないといけない話

タイトルだけでもう話は終わっていますね(汗)

shirakiya.hatenablog.com

Amazon ECS + CodeDeploy でタスク定義を更新するにはCodeDeployのAPIを叩かないといけないよと、この記事を昨日投稿したばかりですが、同様にAmazon ECSのScheduling tasks(以下スケジューリングタスク)でタスク定義を更新しようとした時に少しだけハマったことを書きます。

したかったこと

Amazon ECS(以下ECS)利用中、コードの変更を行いデプロイするためにECSのタスク定義だけ更新することはよくあると思います。流れで書くと以下のような感じでしょうか。

  1. 機能追加やバグ修正等で、コードを変更
  2. 最新コード用いてDocker imageをbuild
  3. ECRにimageをpush
  4. 最新imageを使った新しいrevisionのタスク定義を作成
  5. スケジューリングタスクのターゲットに設定しているタスク定義を最新のタスク定義を使うように変更

3のECRへのpushや、4のタスク定義の更新などはECR/ECSのそれぞれのAPIを叩けばいいのですが、5のスケジューリングタスクのターゲットを変更するにはECSのAPIにはそれらしいものがなく、どのAPIを使うべきかパッとわかりませんでした。

で、色々調べたところ、結論としてCloudWatch EventsPutTargetsを叩けばいいようです。

CloudWatch Events のターゲット

ECSのスケジューリングタスクに出てくるターゲットは「CloudWatch Events」の中に出てくるターゲットのことを指しています。そもそもCloudWatch Events ターゲットとは、cron記法等で記述されるルールがトリガーされた時にCloudWatch Eventsがinvokeするものを指す用語で、利用可能なAWSサービスは以下のページにズラッと記載されてます。

docs.aws.amazon.com

この中に「ECS タスク」が含まれており、スケジューリングタスクはこれを利用するわけです。

ターゲットの更新

実際にターゲットの更新を行うには、AWS CLIだと以下のようなコマンドです。

$ aws events put-targets \
  --rule test-schedule \
  --targets='[{"Id": "test-target", "Arn": "<クラスターのARM>", "RoleArn": "<ターゲットロールのARN>", "EcsParameters": {"TaskDefinitionArn": "<タスク定義のARM>", "TaskCount": 1, "LaunchType": "FARGATE", "NetworkConfiguration": {"awsvpcConfiguration": {"Subnets": ["subnet-xxx"], "SecurityGroups": ["sg-xxx"], "AssignPublicIp": "ENABLED"}}, "PlatformVersion": "LATEST"}}]'

{
    "FailedEntryCount": 0,
    "FailedEntries": []
}

タスク定義を最新のものを使いたい場合は TaskDefinitionArn の内容だけを更新すればいいというお話でございました。

まとめ

Amazon ECSのスケジューリングタスクのターゲットを更新したい場合に叩くべきAPICloudWatch EventsのPutTargets でした。

熟達者だと「スケジュール + ターゲット」という用語の組み合わせからCloudWatch Eventsのターゲットのことかな、と察することもできるのでしょうね。
とはいえ何かのご参考になれば幸いです。