# ECS stopped tasks
resource "aws_cloudwatch_event_rule" "ecs_stopped_tasks_event_rule" {
name = "ECSStoppedTasksEvent"
description = "Triggered when an Amazon ECS Task is stopped"
event_pattern = jsonencode({
source = ["aws.ecs"]
"detail-type" = ["ECS Task State Change"]
detail = {
desiredStatus = ["STOPPED"]
lastStatus = ["STOPPED"]
}
})
state = "ENABLED"
}
resource "aws_cloudwatch_event_target" "ecs_stopped_tasks_event_target" {
target_id = "ECSStoppedTasks"
rule = aws_cloudwatch_event_rule.ecs_stopped_tasks_event_rule.name
arn = "${aws_cloudwatch_log_group.ecs_stopped_tasks_event.arn}:*"
}
# ECS stoppped task
resource "aws_cloudwatch_log_group" "ecs_stopped_tasks_event" {
name = "/aws/events/ECSStoppedTasksEvent"
retention_in_days = 90
}
# ECS Scheduled tasks resource policy
resource "aws_cloudwatch_log_resource_policy" "log_event_policy" {
policy_name = "LogEventsPolicy"
policy_document = jsonencode({
Version = "2012-10-17",
Statement = [
{
Effect = "Allow",
Principal = {
Service = [
"events.amazonaws.com",
"delivery.logs.amazonaws.com"
]
},
Action = [
"logs:CreateLogStream",
"logs:PutLogEvents"
],
Resource = ["${aws_cloudwatch_log_group.ecs_stopped_tasks_event.arn}:*"]
}
]
})
}
# 異常終了時のアラーム設定
resource "aws_cloudwatch_log_metric_filter" "task_failed_log_metric_filter" {
name = "TaskFailedLogMetricFilter"
log_group_name = aws_cloudwatch_log_group.ecs_stopped_tasks_event.name
pattern = "failed"
metric_transformation {
name = "FailedLogCount"
namespace = "TaskLogMetrics"
value = "1"
}
}
resource "aws_cloudwatch_metric_alarm" "task_failed_log_alarm" {
alarm_name = "TaskFailedLogAlarm"
comparison_operator = "GreaterThanOrEqualToThreshold"
evaluation_periods = "1"
metric_name = aws_cloudwatch_log_metric_filter.task_failed_log_metric_filter.metric_transformation[0].name
namespace = aws_cloudwatch_log_metric_filter.task_failed_log_metric_filter.metric_transformation[0].namespace
period = "60"
statistic = "Sum"
threshold = "1"
alarm_description = "Alarm when there are task failed log entries"
actions_enabled = true
alarm_actions = [
aws_sns_topic.unpaid_notificate.arn(任意の通知先)
]
}