0
0

More than 3 years have passed since last update.

CloudWatchEventsからECS on Fargateのタスクを定期的に実行しつつ環境変数を上書きする方法

Last updated at Posted at 2021-02-13

バージョン情報

$ terraform version
Terraform v0.14.6
+ provider registry.terraform.io/hashicorp/aws v3.27.0

結果はこちら


resource "aws_cloudwatch_event_rule" "cwevent_rule" {
  name                = ${好きな名前}
  schedule_expression = "cron(%d 21 * * ? *), # JST cron(%d 6 * * ? *)"
  # schedule_expression = "rate(1 minute)"
  is_enabled          = true
}
resource "aws_cloudwatch_event_target" "cwevent_target" {
  arn      = ${ECSクラスターのARN}
  rule     = aws_cloudwatch_event_rule.cwevent_rule.name
  role_arn = aws_iam_role.event_bridge.arn
  input = <<EOL
{
    "containerOverrides": [
      {
        "name": "${上書きしたいコンテナのname}",
        "environment": [
          { "name": "HOGEFUGE", "value": "hogefuge" }
        ]
      }
    ]
  }
EOL
  ecs_target {
    launch_type         = "FARGATE"
    platform_version    = "1.4.0"
    task_count          = 1
    task_definition_arn = ${起動したいtask_definitionARN}   # リビジョン指定部分をsubstr()とかで削れば常にlatestで動く

    network_configuration {
      assign_public_ip = false
      subnets          = ${タスクを動かしたいサブネットID}
      security_groups  = [${タスクにアタッチしたいSGID}]
    }
  }
}

data "aws_iam_policy_document" "event_bridge" {
  statement {
    effect = "Allow"
    principals {
      identifiers = ["events.amazonaws.com"]
      type        = "Service"
    }
    actions = ["sts:AssumeRole"]
  }
}
data "aws_iam_policy_document" "event_bridge" {
  statement {
    effect  = "Allow"
    actions = ["ecs:RunTask"]
    resources = ["*"]
  }
  statement {
    effect    = "Allow"
    actions   = ["iam:PassRole"]
    resources = ["*"]
    condition {
      test     = "StringLike"
      variable = "iam:PassedToService"
      values   = ["ecs-tasks.amazonaws.com"]
    }
  }
}
resource "aws_iam_role_policy" "event_bridge" {
  policy = data.aws_iam_policy_document.event_bridge.json
  role   = aws_iam_role.event_bridge.name
}
resource "aws_iam_role" "event_bridge" {
  name               = ${好きな名前}
  assume_role_policy = data.aws_iam_policy_document.event_bridge.json
}

なんでこんなことをしたか

  • embulkをECSを利用し定期的に実行したかった
    • ただし、すべてのテーブルを全部同時に動かすと負荷が怖いのでテーブル単位で動かしたかった
  • でもテーブルごとにdockerイメージやECSタスクを作るのはめんどくさい
  • ECSでコンテナ起動する時に環境変数を注入するがそのときの環境変数をCW Events側で上書きできればECSサービス、ECSタスク、Dockerイメージ、それぞれ1つだけ用意すれば動かせることに気がついた

「CloudWatch Events」?「Amazon EventBridge」?

  • CW Eventsは名前が変わるっぽいのでドキュメント探すときは注意が必要かも?
  • Terraform側はどう対応するのか気になる

Q: Amazon EventBridge は CloudWatch Events とどのように関連していますか?

Amazon EventBridge は、CloudWatch Events をベースに構築された、CloudWatch Events を拡張するサービスです。Amazon EventBridge では、CloudWatch Events と同じサービス API とエンドポイント、同じ基盤となるサービスインフラストラクチャを使用します。これまで CloudWatch Events を使用しているお客様にとっては、何も変わることはありません。これまでと同じ API、CloudFormation テンプレート、コンソールを引き続き使用できます。お客様からの報告によれば、CloudWatch Events はイベント駆動型アーキテクチャを構築するための理想的なサービスです。そのため、AWS ではお客様が独自のアプリケーションとサードパーティーの SaaS アプリケーションからデータを接続できるようにする新しい機能を構築しました。AWS は、この機能を CloudWatch サービス内にとどめておくのではなく、Amazon EventBridge という新しい名前でリリースしました。この機能が、CloudWatch Events が開発された目的であるモニタリングユースケースを超えた拡張であることを示すためです。

参考資料

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0