継続は力なり

タイトル通り定期的な更新を心掛けるブログです。

EventBridge Scheduler で Lambda にパラメーターを渡してスケジュール実行する

タダです.

昨年末に EventBridge の新機能で EventBridge Scheduler がでました.この機能を使って Lambda にパラメーターを渡して実行してみます.

aws.amazon.com

EventBridge Scheduler とは

EventBridge Scheduler では従来の EventBridge Rule と同様にスケジューリングできるのですが,タイムゾーン指定できるようになったため EventBridge Rule と違い UTC など考慮が不要になりました.

docs.aws.amazon.com

また,事前定義済みの AWS サービスごとの個別 API をスケジューリングできるのも特徴かと思います.画像のは EC2 の StopInstances を実行することができるものになるため,以前は Lambda でコードを実行する必要がありしたが,EventBridge Scheduler で完結できるようになりました.

EventBridge Scheduler で実行する Lambda の準備

事前に EventBridge Scheduler で実行する Lambda を用意しておきます.Namehoge というパラメータがきたらその値を出力するようにしています.

package main

import (
    "context"
    "fmt"
    "github.com/aws/aws-lambda-go/lambda"
)

type Event struct {
    Name string `json:"name"`
    hoge string `json:"hoge"`
}

func handle(ctx context.Context, event Event) (string, error) {
         input := fmt.Sprintf("%s from EvnetBridge Schesuler", event.Name)
    fmt.Println(event.hoge)
    fmt.Println(input)
    return input, nil
}

func main() {
    lambda.Start(handle)
}

Terraform で EventBridge Scheduler のリソース構築

EventBridge Scheduler を Terraform で構築します.1/2 17:30 JSTに実行する Event Scheduler と Lambda を実行にあたっての IAM リソースを作ります.

resource "aws_iam_role" "evnetbridge_scheduler" {
    name = "evnetbridge-scheduler-role"
    assume_role_policy = data.aws_iam_policy_document.eventbridge_scheduler_assume_policy.json
    inline_policy {
      name = "evnetbridge-scheduler-role-inline-policy"
      policy = jsonencode({
        Version = "2012-10-17"
        Statement = [
          {
            Action = [
              "lambda:InvokeFunction",
            ]
            Effect = "Allow"
            Resource = "*"
          },
        ]
      })
    }
}
data "aws_iam_policy_document" "eventbridge_scheduler_assume_policy" {
  statement {
    effect = "Allow"
    actions = [
      "sts:AssumeRole",
    ]
    principals {
      type = "Service"
      identifiers = [
        "scheduler.amazonaws.com",
      ]
    }
  }
}
resource "aws_scheduler_schedule" "test_scheduler" {
    name = "test-scheduler"
    state = "ENABLED"
    schedule_expression = "cron(30 17 2 1 ? *)"
    schedule_expression_timezone = "Asia/Tokyo"
    flexible_time_window {
      mode = "OFF"
    }
    target {
      arn = "arn:aws:lambda:ap-northeast-1:1234567891011:function:test-lambda"
      role_arn = aws_iam_role.evnetbridge_scheduler.arn
      input = jsonencode({
        "Name" = "event-schedule-test"
        "hoge" = "fuga"
      })
    }
}

リソース作成の確認

関連情報

registry.terraform.io

Lambda の実行確認

1/2 17:30の実行を確認したところ,正常に Lambda が起動してパラメータが渡ってきてログに出力されていました.

2023-01-02T08:30:19.505Z   START RequestId: 8163b296-08e4-4ce6-9fd4-f91a622d9975 Version: $LATEST
2023-01-02T08:30:19.505Z    fuga
2023-01-02T08:30:19.505Z    test from EvnetBridge Schesuler
2023-01-02T08:30:19.507Z    END RequestId: 8163b296-08e4-4ce6-9fd4-f91a622d9975
2023-01-02T08:30:19.507Z    REPORT RequestId: 8163b296-08e4-4ce6-9fd4-f91a622d9975 Duration: 2.11 ms Billed Duration: 3 ms Memory Size: 512 MB Max Memory Used: 29 MB Init Duration: 82.45 ms

まとめ

EventBridge Scheduler でイベントの実行とパラメータを渡すことをしてみました.これまでは EventBridge Rule でやっていたことが今後は EventBridge Scheduler に変わっていきそうです.