scale-up.tf 5.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. # tfsec:ignore:aws-lambda-enable-tracing We do not enable X-Ray Tracing for Lambda
  2. resource "aws_lambda_function" "scale_up" {
  3. # checkov:skip=CKV_AWS_50: see tfsec ignore X-Ray Tracing
  4. s3_bucket = var.lambda_s3_bucket != null ? var.lambda_s3_bucket : null
  5. s3_key = var.runners_lambda_s3_key != null ? var.runners_lambda_s3_key : null
  6. s3_object_version = var.runners_lambda_s3_object_version != null ? var.runners_lambda_s3_object_version : null
  7. filename = var.lambda_s3_bucket == null ? local.lambda_zip : null
  8. source_code_hash = var.lambda_s3_bucket == null ? filebase64sha256(local.lambda_zip) : null
  9. function_name = "${var.prefix}-scale-up"
  10. role = aws_iam_role.scale_up.arn
  11. handler = "index.scaleUpHandler"
  12. runtime = var.lambda_runtime
  13. timeout = var.lambda_timeout_scale_up
  14. reserved_concurrent_executions = var.scale_up_reserved_concurrent_executions
  15. memory_size = 512
  16. tags = local.tags
  17. architectures = var.lambda_architecture == "x86_64" ? [] : [var.lambda_architecture]
  18. environment {
  19. variables = {
  20. DISABLE_RUNNER_AUTOUPDATE = var.disable_runner_autoupdate
  21. ENABLE_EPHEMERAL_RUNNERS = var.enable_ephemeral_runners
  22. ENABLE_JOB_QUEUED_CHECK = local.enable_job_queued_check
  23. ENABLE_ORGANIZATION_RUNNERS = var.enable_organization_runners
  24. ENVIRONMENT = var.prefix
  25. GHES_URL = var.ghes_url
  26. INSTANCE_ALLOCATION_STRATEGY = var.instance_allocation_strategy
  27. INSTANCE_MAX_SPOT_PRICE = var.instance_max_spot_price
  28. INSTANCE_TARGET_CAPACITY_TYPE = var.instance_target_capacity_type
  29. INSTANCE_TYPES = join(",", var.instance_types)
  30. LAUNCH_TEMPLATE_NAME = aws_launch_template.runner.name
  31. LOG_LEVEL = var.log_level
  32. LOG_TYPE = var.log_type
  33. NODE_TLS_REJECT_UNAUTHORIZED = var.ghes_url != null && !var.ghes_ssl_verify ? 0 : 1
  34. PARAMETER_GITHUB_APP_ID_NAME = var.github_app_parameters.id.name
  35. PARAMETER_GITHUB_APP_KEY_BASE64_NAME = var.github_app_parameters.key_base64.name
  36. RUNNER_EXTRA_LABELS = var.runner_extra_labels
  37. RUNNER_GROUP_NAME = var.runner_group_name
  38. RUNNERS_MAXIMUM_COUNT = var.runners_maximum_count
  39. SUBNET_IDS = join(",", var.subnet_ids)
  40. }
  41. }
  42. dynamic "vpc_config" {
  43. for_each = var.lambda_subnet_ids != null && var.lambda_security_group_ids != null ? [true] : []
  44. content {
  45. security_group_ids = var.lambda_security_group_ids
  46. subnet_ids = var.lambda_subnet_ids
  47. }
  48. }
  49. }
  50. resource "aws_cloudwatch_log_group" "scale_up" {
  51. name = "/aws/lambda/${aws_lambda_function.scale_up.function_name}"
  52. retention_in_days = var.logging_retention_in_days
  53. kms_key_id = var.logging_kms_key_id
  54. tags = var.tags
  55. }
  56. resource "aws_lambda_event_source_mapping" "scale_up" {
  57. event_source_arn = var.sqs_build_queue.arn
  58. function_name = aws_lambda_function.scale_up.arn
  59. batch_size = 1
  60. }
  61. resource "aws_lambda_permission" "scale_runners_lambda" {
  62. statement_id = "AllowExecutionFromSQS"
  63. action = "lambda:InvokeFunction"
  64. function_name = aws_lambda_function.scale_up.function_name
  65. principal = "sqs.amazonaws.com"
  66. source_arn = var.sqs_build_queue.arn
  67. }
  68. resource "aws_iam_role" "scale_up" {
  69. name = "${var.prefix}-action-scale-up-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_up" {
  76. name = "${var.prefix}-lambda-scale-up-policy"
  77. role = aws_iam_role.scale_up.name
  78. policy = templatefile("${path.module}/policies/lambda-scale-up.json", {
  79. arn_runner_instance_role = aws_iam_role.runner.arn
  80. sqs_arn = var.sqs_build_queue.arn
  81. github_app_id_arn = var.github_app_parameters.id.arn
  82. github_app_key_base64_arn = var.github_app_parameters.key_base64.arn
  83. kms_key_arn = local.kms_key_arn
  84. })
  85. }
  86. resource "aws_iam_role_policy" "scale_up_logging" {
  87. name = "${var.prefix}-lambda-logging"
  88. role = aws_iam_role.scale_up.name
  89. policy = templatefile("${path.module}/policies/lambda-cloudwatch.json", {
  90. log_group_arn = aws_cloudwatch_log_group.scale_up.arn
  91. })
  92. }
  93. resource "aws_iam_role_policy" "service_linked_role" {
  94. count = var.create_service_linked_role_spot ? 1 : 0
  95. name = "${var.prefix}-service_linked_role"
  96. role = aws_iam_role.scale_up.name
  97. policy = templatefile("${path.module}/policies/service-linked-role-create-policy.json", { aws_partition = var.aws_partition })
  98. }
  99. resource "aws_iam_role_policy_attachment" "scale_up_vpc_execution_role" {
  100. count = length(var.lambda_subnet_ids) > 0 ? 1 : 0
  101. role = aws_iam_role.scale_up.name
  102. policy_arn = "arn:${var.aws_partition}:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
  103. }