main.tf 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261
  1. locals {
  2. tags = merge(var.tags, {
  3. "ghr:environment" = var.prefix
  4. })
  5. s3_action_runner_url = "s3://${module.runner_binaries.bucket.id}/${module.runner_binaries.runner_distribution_object_key}"
  6. github_app_parameters = {
  7. id = module.ssm.parameters.github_app_id
  8. key_base64 = module.ssm.parameters.github_app_key_base64
  9. }
  10. default_runner_labels = "self-hosted,${var.runner_os},${var.runner_architecture}"
  11. }
  12. resource "random_string" "random" {
  13. length = 24
  14. special = false
  15. upper = false
  16. }
  17. data "aws_iam_policy_document" "deny_unsecure_transport" {
  18. statement {
  19. sid = "DenyUnsecureTransport"
  20. effect = "Deny"
  21. principals {
  22. type = "AWS"
  23. identifiers = ["*"]
  24. }
  25. actions = [
  26. "sqs:*"
  27. ]
  28. resources = [
  29. "*"
  30. ]
  31. condition {
  32. test = "Bool"
  33. variable = "aws:SecureTransport"
  34. values = ["false"]
  35. }
  36. }
  37. }
  38. resource "aws_sqs_queue_policy" "build_queue_policy" {
  39. queue_url = aws_sqs_queue.queued_builds.id
  40. policy = data.aws_iam_policy_document.deny_unsecure_transport.json
  41. }
  42. resource "aws_sqs_queue" "queued_builds" {
  43. name = "${var.prefix}-queued-builds${var.fifo_build_queue ? ".fifo" : ""}"
  44. delay_seconds = var.delay_webhook_event
  45. visibility_timeout_seconds = var.runners_scale_up_lambda_timeout
  46. message_retention_seconds = var.job_queue_retention_in_seconds
  47. fifo_queue = var.fifo_build_queue
  48. receive_wait_time_seconds = 0
  49. content_based_deduplication = var.fifo_build_queue
  50. redrive_policy = var.redrive_build_queue.enabled ? jsonencode({
  51. deadLetterTargetArn = aws_sqs_queue.queued_builds_dlq[0].arn,
  52. maxReceiveCount = var.redrive_build_queue.maxReceiveCount
  53. }) : null
  54. tags = var.tags
  55. }
  56. resource "aws_sqs_queue_policy" "build_queue_dlq_policy" {
  57. count = var.redrive_build_queue.enabled ? 1 : 0
  58. queue_url = aws_sqs_queue.queued_builds.id
  59. policy = data.aws_iam_policy_document.deny_unsecure_transport.json
  60. }
  61. resource "aws_sqs_queue" "queued_builds_dlq" {
  62. count = var.redrive_build_queue.enabled ? 1 : 0
  63. name = "${var.prefix}-queued-builds_dead_letter"
  64. tags = var.tags
  65. }
  66. module "ssm" {
  67. source = "./modules/ssm"
  68. kms_key_arn = var.kms_key_arn
  69. prefix = var.prefix
  70. github_app = var.github_app
  71. tags = local.tags
  72. }
  73. module "webhook" {
  74. source = "./modules/webhook"
  75. aws_region = var.aws_region
  76. prefix = var.prefix
  77. tags = local.tags
  78. kms_key_arn = var.kms_key_arn
  79. sqs_build_queue = aws_sqs_queue.queued_builds
  80. sqs_build_queue_fifo = var.fifo_build_queue
  81. github_app_webhook_secret_arn = module.ssm.parameters.github_app_webhook_secret.arn
  82. lambda_s3_bucket = var.lambda_s3_bucket
  83. webhook_lambda_s3_key = var.webhook_lambda_s3_key
  84. webhook_lambda_s3_object_version = var.webhook_lambda_s3_object_version
  85. lambda_runtime = var.lambda_runtime
  86. lambda_architecture = var.lambda_architecture
  87. lambda_zip = var.webhook_lambda_zip
  88. lambda_timeout = var.webhook_lambda_timeout
  89. logging_retention_in_days = var.logging_retention_in_days
  90. logging_kms_key_id = var.logging_kms_key_id
  91. # labels
  92. enable_workflow_job_labels_check = var.runner_enable_workflow_job_labels_check
  93. workflow_job_labels_check_all = var.runner_enable_workflow_job_labels_check_all
  94. runner_labels = var.runner_extra_labels != "" ? "${local.default_runner_labels},${var.runner_extra_labels}" : local.default_runner_labels
  95. role_path = var.role_path
  96. role_permissions_boundary = var.role_permissions_boundary
  97. repository_white_list = var.repository_white_list
  98. log_type = var.log_type
  99. log_level = var.log_level
  100. }
  101. module "runners" {
  102. source = "./modules/runners"
  103. aws_region = var.aws_region
  104. aws_partition = var.aws_partition
  105. vpc_id = var.vpc_id
  106. subnet_ids = var.subnet_ids
  107. prefix = var.prefix
  108. tags = local.tags
  109. s3_bucket_runner_binaries = module.runner_binaries.bucket
  110. s3_location_runner_binaries = local.s3_action_runner_url
  111. runner_os = var.runner_os
  112. instance_types = var.instance_types
  113. instance_target_capacity_type = var.instance_target_capacity_type
  114. instance_allocation_strategy = var.instance_allocation_strategy
  115. instance_max_spot_price = var.instance_max_spot_price
  116. block_device_mappings = var.block_device_mappings
  117. runner_architecture = var.runner_architecture
  118. ami_filter = var.ami_filter
  119. ami_owners = var.ami_owners
  120. sqs_build_queue = aws_sqs_queue.queued_builds
  121. github_app_parameters = local.github_app_parameters
  122. enable_organization_runners = var.enable_organization_runners
  123. enable_ephemeral_runners = var.enable_ephemeral_runners
  124. enable_job_queued_check = var.enable_job_queued_check
  125. disable_runner_autoupdate = var.disable_runner_autoupdate
  126. enable_managed_runner_security_group = var.enable_managed_runner_security_group
  127. enable_runner_detailed_monitoring = var.enable_runner_detailed_monitoring
  128. scale_down_schedule_expression = var.scale_down_schedule_expression
  129. minimum_running_time_in_minutes = var.minimum_running_time_in_minutes
  130. runner_boot_time_in_minutes = var.runner_boot_time_in_minutes
  131. runner_extra_labels = var.runner_extra_labels
  132. runner_as_root = var.runner_as_root
  133. runner_run_as = var.runner_run_as
  134. runners_maximum_count = var.runners_maximum_count
  135. idle_config = var.idle_config
  136. enable_ssm_on_runners = var.enable_ssm_on_runners
  137. egress_rules = var.runner_egress_rules
  138. runner_additional_security_group_ids = var.runner_additional_security_group_ids
  139. metadata_options = var.runner_metadata_options
  140. lambda_s3_bucket = var.lambda_s3_bucket
  141. runners_lambda_s3_key = var.runners_lambda_s3_key
  142. runners_lambda_s3_object_version = var.runners_lambda_s3_object_version
  143. lambda_runtime = var.lambda_runtime
  144. lambda_architecture = var.lambda_architecture
  145. lambda_zip = var.runners_lambda_zip
  146. lambda_timeout_scale_up = var.runners_scale_up_lambda_timeout
  147. lambda_timeout_scale_down = var.runners_scale_down_lambda_timeout
  148. lambda_subnet_ids = var.lambda_subnet_ids
  149. lambda_security_group_ids = var.lambda_security_group_ids
  150. logging_retention_in_days = var.logging_retention_in_days
  151. logging_kms_key_id = var.logging_kms_key_id
  152. enable_cloudwatch_agent = var.enable_cloudwatch_agent
  153. cloudwatch_config = var.cloudwatch_config
  154. runner_log_files = var.runner_log_files
  155. runner_group_name = var.runner_group_name
  156. scale_up_reserved_concurrent_executions = var.scale_up_reserved_concurrent_executions
  157. instance_profile_path = var.instance_profile_path
  158. role_path = var.role_path
  159. role_permissions_boundary = var.role_permissions_boundary
  160. enabled_userdata = var.enabled_userdata
  161. userdata_template = var.userdata_template
  162. userdata_pre_install = var.userdata_pre_install
  163. userdata_post_install = var.userdata_post_install
  164. key_name = var.key_name
  165. runner_ec2_tags = var.runner_ec2_tags
  166. create_service_linked_role_spot = var.create_service_linked_role_spot
  167. runner_iam_role_managed_policy_arns = var.runner_iam_role_managed_policy_arns
  168. ghes_url = var.ghes_url
  169. ghes_ssl_verify = var.ghes_ssl_verify
  170. kms_key_arn = var.kms_key_arn
  171. log_type = var.log_type
  172. log_level = var.log_level
  173. pool_config = var.pool_config
  174. pool_lambda_timeout = var.pool_lambda_timeout
  175. pool_runner_owner = var.pool_runner_owner
  176. pool_lambda_reserved_concurrent_executions = var.pool_lambda_reserved_concurrent_executions
  177. }
  178. module "runner_binaries" {
  179. source = "./modules/runner-binaries-syncer"
  180. aws_region = var.aws_region
  181. prefix = var.prefix
  182. tags = local.tags
  183. distribution_bucket_name = "${var.prefix}-dist-${random_string.random.result}"
  184. runner_os = var.runner_os
  185. runner_architecture = var.runner_architecture
  186. runner_allow_prerelease_binaries = var.runner_allow_prerelease_binaries
  187. lambda_s3_bucket = var.lambda_s3_bucket
  188. syncer_lambda_s3_key = var.syncer_lambda_s3_key
  189. syncer_lambda_s3_object_version = var.syncer_lambda_s3_object_version
  190. lambda_runtime = var.lambda_runtime
  191. lambda_architecture = var.lambda_architecture
  192. lambda_zip = var.runner_binaries_syncer_lambda_zip
  193. lambda_timeout = var.runner_binaries_syncer_lambda_timeout
  194. logging_retention_in_days = var.logging_retention_in_days
  195. logging_kms_key_id = var.logging_kms_key_id
  196. server_side_encryption_configuration = var.runner_binaries_s3_sse_configuration
  197. role_path = var.role_path
  198. role_permissions_boundary = var.role_permissions_boundary
  199. log_type = var.log_type
  200. log_level = var.log_level
  201. lambda_principals = var.lambda_principals
  202. }
  203. resource "aws_resourcegroups_group" "resourcegroups_group" {
  204. name = "${var.prefix}-group"
  205. resource_query {
  206. query = templatefile("${path.module}/templates/resource-group.json", {
  207. environment = var.prefix
  208. })
  209. }
  210. }