-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.tf
139 lines (119 loc) · 3.84 KB
/
main.tf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
locals {
filename = "lambda.zip"
label = "app-autoscaling-activity"
all_cluster_services_resource = replace(var.ecs_cluster_arn,":cluster",":service")
}
module "dynamodb_table" {
source = "terraform-aws-modules/dynamodb-table/aws"
version = "3.1.2"
name = "${module.this.id}-latest-${local.label}"
hash_key = "ServiceName"
billing_mode = "PAY_PER_REQUEST"
create_table = true
attributes = [
{
name = "ServiceName"
type = "S"
}
]
tags = module.this.tags
}
resource "aws_cloudwatch_log_group" "app-autoscaling-activity-log-group" {
name = "/aws/ecs/${module.this.id}/scaling.log"
retention_in_days = 90
tags = module.this.tags
}
data "aws_iam_policy_document" "applicationAutoScalingActivitiesLambdaPolicy" {
statement {
effect = "Allow"
actions = [
"dynamodb:Scan",
"dynamodb:PutItem",
"dynamodb:UpdateItem"
]
resources = [
module.dynamodb_table.dynamodb_table_arn
]
}
statement {
effect = "Allow"
actions = [
"logs:CreateLogStream",
"logs:PutLogEvents",
]
resources = [
aws_cloudwatch_log_group.app-autoscaling-activity-log-group.arn,
"${aws_cloudwatch_log_group.app-autoscaling-activity-log-group.arn}:log-stream:*"
]
}
statement {
effect = "Allow"
actions = [
"ecs:ListServices"
]
resources = [
"*"
]
}
statement {
effect = "Allow"
actions = [
"ecs:DescribeServices",
]
resources = [
"${local.all_cluster_services_resource}/*"
]
}
statement {
effect = "Allow"
actions = [ "application-autoscaling:DescribeScalingActivities" ]
resources = [ "*" ]
}
}
module "lambda_function" {
source = "terraform-aws-modules/lambda/aws"
version = "2.34.1"
function_name = "${module.this.id}-${local.label}-ingester"
description = "This Lambda ingests the Application Auto Scaling activities from a given ecs cluster"
handler = "index.lambda_handler"
runtime = "python3.8"
create_function = true
attach_policy_json = true
policy_json = data.aws_iam_policy_document.applicationAutoScalingActivitiesLambdaPolicy.json
source_path = "${path.module}/src/lambda"
create_package = true
publish = true
cloudwatch_logs_retention_in_days = 30
timeout = 300
environment_variables = {
"ecs_cluster_arn" : var.ecs_cluster_arn,
"application_autoscaling_activities_loggroup" : aws_cloudwatch_log_group.app-autoscaling-activity-log-group.name,
"dynamo_db_table" : module.dynamodb_table.dynamodb_table_id
}
tags = module.this.tags
}
module "lambda-cloudwatch-trigger" {
source = "infrablocks/lambda-cloudwatch-events-trigger/aws"
version = "0.3.0"
region = var.aws_region
component = "${module.lambda_function.lambda_function_name}-trigger"
deployment_identifier = module.this.environment
lambda_arn = module.lambda_function.lambda_function_arn
lambda_function_name = module.lambda_function.lambda_function_name
lambda_schedule_expression = var.trigger_schedule_cron
}
resource "aws_cloudwatch_query_definition" "app-auto-scaling-activities" {
name = "${module.this.id}-latest-${local.label}"
log_group_names = [
aws_cloudwatch_log_group.app-autoscaling-activity-log-group.name
]
query_string = <<EOF
fields @timestamp, @message
| parse Cause /monitor alarm (?<alarm>.*) in state ALARM triggered policy (?<policy>.*)/
| parse ResourceId /service\/.*\/(?<service>.*)/
| display ActivityId, service, policy, alarm
| stats count(*) by service, policy, alarm
| sort @timestamp desc
| limit 20
EOF
}