forked from github-aws-runners/terraform-aws-github-runner
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscale-down.tf
More file actions
125 lines (113 loc) · 5.34 KB
/
scale-down.tf
File metadata and controls
125 lines (113 loc) · 5.34 KB
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
locals {
# Windows Runners can take their sweet time to do anything
min_runtime_defaults = {
"windows" = 15
"linux" = 5
}
}
resource "aws_lambda_function" "scale_down" {
s3_bucket = var.lambda_s3_bucket != null ? var.lambda_s3_bucket : null
s3_key = var.runners_lambda_s3_key != null ? var.runners_lambda_s3_key : null
s3_object_version = var.runners_lambda_s3_object_version != null ? var.runners_lambda_s3_object_version : null
filename = var.lambda_s3_bucket == null ? local.lambda_zip : null
source_code_hash = var.lambda_s3_bucket == null ? filebase64sha256(local.lambda_zip) : null
function_name = "${var.prefix}-scale-down"
role = aws_iam_role.scale_down.arn
handler = "index.scaleDownHandler"
runtime = var.lambda_runtime
timeout = var.lambda_timeout_scale_down
tags = merge(local.tags, var.lambda_tags)
memory_size = var.lambda_scale_down_memory_size
architectures = [var.lambda_architecture]
environment {
variables = {
ENVIRONMENT = var.prefix
ENABLE_METRIC_GITHUB_APP_RATE_LIMIT = var.metrics.enable && var.metrics.metric.enable_github_app_rate_limit
GHES_URL = var.ghes_url
USER_AGENT = var.user_agent
LOG_LEVEL = var.log_level
MINIMUM_RUNNING_TIME_IN_MINUTES = coalesce(var.minimum_running_time_in_minutes, local.min_runtime_defaults[var.runner_os])
NODE_TLS_REJECT_UNAUTHORIZED = var.ghes_url != null && !var.ghes_ssl_verify ? 0 : 1
PARAMETER_GITHUB_APP_ID_NAME = var.github_app_parameters.id.name
PARAMETER_GITHUB_APP_KEY_BASE64_NAME = var.github_app_parameters.key_base64.name
POWERTOOLS_LOGGER_LOG_EVENT = var.log_level == "debug" ? "true" : "false"
RUNNER_BOOT_TIME_IN_MINUTES = var.runner_boot_time_in_minutes
SCALE_DOWN_CONFIG = jsonencode(var.idle_config)
POWERTOOLS_SERVICE_NAME = "${var.prefix}-scale-down"
POWERTOOLS_METRICS_NAMESPACE = var.metrics.namespace
POWERTOOLS_TRACE_ENABLED = var.tracing_config.mode != null ? true : false
POWERTOOLS_TRACER_CAPTURE_HTTPS_REQUESTS = var.tracing_config.capture_http_requests
POWERTOOLS_TRACER_CAPTURE_ERROR = var.tracing_config.capture_error
}
}
dynamic "vpc_config" {
for_each = var.lambda_subnet_ids != null && var.lambda_security_group_ids != null ? [true] : []
content {
security_group_ids = var.lambda_security_group_ids
subnet_ids = var.lambda_subnet_ids
}
}
dynamic "tracing_config" {
for_each = var.tracing_config.mode != null ? [true] : []
content {
mode = var.tracing_config.mode
}
}
}
resource "aws_cloudwatch_log_group" "scale_down" {
name = "/aws/lambda/${aws_lambda_function.scale_down.function_name}"
retention_in_days = var.logging_retention_in_days
kms_key_id = var.logging_kms_key_id
tags = var.tags
}
resource "aws_cloudwatch_event_rule" "scale_down" {
name = "${var.prefix}-scale-down-rule"
schedule_expression = var.scale_down_schedule_expression
tags = var.tags
}
resource "aws_cloudwatch_event_target" "scale_down" {
rule = aws_cloudwatch_event_rule.scale_down.name
arn = aws_lambda_function.scale_down.arn
}
resource "aws_lambda_permission" "scale_down" {
statement_id = "AllowExecutionFromCloudWatch"
action = "lambda:InvokeFunction"
function_name = aws_lambda_function.scale_down.function_name
principal = "events.amazonaws.com"
source_arn = aws_cloudwatch_event_rule.scale_down.arn
}
resource "aws_iam_role" "scale_down" {
name = "${substr("${var.prefix}-scale-down-lambda", 0, 54)}-${substr(md5("${var.prefix}-scale-down-lambda"), 0, 8)}"
assume_role_policy = data.aws_iam_policy_document.lambda_assume_role_policy.json
path = local.role_path
permissions_boundary = var.role_permissions_boundary
tags = local.tags
}
resource "aws_iam_role_policy" "scale_down" {
name = "scale-down-policy"
role = aws_iam_role.scale_down.name
policy = templatefile("${path.module}/policies/lambda-scale-down.json", {
environment = var.prefix
github_app_id_arn = var.github_app_parameters.id.arn
github_app_key_base64_arn = var.github_app_parameters.key_base64.arn
kms_key_arn = local.kms_key_arn
})
}
resource "aws_iam_role_policy" "scale_down_logging" {
name = "logging-policy"
role = aws_iam_role.scale_down.name
policy = templatefile("${path.module}/policies/lambda-cloudwatch.json", {
log_group_arn = aws_cloudwatch_log_group.scale_down.arn
})
}
resource "aws_iam_role_policy_attachment" "scale_down_vpc_execution_role" {
count = length(var.lambda_subnet_ids) > 0 ? 1 : 0
role = aws_iam_role.scale_down.name
policy_arn = "arn:${var.aws_partition}:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
}
resource "aws_iam_role_policy" "scale_down_xray" {
count = var.tracing_config.mode != null ? 1 : 0
name = "xray-policy"
policy = data.aws_iam_policy_document.lambda_xray[0].json
role = aws_iam_role.scale_down.name
}