scale-up.tf 5.2 KB

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