kakakakakku blog

Weekly Tech Blog: Keep on Learning!

EventBridge Scheduler から ECS Task を実行する構成を EventBridge Terraform module で構築する

2023年6月17日(3日前✨)にリリースされた AWS EventBridge Terraform module の最新バージョン v2.3.0 で Amazon EventBridge Scheduler がサポートされた🎉 モジュールを使えば多少ではあるけど記述量を抑えることができて,特に IAM Role まわりは楽になる.プルリクエスト自体は3月に出てたから取り込まれるまでちょっと長かった感じ💨

リリース情報 🔗 github.com

プルリクエスト 🔗 github.com

構成

今回は1週間前にブログにまとめた「Amazon EventBridge Scheduler から Amazon ECS Task を定期実行する構成」を AWS EventBridge Terraform module で構築してみる❗️

kakakakakku.hatenablog.com

tf ファイル

最初に完成形の tf ファイルを載せておく❗️前回の記事と同じく Amazon EventBridge Scheduler にフォーカスするために Amazon VPC 関連(サブネットやセキュリティグループなど)と Amazon ECS Task 関連は準備できている前提として値をベタ書きしている.実際に組み込むときには変数などに置き換えてもらえればと👌

module "eventbridge" {
  source = "terraform-aws-modules/eventbridge/aws"

  create_bus       = false
  create_schedules = true

  create_role       = true
  role_name         = "scheduler-role"
  attach_ecs_policy = true

  ecs_target_arns = [
    "arn:aws:ecs:ap-northeast-1:000000000000:task-definition/hello-world:*",
    "arn:aws:ecs:ap-northeast-1:000000000000:task-definition/hello-world"
  ]

  schedules = {
    scheduler = {
      schedule_expression = "cron(0/10 * ? * MON-FRI *)"
      timezone            = "Asia/Tokyo"
      arn                 = "arn:aws:ecs:ap-northeast-1:000000000000:cluster/cluster"

      ecs_parameters = {
        task_definition_arn = "arn:aws:ecs:ap-northeast-1:000000000000:task-definition/hello-world:1"
        launch_type         = "FARGATE"
        platform_version    = "LATEST"
        network_configuration = {
          subnets          = ["subnet-xxxxxxxxxxxxxxxxx", "subnet-xxxxxxxxxxxxxxxxx"]
          security_groups  = ["sg-xxxxxxxxxxxxxxxxx"]
        }
      }
    }
  }
}

アーキテクチャ図

ポイント1 : IAM Role(実行ロール)

Amazon EventBridge Scheduler の IAM Role を作るためには create_roleattach_ecs_policytrue を指定しつつ,ecs_target_arns に実行を許可する Amazon ECS Task の ARN を指定する.また IAM Role 名はデフォルトだと default になってしまって微妙なので role_name も一緒に指定しておくと良いと思う.

最終的に作られるインラインポリシーは以下のようになる❗️iam:PassRoleCondition はコンソールで設定するときに自動的に作られるポリシーとは少し違う.

AWS EventBridge Terraform module を使うと,特に IAM Role まわりは記述量を減らせる👏

{
    "Statement": [
        {
            "Action": "ecs:RunTask",
            "Effect": "Allow",
            "Resource": [
                "arn:aws:ecs:ap-northeast-1:000000000000:task-definition/hello-world:*",
                "arn:aws:ecs:ap-northeast-1:000000000000:task-definition/hello-world"
            ],
            "Sid": "ECSAccess"
        },
        {
            "Action": "iam:PassRole",
            "Effect": "Allow",
            "Resource": "*",
            "Sid": "PassRole"
        }
    ],
    "Version": "2012-10-17"
}

ポイント2 : Amazon EventBridge Scheduler

Amazon EventBridge Scheduler を使うときは create_schedulestrue を指定しつつ,あとは schedules にスケジューリング設定と Amazon ECS 設定をすればよくて,このあたりの設定は aws_scheduler_schedule を使うのとほぼ同じだった.ちなみに AWS EventBridge Terraform module の variables.tf を読むと schedulesmap(any) で定義されていた📝

variable "schedules" {
  description = "A map of objects with EventBridge Schedule definitions."
  type        = map(any)
  default     = {}
}

terraform apply を実行すると

期待通りに Amazon EventBridge Scheduler を構築できた❗️