main.tf 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. # tfsec:ignore:aws-lambda-enable-tracing We do not enable X-Ray Tracing for Lambda
  2. resource "aws_lambda_function" "pool" {
  3. # checkov:skip=CKV_AWS_50: see tfsec ignore X-Ray Tracing
  4. s3_bucket = var.config.lambda.s3_bucket != null ? var.config.lambda.s3_bucket : null
  5. s3_key = var.config.lambda.s3_key != null ? var.config.lambda.s3_key : null
  6. s3_object_version = var.config.lambda.s3_object_version != null ? var.config.lambda.s3_object_version : null
  7. filename = var.config.lambda.s3_bucket == null ? var.config.lambda.zip : null
  8. source_code_hash = var.config.lambda.s3_bucket == null ? filebase64sha256(var.config.lambda.zip) : null
  9. function_name = "${var.config.prefix}-pool"
  10. role = aws_iam_role.pool.arn
  11. handler = "index.adjustPool"
  12. #architectures = [var.config.lambda.architecture]
  13. architectures = var.config["lambda_architecture"] == "x86_64" ? [] : [var.config["lambda_architecture"]]
  14. runtime = var.config.lambda.runtime
  15. timeout = var.config.lambda.timeout
  16. reserved_concurrent_executions = var.config.lambda.reserved_concurrent_executions
  17. memory_size = 512
  18. tags = var.config.tags
  19. environment {
  20. variables = {
  21. DISABLE_RUNNER_AUTOUPDATE = var.config.runner.disable_runner_autoupdate
  22. ENABLE_EPHEMERAL_RUNNERS = var.config.runner.ephemeral
  23. ENVIRONMENT = var.config.prefix
  24. GHES_URL = var.config.ghes.url
  25. INSTANCE_ALLOCATION_STRATEGY = var.config.instance_allocation_strategy
  26. INSTANCE_MAX_SPOT_PRICE = var.config.instance_max_spot_price
  27. INSTANCE_TARGET_CAPACITY_TYPE = var.config.instance_target_capacity_type
  28. INSTANCE_TYPES = join(",", var.config.instance_types)
  29. LAUNCH_TEMPLATE_NAME = var.config.runner.launch_template.name
  30. LOG_LEVEL = var.config.lambda.log_level
  31. LOG_TYPE = var.config.lambda.log_type
  32. NODE_TLS_REJECT_UNAUTHORIZED = var.config.ghes.url != null && !var.config.ghes.ssl_verify ? 0 : 1
  33. PARAMETER_GITHUB_APP_ID_NAME = var.config.github_app_parameters.id.name
  34. PARAMETER_GITHUB_APP_KEY_BASE64_NAME = var.config.github_app_parameters.key_base64.name
  35. RUNNER_EXTRA_LABELS = var.config.runner.extra_labels
  36. RUNNER_GROUP_NAME = var.config.runner.group_name
  37. RUNNER_OWNER = var.config.runner.pool_owner
  38. SUBNET_IDS = join(",", var.config.subnet_ids)
  39. }
  40. }
  41. dynamic "vpc_config" {
  42. for_each = var.config.lambda.subnet_ids != null && var.config.lambda.security_group_ids != null ? [true] : []
  43. content {
  44. security_group_ids = var.config.lambda.security_group_ids
  45. subnet_ids = var.config.lambda.subnet_ids
  46. }
  47. }
  48. }
  49. resource "aws_cloudwatch_log_group" "pool" {
  50. name = "/aws/lambda/${aws_lambda_function.pool.function_name}"
  51. retention_in_days = var.config.lambda.logging_retention_in_days
  52. kms_key_id = var.config.lambda.logging_kms_key_id
  53. tags = var.config.tags
  54. }
  55. resource "aws_iam_role" "pool" {
  56. name = "${var.config.prefix}-action-pool-lambda-role"
  57. assume_role_policy = data.aws_iam_policy_document.lambda_assume_role_policy.json
  58. path = var.config.role_path
  59. permissions_boundary = var.config.role_permissions_boundary
  60. tags = var.config.tags
  61. }
  62. resource "aws_iam_role_policy" "pool" {
  63. name = "${var.config.prefix}-lambda-pool-policy"
  64. role = aws_iam_role.pool.name
  65. policy = templatefile("${path.module}/policies/lambda-pool.json", {
  66. arn_runner_instance_role = var.config.runner.role.arn
  67. github_app_id_arn = var.config.github_app_parameters.id.arn
  68. github_app_key_base64_arn = var.config.github_app_parameters.key_base64.arn
  69. kms_key_arn = var.config.kms_key_arn
  70. })
  71. }
  72. resource "aws_iam_role_policy" "pool_logging" {
  73. name = "${var.config.prefix}-lambda-logging"
  74. role = aws_iam_role.pool.name
  75. policy = templatefile("${path.module}/../policies/lambda-cloudwatch.json", {
  76. log_group_arn = aws_cloudwatch_log_group.pool.arn
  77. })
  78. }
  79. resource "aws_iam_role_policy_attachment" "pool_vpc_execution_role" {
  80. count = length(var.config.lambda.subnet_ids) > 0 ? 1 : 0
  81. role = aws_iam_role.pool.name
  82. policy_arn = "arn:${var.aws_partition}:iam::aws:policy/service-role/AWSLambdaVPCAccessExecutionRole"
  83. }
  84. data "aws_iam_policy_document" "lambda_assume_role_policy" {
  85. statement {
  86. actions = ["sts:AssumeRole"]
  87. principals {
  88. type = "Service"
  89. identifiers = ["lambda.amazonaws.com"]
  90. }
  91. }
  92. }
  93. # per config object one trigger is created to trigger the lambda.
  94. resource "aws_cloudwatch_event_rule" "pool" {
  95. count = length(var.config.pool)
  96. name = "${var.config.prefix}-pool-${count.index}-rule"
  97. schedule_expression = var.config.pool[count.index].schedule_expression
  98. tags = var.config.tags
  99. }
  100. resource "aws_cloudwatch_event_target" "pool" {
  101. count = length(var.config.pool)
  102. input = jsonencode({
  103. poolSize = var.config.pool[count.index].size
  104. })
  105. rule = aws_cloudwatch_event_rule.pool[count.index].name
  106. arn = aws_lambda_function.pool.arn
  107. }
  108. resource "aws_lambda_permission" "pool" {
  109. count = length(var.config.pool)
  110. statement_id = "AllowExecutionFromCloudWatch-${count.index}"
  111. action = "lambda:InvokeFunction"
  112. function_name = aws_lambda_function.pool.function_name
  113. principal = "events.amazonaws.com"
  114. source_arn = aws_cloudwatch_event_rule.pool[count.index].arn
  115. }