1+ resource "aws_kms_grant" "scale_cycle" {
2+ count = var. encryption . encrypt ? (var. enable_scale_cycle ? 1 : 0 ) : 0
3+ name = " ${ var . environment } -scale-cycle"
4+ key_id = var. encryption . kms_key_id
5+ grantee_principal = aws_iam_role. scale_cycle [0 ]. arn
6+ operations = [" Decrypt" ]
7+
8+ constraints {
9+ encryption_context_equals = {
10+ Environment = var.environment
11+ }
12+ }
13+ }
14+
15+ resource "aws_lambda_function" "scale_cycle" {
16+ count = var. enable_scale_cycle ? 1 : 0
17+ s3_bucket = var. lambda_s3_bucket != null ? var. lambda_s3_bucket : null
18+ s3_key = var. runners_lambda_s3_key != null ? var. runners_lambda_s3_key : null
19+ s3_object_version = var. runners_lambda_s3_object_version != null ? var. runners_lambda_s3_object_version : null
20+ filename = var. lambda_s3_bucket == null ? local. lambda_zip : null
21+ source_code_hash = var. lambda_s3_bucket == null ? filebase64sha256 (local. lambda_zip ) : null
22+ function_name = " ${ var . environment } -scale-cycle"
23+ role = aws_iam_role. scale_cycle [0 ]. arn
24+ handler = " index.scaleCycle"
25+ runtime = " nodejs20.x"
26+ timeout = var. lambda_timeout_scale_cycle
27+ tags = local. tags
28+ memory_size = 2048
29+
30+ environment {
31+ variables = {
32+ DATETIME_DEPLOY = local.datetime_deploy
33+ ENABLE_ORGANIZATION_RUNNERS = var.enable_organization_runners
34+ ENVIRONMENT = var.environment
35+ GITHUB_APP_CLIENT_ID = var.github_app.client_id
36+ GITHUB_APP_CLIENT_SECRET = var.github_app_client_secret
37+ GITHUB_APP_ID = var.github_app.id
38+ GITHUB_APP_KEY_BASE64 = var.github_app_key_base64
39+ KMS_KEY_ID = var.encryption.kms_key_id
40+ LAMBDA_TIMEOUT = var.lambda_timeout_scale_cycle
41+ LAUNCH_TEMPLATE_NAME_LINUX = var.launch_template_name_linux
42+ LAUNCH_TEMPLATE_NAME_LINUX_ARM64 = var.launch_template_name_linux_arm64
43+ LAUNCH_TEMPLATE_NAME_LINUX_NVIDIA = var.launch_template_name_linux_nvidia
44+ LAUNCH_TEMPLATE_NAME_WINDOWS = var.launch_template_name_windows
45+ LAUNCH_TEMPLATE_VERSION_LINUX = var.launch_template_version_linux
46+ LAUNCH_TEMPLATE_VERSION_LINUX_ARM64 = var.launch_template_version_linux_arm64
47+ LAUNCH_TEMPLATE_VERSION_LINUX_NVIDIA = var.launch_template_version_linux_nvidia
48+ LAUNCH_TEMPLATE_VERSION_WINDOWS = var.launch_template_version_windows
49+ MINIMUM_RUNNING_TIME_IN_MINUTES = var.minimum_running_time_in_minutes
50+ REDIS_ENDPOINT = var.redis_endpoint
51+ REDIS_LOGIN = var.redis_login
52+ RUNNER_EXTRA_LABELS = var.runner_extra_labels
53+ SCALE_CONFIG_ORG = var.scale_config_org
54+ SCALE_CONFIG_REPO = var.scale_config_repo
55+ SCALE_CONFIG_REPO_PATH = var.scale_config_repo_path
56+ SECRETSMANAGER_SECRETS_ID = var.secretsmanager_secrets_id
57+
58+ AWS_REGIONS_TO_VPC_IDS = join (
59+ " ," ,
60+ sort (distinct ([
61+ for region_vpc in var . vpc_ids :
62+ format (" %s|%s" , region_vpc. region , region_vpc. vpc )
63+ ]))
64+ )
65+ VPC_ID_TO_SECURITY_GROUP_IDS = join (
66+ " ," ,
67+ sort (distinct (concat (
68+ [
69+ for vpc in var . vpc_ids :
70+ format (
71+ " %s|%s" ,
72+ vpc. vpc ,
73+ var. runners_security_group_ids [local . vpc_id_to_idx [vpc . vpc ]]
74+ )
75+ ],
76+ [
77+ for vpc_subnet in var . vpc_sgs :
78+ format (" %s|%s" , vpc_subnet. vpc , vpc_subnet. sg )
79+ ]
80+ )))
81+ )
82+ VPC_ID_TO_SUBNET_IDS = join (
83+ " ," ,
84+ sort (distinct ([
85+ for vpc_subnet in var . subnet_vpc_ids :
86+ format (" %s|%s" , vpc_subnet. vpc , vpc_subnet. subnet )
87+ ]))
88+ )
89+ SUBNET_ID_TO_AZ = join (
90+ " ," ,
91+ sort (distinct ([
92+ for subnet_az in var . subnet_azs :
93+ format (" %s|%s" , subnet_az. subnet , subnet_az. az )
94+ ]))
95+ )
96+ }
97+ }
98+
99+ vpc_config {
100+ security_group_ids = concat (
101+ var. lambda_security_group_ids ,
102+ [var . runners_security_group_ids [0 ]]
103+ )
104+ subnet_ids = var. lambda_subnet_ids
105+ }
106+ }
107+
108+ resource "aws_cloudwatch_log_group" "scale_cycle" {
109+ count = var. enable_scale_cycle ? 1 : 0
110+ name = " /aws/lambda/${ aws_lambda_function . scale_cycle [0 ]. function_name } "
111+ retention_in_days = var. logging_retention_in_days
112+ tags = var. tags
113+ }
114+
115+ resource "aws_cloudwatch_event_rule" "scale_cycle" {
116+ count = var. enable_scale_cycle ? 1 : 0
117+ name = " ${ var . environment } -scale-cycle-rule"
118+ schedule_expression = var. scale_cycle_schedule_expression
119+ tags = var. tags
120+ }
121+
122+ resource "aws_cloudwatch_event_target" "scale_cycle" {
123+ count = var. enable_scale_cycle ? 1 : 0
124+ rule = aws_cloudwatch_event_rule. scale_cycle [0 ]. name
125+ arn = aws_lambda_function. scale_cycle [0 ]. arn
126+ }
127+
128+ resource "aws_lambda_permission" "scale_cycle" {
129+ count = var. enable_scale_cycle ? 1 : 0
130+ statement_id = " AllowExecutionFromCloudWatch"
131+ action = " lambda:InvokeFunction"
132+ function_name = aws_lambda_function. scale_cycle [0 ]. function_name
133+ principal = " events.amazonaws.com"
134+ source_arn = aws_cloudwatch_event_rule. scale_cycle [0 ]. arn
135+ }
136+
137+ resource "aws_iam_role" "scale_cycle" {
138+ count = var. enable_scale_cycle ? 1 : 0
139+ name = " ${ var . environment } -action-scale-cycle-lambda-role"
140+ assume_role_policy = data. aws_iam_policy_document . lambda_assume_role_policy . json
141+ path = local. role_path
142+ permissions_boundary = var. role_permissions_boundary
143+ tags = local. tags
144+ }
145+
146+ resource "aws_iam_role_policy" "scale_cycle" {
147+ count = var. enable_scale_cycle ? 1 : 0
148+ name = " ${ var . environment } -lambda-scale-cycle-policy"
149+ role = aws_iam_role. scale_cycle [0 ]. name
150+ policy = templatefile (" ${ path . module } /policies/lambda-scale-cycle.json" , {
151+ arn_runner_instance_role = var.role_runner_arn
152+ })
153+ }
154+
155+ resource "aws_iam_role_policy" "scale_cycle_logging" {
156+ count = var. enable_scale_cycle ? 1 : 0
157+ name = " ${ var . environment } -lambda-logging"
158+ role = aws_iam_role. scale_cycle [0 ]. name
159+ policy = templatefile (" ${ path . module } /policies/lambda-cloudwatch.json" , {
160+ log_group_arn = aws_cloudwatch_log_group.scale_cycle[0 ].arn
161+ })
162+ }
163+
164+ resource "aws_iam_role_policy_attachment" "scale_cycle_vpc_execution_role" {
165+ count = length (var. lambda_subnet_ids ) > 0 ? (var. enable_scale_cycle ? 1 : 0 ) : 0
166+ role = aws_iam_role. scale_cycle [0 ]. name
167+ policy_arn = " arn:aws:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
168+ }
169+
170+ resource "aws_iam_role_policy" "scale_cycle_secretsmanager_access" {
171+ count = var. secretsmanager_secrets_id != null ? (var. enable_scale_cycle ? 1 : 0 ) : 0
172+ role = aws_iam_role. scale_cycle [0 ]. name
173+ policy = templatefile (" ${ path . module } /policies/lambda-secretsmanager.json" , {
174+ secretsmanager_arn = data.aws_secretsmanager_secret_version.app_creds.arn
175+ })
176+ }
0 commit comments