AR ホームベーカリー

オイラのアウトプット用ホームベーカリー!

ECS の scheduled task がエラーで死ぬし CloudWatch Logs に記録されない

掲題のような現象を報告されて悩んでいた。

原因

対象の scheduled task のコンピューティングオプションが Fargate から CapacitiProvider に変更されていた。

こうなってた。

CloudTrail で RunTask を確認すると、確かに以下のようにエラーメッセージ (該当の設定ではパブリック IP をアサインできない) が出ていた。

    "sourceIPAddress": "events.amazonaws.com",
    "userAgent": "events.amazonaws.com",
    "errorCode": "InvalidParameterException",
    "errorMessage": "Assign public IP is not supported for this launch type.",

修正

起動タイプ FARGATE に指定しなおして無事動いた。

ちなみにマネジメントコンソールから操作している図です

背景情報

構築には Terraform を使っていて、該当の scheduled task も以下のようにしていた。 (一部書き換えています。)

# scheduled task
resource "aws_cloudwatch_event_target" "task" {
  arn       = ARN
  rule      = RULE
  role_arn  = ROLE_ARN
  target_id = "scheduler-target"
  input     = jsonencode({
    containerOverrides = [
        {
          # name はタスク定義の JSON に記述した name と一致させないと動かない (識別に使っている?)
          name = "scheduled_task",
          command = [ "bundle exec rails task:task" ]
        }
    ]
  })

  ecs_target {
    # リビジョンなしで渡すことで常に最新のバージョンを使用するようにする
    task_definition_arn = replace(aws_ecs_task_definition.scheduled_task.arn, "/:\\d+$/", "")
    task_count          = 1
    launch_type         = "FARGATE"
    platform_version    = "1.4.0"

...

んだけど、保守運用チームは Terraform はもとより「コンテナ……?」という風情なので、動作確認で設定した時間以外に動かしたい際は「マネジメントコンソールから時間だけ変更してくれ」という運用にしていた。

たぶんこの時間変更をする際に、誤って指定を変更してしまったんだろうな、と思っている。

参考

Amazon ECS の「スケジュールされたタスク」を使用して、定期的なバッチ処理を実施しています。 先日、タスクが実施されていなかったので、CloudWatch メトリクスを確認したところFailedInvocationsが記録されていました。 呼び出しに失敗した場合に記録されるようですが、特にログなども残っていないので調査が難航しています。失敗した詳細などのログはどこかにあるのでしょうか。

まったくそのまま同じ状態だったので調査出来なくて困っていたんだけど、 CloudTrail から追跡できるんだ〜、というのを初めて知った。 めちゃくちゃ助かりましたわ。 やはりクラスメソッド君……!

dev.classmethod.jp