Terraform奮闘日記#6 Change Calendarを用いてLambdaを実行
こんにちは!株式会社分析屋の加成(かなり)です。
私はAWSを用いて社内の勤怠システムのAPIを開発する業務を行っています。
具体的には下図のようなAWSの構成をTerrafromを用いて構築します。
これまでにもTerraformについての記事を書いていますのでぜひチェックしてみてください!
突然ですが、EventBridgeを使用している中でもっと柔軟にスケジュールを設定したいと思ったことはありませんか??
そこで今回#6ではSystem ManagerのChange Calenderを用いて、より柔軟にEventBridgeのスケジュールを設定したいと思います。
※ちなみに加成調べではChange CalenderでのカレンダーやイベントをTerraformで作成する方法が見つかりませんでした。。
では、実際に本題に入ります!
今回作成するシステムの概要
今回作成するシステムは下図です。
Change Calenderは定期的イベントではなく、手動で自由にイベントを作成することができます。したがって、これまでEventBridgeだけでは達成できなかったカスタム性の高い定期的実行もChange Calenderを使用することで達成することできます。
作成手順
Change Calenderの作成
カレンダーの作成
イベントの作成
Terraformの実装
EventBridge
Lambda
動作確認
①Change Calenderの作成
Change Calenderはカレンダーとイベントを作成する必要があります。
カレンダーは状態がOpenとCloseの2種類あり、この状態をEventBridgeが監視します。
また、状態についてはイベントを作成することで遷移させることができます。
では実際にカレンダーとイベントを作成していきます。
カレンダーの作成
AWS System Managerのページに移動し、Change Calenderにて以下の設定画面と同じカレンダーを作成します。
ここで、”デフォルトで閉じる”を設定することで、カレンダーはイベントが発生していないときは状態がCloseになります。
続いてイベントの作成です。
イベントの作成
イベントはカレンダーの右上にあるイベントを作成ボタンから作成可能です。
作成ボタンを押すことで、カレンダーに以下のようなイベントが作成されました。
これによって、test_eventが開始された際にはカレンダーの状態がOpenになります。では続いて、Terraformの実装をしていきます。
②Terraformの実装
Terraformでは以下の2つのサービスを構築するコードを作成します。
EventBridge
Lambda
EventBridge
aws_cloudwatch_event_rule
event_patternに先ほど作成したカレンダーをリソースとして設定してください。また、カレンダーの状態がOPENになったときにLambda関数を実行するように設定してください。
aws_cloudwatch_event_target
実行するLambda関数を設定してください。
# EventBridgeルール
resource "aws_cloudwatch_event_rule" "calendar_rule" {
# ルールの名前
name = "change-calendar-event-rule"
# ルールの説明
description = "Capture Change Calendar state changes"
# ルールの内容
# ここでカレンダーの状態がOPENになったらイベントを発生する設定を記載
event_pattern = jsonencode({
source = ["aws.ssm"]
detail-type = ["Calendar State Change"]
resource = ["arn:aws:ssm:us-west-1:110951567839:document/kanari_test"]
detail = {
state = ["OPEN"]
}
})
}
# EventBridgeターゲット設定
resource "aws_cloudwatch_event_target" "lambda_target" {
rule = aws_cloudwatch_event_rule.calendar_rule.name
arn = aws_lambda_function.scheduled_task.arn
}
# Lambda関数のEventBridge呼び出し許可
resource "aws_lambda_permission" "allow_eventbridge" {
statement_id = "AllowEventBridgeInvoke"
action = "lambda:InvokeFunction"
function_name = aws_lambda_function.scheduled_task.function_name
principal = "events.amazonaws.com"
source_arn = aws_cloudwatch_event_rule.calendar_rule.arn
}
Lambda
# Lambda実行ロールの作成
resource "aws_iam_role" "lambda_role" {
name = "scheduled_lambda_role"
assume_role_policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Action = "sts:AssumeRole"
Effect = "Allow"
Principal = {
Service = "lambda.amazonaws.com"
}
}
]
})
}
# Lambda実行用のIAMポリシー
resource "aws_iam_role_policy" "lambda_policy" {
name = "change_calendar_lambda_policy"
role = aws_iam_role.lambda_role.id
policy = jsonencode({
Version = "2012-10-17"
Statement = [
{
Effect = "Allow"
Action = [
"logs:CreateLogGroup",
"logs:CreateLogStream",
"logs:PutLogEvents"
]
Resource = "arn:aws:logs:*:*:*"
}
]
})
}
# lambdaのソースコード
data "archive_file" "function_info" {
type = "zip"
source_file = "./lambda_function.py"
output_path = "./lambda_function.zip"
}
# Lambda関数の作成
resource "aws_lambda_function" "scheduled_task" {
filename = data.archive_file.function_info.output_path
source_code_hash = data.archive_file.function_info.output_base64sha256
function_name = "scheduled_business_day_task"
role = aws_iam_role.lambda_role.arn
handler = "lambda_function.handler"
runtime = "python3.9"
}
ここまでの内容を設定することで、Change Calendarのイベントが発生した際にLambda関数が実行するシステムを構築することができます!!
終わりに
今回はChange Calendarを用いて、より柔軟にイベントを発生させることができることを記載しました。
ぜひ、これまでよりもカスタム性の高いイベントを発生させたいと思っている方はAWS System ManagerのChange Calenderを利用してみてください!!
最後になりますが、私が所属しているチームの情報も下記に載せておきますので、
ぜひ一読してみてください!!
AIエンジニア経験者向け
AIエンジニア未経験者向け
これまでの記事はこちら!
ここまでお読みいただき、ありがとうございました!
この記事が少しでも参考になりましたら「スキ」を押していただけると幸いです!
株式会社分析屋について
弊社が作成を行いました分析レポートを、鎌倉市観光協会様HPに掲載いただきました。
ホームページはこちら。
noteでの会社紹介記事はこちら。
【データ分析で日本を豊かに】
分析屋はシステム分野・ライフサイエンス分野・マーケティング分野の知見を生かし、多種多様な分野の企業様のデータ分析のご支援をさせていただいております。 「あなたの問題解決をする」をモットーに、お客様の抱える課題にあわせた解析・分析手法を用いて、問題解決へのお手伝いをいたします!
【マーケティング】
マーケティング戦略上の目的に向けて、各種のデータ統合及び加工ならびにPDCAサイクル運用全般を支援や高度なデータ分析技術により複雑な課題解決に向けての分析サービスを提供いたします。
【システム】
アプリケーション開発やデータベース構築、WEBサイト構築、運用保守業務などお客様の問題やご要望に沿ってご支援いたします。
【ライフサイエンス】
機械学習や各種アルゴリズムなどの解析アルゴリズム開発サービスを提供いたします。過去には医療系のバイタルデータを扱った解析が主でしたが、今後はそれらで培った経験・技術を工業など他の分野の企業様の問題解決にも役立てていく方針です。
【SES】
SESサービスも行っております。