scale-down.tf 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. locals {
  2. # Windows Runners can take their sweet time to do anything
  3. min_runtime_defaults = {
  4. "windows" = 15
  5. "linux" = 5
  6. }
  7. }
  8. # tfsec:ignore:aws-lambda-enable-tracing We do not enable X-Ray Tracing for Lambda
  9. resource "aws_lambda_function" "scale_down" {
  10. # checkov:skip=CKV_AWS_50: see tfsec ignore X-Ray Tracing
  11. s3_bucket = var.lambda_s3_bucket != null ? var.lambda_s3_bucket : null
  12. s3_key = var.runners_lambda_s3_key != null ? var.runners_lambda_s3_key : null
  13. s3_object_version = var.runners_lambda_s3_object_version != null ? var.runners_lambda_s3_object_version : null
  14. filename = var.lambda_s3_bucket == null ? local.lambda_zip : null
  15. source_code_hash = var.lambda_s3_bucket == null ? filebase64sha256(local.lambda_zip) : null
  16. function_name = "${var.prefix}-scale-down"
  17. role = aws_iam_role.scale_down.arn
  18. handler = "index.scaleDownHandler"
  19. runtime = var.lambda_runtime
  20. timeout = var.lambda_timeout_scale_down
  21. tags = local.tags
  22. memory_size = 512
  23. architectures = var.lambda_architecture == "x86_64" ? [] : [var.lambda_architecture]
  24. environment {
  25. variables = {
  26. ENVIRONMENT = var.prefix
  27. GHES_URL = var.ghes_url
  28. LOG_LEVEL = var.log_level
  29. LOG_TYPE = var.log_type
  30. MINIMUM_RUNNING_TIME_IN_MINUTES = coalesce(var.minimum_running_time_in_minutes, local.min_runtime_defaults[var.runner_os])
  31. NODE_TLS_REJECT_UNAUTHORIZED = var.ghes_url != null && !var.ghes_ssl_verify ? 0 : 1
  32. PARAMETER_GITHUB_APP_ID_NAME = var.github_app_parameters.id.name
  33. PARAMETER_GITHUB_APP_KEY_BASE64_NAME = var.github_app_parameters.key_base64.name
  34. RUNNER_BOOT_TIME_IN_MINUTES = var.runner_boot_time_in_minutes
  35. SCALE_DOWN_CONFIG = jsonencode(var.idle_config)
  36. }
  37. }
  38. dynamic "vpc_config" {
  39. for_each = var.lambda_subnet_ids != null && var.lambda_security_group_ids != null ? [true] : []
  40. content {
  41. security_group_ids = var.lambda_security_group_ids
  42. subnet_ids = var.lambda_subnet_ids
  43. }
  44. }
  45. }
  46. resource "aws_cloudwatch_log_group" "scale_down" {
  47. name = "/aws/lambda/${aws_lambda_function.scale_down.function_name}"
  48. retention_in_days = var.logging_retention_in_days
  49. kms_key_id = var.logging_kms_key_id
  50. tags = var.tags
  51. }
  52. resource "aws_cloudwatch_event_rule" "scale_down" {
  53. name = "${var.prefix}-scale-down-rule"
  54. schedule_expression = var.scale_down_schedule_expression
  55. tags = var.tags
  56. }
  57. resource "aws_cloudwatch_event_target" "scale_down" {
  58. rule = aws_cloudwatch_event_rule.scale_down.name
  59. arn = aws_lambda_function.scale_down.arn
  60. }
  61. resource "aws_lambda_permission" "scale_down" {
  62. statement_id = "AllowExecutionFromCloudWatch"
  63. action = "lambda:InvokeFunction"
  64. function_name = aws_lambda_function.scale_down.function_name
  65. principal = "events.amazonaws.com"
  66. source_arn = aws_cloudwatch_event_rule.scale_down.arn
  67. }
  68. resource "aws_iam_role" "scale_down" {
  69. name = "${var.prefix}-action-scale-down-lambda-role"
  70. assume_role_policy = data.aws_iam_policy_document.lambda_assume_role_policy.json
  71. path = local.role_path
  72. permissions_boundary = var.role_permissions_boundary
  73. tags = local.tags
  74. }
  75. resource "aws_iam_role_policy" "scale_down" {
  76. name = "${var.prefix}-lambda-scale-down-policy"
  77. role = aws_iam_role.scale_down.name
  78. policy = templatefile("${path.module}/policies/lambda-scale-down.json", {
  79. github_app_id_arn = var.github_app_parameters.id.arn
  80. github_app_key_base64_arn = var.github_app_parameters.key_base64.arn
  81. kms_key_arn = local.kms_key_arn
  82. })
  83. }
  84. resource "aws_iam_role_policy" "scale_down_logging" {
  85. name = "${var.prefix}-lambda-logging"
  86. role = aws_iam_role.scale_down.name
  87. policy = templatefile("${path.module}/policies/lambda-cloudwatch.json", {
  88. log_group_arn = aws_cloudwatch_log_group.scale_down.arn
  89. })
  90. }
  91. resource "aws_iam_role_policy_attachment" "scale_down_vpc_execution_role" {
  92. count = length(var.lambda_subnet_ids) > 0 ? 1 : 0
  93. role = aws_iam_role.scale_down.name
  94. policy_arn = "arn:${var.aws_partition}:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
  95. }