main.tf 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174
  1. locals {
  2. tags = merge(
  3. {
  4. "Name" = format("%s-action-runner", var.prefix)
  5. },
  6. var.tags,
  7. )
  8. name_sg = var.overrides["name_sg"] == "" ? local.tags["Name"] : var.overrides["name_sg"]
  9. name_runner = var.overrides["name_runner"] == "" ? local.tags["Name"] : var.overrides["name_runner"]
  10. role_path = var.role_path == null ? "/${var.prefix}/" : var.role_path
  11. instance_profile_path = var.instance_profile_path == null ? "/${var.prefix}/" : var.instance_profile_path
  12. lambda_zip = var.lambda_zip == null ? "${path.module}/lambdas/runners/runners.zip" : var.lambda_zip
  13. userdata_template = var.userdata_template == null ? local.default_userdata_template[var.runner_os] : var.userdata_template
  14. kms_key_arn = var.kms_key_arn != null ? var.kms_key_arn : ""
  15. default_ami = {
  16. "windows" = { name = ["Windows_Server-20H2-English-Core-ContainersLatest-*"] }
  17. "linux" = var.runner_architecture == "arm64" ? { name = ["amzn2-ami-kernel-5.*-hvm-*-arm64-gp2"] } : { name = ["amzn2-ami-kernel-5.*-hvm-*-x86_64-gp2"] }
  18. }
  19. default_userdata_template = {
  20. "windows" = "${path.module}/templates/user-data.ps1"
  21. "linux" = "${path.module}/templates/user-data.sh"
  22. }
  23. userdata_install_runner = {
  24. "windows" = "${path.module}/templates/install-runner.ps1"
  25. "linux" = "${path.module}/templates/install-runner.sh"
  26. }
  27. userdata_start_runner = {
  28. "windows" = "${path.module}/templates/start-runner.ps1"
  29. "linux" = "${path.module}/templates/start-runner.sh"
  30. }
  31. ami_filter = coalesce(var.ami_filter, local.default_ami[var.runner_os])
  32. enable_job_queued_check = var.enable_job_queued_check == null ? !var.enable_ephemeral_runners : var.enable_job_queued_check
  33. }
  34. data "aws_ami" "runner" {
  35. most_recent = "true"
  36. dynamic "filter" {
  37. for_each = local.ami_filter
  38. content {
  39. name = filter.key
  40. values = filter.value
  41. }
  42. }
  43. owners = var.ami_owners
  44. }
  45. resource "aws_launch_template" "runner" {
  46. name = "${var.prefix}-action-runner"
  47. dynamic "block_device_mappings" {
  48. for_each = var.block_device_mappings != null ? var.block_device_mappings : []
  49. content {
  50. device_name = block_device_mappings.value.device_name
  51. ebs {
  52. delete_on_termination = block_device_mappings.value.delete_on_termination
  53. volume_type = block_device_mappings.value.volume_type
  54. volume_size = block_device_mappings.value.volume_size
  55. encrypted = block_device_mappings.value.encrypted
  56. iops = block_device_mappings.value.iops
  57. }
  58. }
  59. }
  60. dynamic "metadata_options" {
  61. for_each = var.metadata_options != null ? [var.metadata_options] : []
  62. content {
  63. http_endpoint = metadata_options.value.http_endpoint
  64. http_tokens = metadata_options.value.http_tokens
  65. http_put_response_hop_limit = metadata_options.value.http_put_response_hop_limit
  66. }
  67. }
  68. monitoring {
  69. enabled = var.enable_runner_detailed_monitoring
  70. }
  71. iam_instance_profile {
  72. name = aws_iam_instance_profile.runner.name
  73. }
  74. instance_initiated_shutdown_behavior = "terminate"
  75. image_id = data.aws_ami.runner.id
  76. key_name = var.key_name
  77. vpc_security_group_ids = compact(concat(
  78. var.enable_managed_runner_security_group ? [aws_security_group.runner_sg[0].id] : [],
  79. var.runner_additional_security_group_ids,
  80. ))
  81. tag_specifications {
  82. resource_type = "instance"
  83. tags = merge(
  84. local.tags,
  85. {
  86. "Name" = format("%s", local.name_runner)
  87. },
  88. var.runner_ec2_tags
  89. )
  90. }
  91. tag_specifications {
  92. resource_type = "volume"
  93. tags = merge(
  94. local.tags,
  95. {
  96. "Name" = format("%s", local.name_runner)
  97. },
  98. )
  99. }
  100. user_data = var.enabled_userdata ? base64encode(templatefile(local.userdata_template, {
  101. pre_install = var.userdata_pre_install
  102. install_runner = templatefile(local.userdata_install_runner[var.runner_os], {
  103. S3_LOCATION_RUNNER_DISTRIBUTION = var.s3_location_runner_binaries
  104. RUNNER_ARCHITECTURE = var.runner_architecture
  105. })
  106. post_install = var.userdata_post_install
  107. start_runner = templatefile(local.userdata_start_runner[var.runner_os], {})
  108. ghes_url = var.ghes_url
  109. ghes_ssl_verify = var.ghes_ssl_verify
  110. ## retain these for backwards compatibility
  111. environment = var.prefix
  112. enable_cloudwatch_agent = var.enable_cloudwatch_agent
  113. ssm_key_cloudwatch_agent_config = var.enable_cloudwatch_agent ? aws_ssm_parameter.cloudwatch_agent_config_runner[0].name : ""
  114. })) : ""
  115. tags = local.tags
  116. update_default_version = true
  117. }
  118. resource "aws_security_group" "runner_sg" {
  119. count = var.enable_managed_runner_security_group ? 1 : 0
  120. name_prefix = "${var.prefix}-github-actions-runner-sg"
  121. description = "Github Actions Runner security group"
  122. vpc_id = var.vpc_id
  123. dynamic "egress" {
  124. for_each = var.egress_rules
  125. iterator = each
  126. content {
  127. cidr_blocks = each.value.cidr_blocks
  128. ipv6_cidr_blocks = each.value.ipv6_cidr_blocks
  129. prefix_list_ids = each.value.prefix_list_ids
  130. from_port = each.value.from_port
  131. protocol = each.value.protocol
  132. security_groups = each.value.security_groups
  133. self = each.value.self
  134. to_port = each.value.to_port
  135. description = each.value.description
  136. }
  137. }
  138. tags = merge(
  139. local.tags,
  140. {
  141. "Name" = format("%s", local.name_sg)
  142. },
  143. )
  144. }