{"id":13487077,"url":"https://github.com/philips-labs/terraform-aws-github-runner","last_synced_at":"2026-01-12T00:06:37.442Z","repository":{"id":36983493,"uuid":"258465213","full_name":"philips-labs/terraform-aws-github-runner","owner":"philips-labs","description":"Terraform module for scalable GitHub action runners on AWS","archived":false,"fork":false,"pushed_at":"2025-01-02T15:37:21.000Z","size":25776,"stargazers_count":2651,"open_issues_count":60,"forks_count":629,"subscribers_count":32,"default_branch":"main","last_synced_at":"2025-01-02T16:36:38.721Z","etag":null,"topics":["action-runner","actions-runner","aws","cicd","github","github-actions","hacktoberfest","lambda","scalable","self-hosted","serverless","terraform"],"latest_commit_sha":null,"homepage":"https://philips-labs.github.io/terraform-aws-github-runner/","language":"HCL","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/philips-labs.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":"docs/security.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-04-24T09:22:03.000Z","updated_at":"2025-01-02T15:34:07.000Z","dependencies_parsed_at":"2023-10-15T08:51:00.791Z","dependency_job_id":"3946f2b2-30dd-4aca-8135-62c407f908ba","html_url":"https://github.com/philips-labs/terraform-aws-github-runner","commit_stats":{"total_commits":2491,"total_committers":182,"mean_commits":"13.686813186813186","dds":0.3227619429947812,"last_synced_commit":"43bf911b486fc585c3de4b61ec6aa47aef48e639"},"previous_names":[],"tags_count":198,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/philips-labs%2Fterraform-aws-github-runner","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/philips-labs%2Fterraform-aws-github-runner/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/philips-labs%2Fterraform-aws-github-runner/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/philips-labs%2Fterraform-aws-github-runner/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/philips-labs","download_url":"https://codeload.github.com/philips-labs/terraform-aws-github-runner/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":232902876,"owners_count":18594356,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["action-runner","actions-runner","aws","cicd","github","github-actions","hacktoberfest","lambda","scalable","self-hosted","serverless","terraform"],"created_at":"2024-07-31T18:00:55.116Z","updated_at":"2025-09-23T03:32:28.906Z","avatar_url":"https://github.com/philips-labs.png","language":"HCL","readme":"# DEPRECATED please use - https://github.com/github-aws-runners/terraform-aws-github-runner\n\n## Terraform module Self-Hosted Scalable GitHub Actions runners on AWS.\n\n[![docs](https://img.shields.io/badge/docs-runners-blue.svg)](https://philips-labs.github.io/terraform-aws-github-runner) [![awesome-runners](https://img.shields.io/badge/listed%20on-awesome--runners-blue.svg)](https://github.com/jonico/awesome-runners) [![Terraform registry](https://img.shields.io/github/v/release/philips-labs/terraform-aws-github-runner?label=Terraform%20Registry)](https://registry.terraform.io/modules/philips-labs/github-runner/aws/) [![Terraform checks](https://github.com/philips-labs/terraform-aws-github-runner/actions/workflows/terraform.yml/badge.svg)](https://github.com/philips-labs/terraform-aws-github-runner/actions/workflows/terraform.yml) [![Lambdas](https://github.com/philips-labs/terraform-aws-github-runner/actions/workflows/lambda.yml/badge.svg)](https://github.com/philips-labs/terraform-aws-github-runner/actions/workflows/lambda.yml)\n\n\u003e 📢 We're moving `terraform-aws-github-runner` to a new organization https://github.com/github-aws-runners in January to foster growth and community ownership! 🎉 Join us on our new [Discord server](https://discord.gg/EwUScJy8) for discussions and updates. Please see #4298 for more details.\n\n\u003e 📄 Extensive documentation is available via our [GitHub Pages Docs site](https://philips-labs.github.io/terraform-aws-github-runner/).\n\n\u003e 📢 We maintain the project as a truly open-source project. We maintain the project on a best effort basis. We welcome contributions from the community. Feel free to help us answering issues, reviewing PRs, or maintaining and improving the project.\n\nThis [Terraform](https://www.terraform.io/) module creates the required infrastructure needed to host [GitHub Actions](https://github.com/features/actions) self-hosted, auto-scaling runners on [AWS spot instances](https://aws.amazon.com/ec2/spot/). It provides the required logic to handle the life cycle for scaling up and down using a set of AWS Lambda functions. Runners are scaled down to zero to avoid costs when no workflows are active.\n\n\u003cpicture\u003e\n  \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"docs/assets/runners.dark.png\"\u003e\n  \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"docs/assets/runners.light.png\"\u003e\n  \u003cimg alt=\"Runners overview\" src=\"docs/assets/runners.light.png\"\u003e\n\u003c/picture\u003e\n\n## Features\n\n- Scaling: Scale up and down based on GitHub events\n- Sustainability: Scale down to zero when no jobs are running\n- Security: Runners are created on-demand and terminated after use (ephemeral runners)\n- Cost optimization: Runners are created on spot instances\n- Tailored software, hardware and network configuration: Bring your own AMI, define the instance types and subnets to use.\n- OS support: Linux (x64/arm64) and Windows\n- Multi-Runner: Create multiple runner configurations with a single deployment\n- GitHub cloud and GitHub Enterprise Server (GHES) support.\n- Org and repo level runners. enterprise level runners are not supported (yet).\n\n\n## Getting started\n\nCheck out the detailed instructions in the [Getting Started](https://philips-labs.github.io/terraform-aws-github-runner/getting-started/) section of the docs. On a high level, the following steps are required to get started:\n- Setup your AWS account\n- Create and configure a GitHub App\n- Download or build the required lambdas\n- Deploy the module using Terraform\n- Install the GitHub App to your organization or repositories and add your repositories to the runner group(s).\n\nCheck out the provided Terraform examples in the [examples](./examples) directory for different scenarios.\n\n## Configuration\n\nPlease check the [configuration](https://philips-labs.github.io/terraform-aws-github-runner/configuration/) section of the docs for major configuration options. See the Terraform module documentation for all available options.\n\n## License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE.md) file for details.\n\n## Contributing\n\nWe welcome contributions, please check out the [contribution guide](CONTRIBUTING.md). Be aware we use [pre commit hooks](https://pre-commit.com/) to update the docs.\n\n## Philips Forest\n\nThis module is part of the Philips Forest.\n\n```plain\n                                                     ___                   _\n                                                    / __\\__  _ __ ___  ___| |_\n                                                   / _\\/ _ \\| '__/ _ \\/ __| __|\n                                                  / / | (_) | | |  __/\\__ \\ |_\n                                                  \\/   \\___/|_|  \\___||___/\\__|\n\n                                                                 Infrastructure\n```\n\nTalk to the forestkeepers in the `runners-channel` on Slack.\n\n[![Slack](https://img.shields.io/badge/Slack-4A154B?style=for-the-badge\u0026logo=slack\u0026logoColor=white)](https://join.slack.com/t/philips-software/shared_invite/zt-xecw65v5-i1531hGP~mdVwgxLFx7ckg)\n\n\n\u003cdetails\u003e\n\u003csummary\u003eTerraform root module documention\u003c/summary\u003e\n\u003c!-- --8\u003c-- [start:mkdocsrunners] --\u003e\n\n\u003c!-- BEGIN_TF_DOCS --\u003e\n## Requirements\n\n| Name | Version |\n|------|---------|\n| \u003ca name=\"requirement_terraform\"\u003e\u003c/a\u003e [terraform](#requirement\\_terraform) | \u003e= 1.3.0 |\n| \u003ca name=\"requirement_aws\"\u003e\u003c/a\u003e [aws](#requirement\\_aws) | ~\u003e 5.77 |\n| \u003ca name=\"requirement_random\"\u003e\u003c/a\u003e [random](#requirement\\_random) | ~\u003e 3.0 |\n\n## Providers\n\n| Name | Version |\n|------|---------|\n| \u003ca name=\"provider_aws\"\u003e\u003c/a\u003e [aws](#provider\\_aws) | ~\u003e 5.77 |\n| \u003ca name=\"provider_random\"\u003e\u003c/a\u003e [random](#provider\\_random) | ~\u003e 3.0 |\n\n## Modules\n\n| Name | Source | Version |\n|------|--------|---------|\n| \u003ca name=\"module_ami_housekeeper\"\u003e\u003c/a\u003e [ami\\_housekeeper](#module\\_ami\\_housekeeper) | ./modules/ami-housekeeper | n/a |\n| \u003ca name=\"module_instance_termination_watcher\"\u003e\u003c/a\u003e [instance\\_termination\\_watcher](#module\\_instance\\_termination\\_watcher) | ./modules/termination-watcher | n/a |\n| \u003ca name=\"module_runner_binaries\"\u003e\u003c/a\u003e [runner\\_binaries](#module\\_runner\\_binaries) | ./modules/runner-binaries-syncer | n/a |\n| \u003ca name=\"module_runners\"\u003e\u003c/a\u003e [runners](#module\\_runners) | ./modules/runners | n/a |\n| \u003ca name=\"module_ssm\"\u003e\u003c/a\u003e [ssm](#module\\_ssm) | ./modules/ssm | n/a |\n| \u003ca name=\"module_webhook\"\u003e\u003c/a\u003e [webhook](#module\\_webhook) | ./modules/webhook | n/a |\n\n## Resources\n\n| Name | Type |\n|------|------|\n| [aws_sqs_queue.queued_builds](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/sqs_queue) | resource |\n| [aws_sqs_queue.queued_builds_dlq](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/sqs_queue) | resource |\n| [aws_sqs_queue_policy.build_queue_dlq_policy](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/sqs_queue_policy) | resource |\n| [aws_sqs_queue_policy.build_queue_policy](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/sqs_queue_policy) | resource |\n| [random_string.random](https://registry.terraform.io/providers/hashicorp/random/latest/docs/resources/string) | resource |\n| [aws_iam_policy_document.deny_unsecure_transport](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/iam_policy_document) | data source |\n\n## Inputs\n\n| Name | Description | Type | Default | Required |\n|------|-------------|------|---------|:--------:|\n| \u003ca name=\"input_ami_filter\"\u003e\u003c/a\u003e [ami\\_filter](#input\\_ami\\_filter) | Map of lists used to create the AMI filter for the action runner AMI. | `map(list(string))` | \u003cpre\u003e{\u003cbr/\u003e  \"state\": [\u003cbr/\u003e    \"available\"\u003cbr/\u003e  ]\u003cbr/\u003e}\u003c/pre\u003e | no |\n| \u003ca name=\"input_ami_housekeeper_cleanup_config\"\u003e\u003c/a\u003e [ami\\_housekeeper\\_cleanup\\_config](#input\\_ami\\_housekeeper\\_cleanup\\_config) | Configuration for AMI cleanup.\u003cbr/\u003e\u003cbr/\u003e    `amiFilters` - Filters to use when searching for AMIs to cleanup. Default filter for images owned by the account and that are available.\u003cbr/\u003e    `dryRun` - If true, no AMIs will be deregistered. Default false.\u003cbr/\u003e    `launchTemplateNames` - Launch template names to use when searching for AMIs to cleanup. Default no launch templates.\u003cbr/\u003e    `maxItems` - The maximum numer of AMI's tha will be queried for cleanup. Default no maximum.\u003cbr/\u003e    `minimumDaysOld` - Minimum number of days old an AMI must be to be considered for cleanup. Default 30.\u003cbr/\u003e    `ssmParameterNames` - SSM parameter names to use when searching for AMIs to cleanup. This parameter should be set when using SSM to configure the AMI to use. Default no SSM parameters. | \u003cpre\u003eobject({\u003cbr/\u003e    amiFilters = optional(list(object({\u003cbr/\u003e      Name   = string\u003cbr/\u003e      Values = list(string)\u003cbr/\u003e      })),\u003cbr/\u003e      [{\u003cbr/\u003e        Name : \"state\",\u003cbr/\u003e        Values : [\"available\"],\u003cbr/\u003e        },\u003cbr/\u003e        {\u003cbr/\u003e          Name : \"image-type\",\u003cbr/\u003e          Values : [\"machine\"],\u003cbr/\u003e      }]\u003cbr/\u003e    )\u003cbr/\u003e    dryRun              = optional(bool, false)\u003cbr/\u003e    launchTemplateNames = optional(list(string))\u003cbr/\u003e    maxItems            = optional(number)\u003cbr/\u003e    minimumDaysOld      = optional(number, 30)\u003cbr/\u003e    ssmParameterNames   = optional(list(string))\u003cbr/\u003e  })\u003c/pre\u003e | `{}` | no |\n| \u003ca name=\"input_ami_housekeeper_lambda_s3_key\"\u003e\u003c/a\u003e [ami\\_housekeeper\\_lambda\\_s3\\_key](#input\\_ami\\_housekeeper\\_lambda\\_s3\\_key) | S3 key for syncer lambda function. Required if using S3 bucket to specify lambdas. | `string` | `null` | no |\n| \u003ca name=\"input_ami_housekeeper_lambda_s3_object_version\"\u003e\u003c/a\u003e [ami\\_housekeeper\\_lambda\\_s3\\_object\\_version](#input\\_ami\\_housekeeper\\_lambda\\_s3\\_object\\_version) | S3 object version for syncer lambda function. Useful if S3 versioning is enabled on source bucket. | `string` | `null` | no |\n| \u003ca name=\"input_ami_housekeeper_lambda_schedule_expression\"\u003e\u003c/a\u003e [ami\\_housekeeper\\_lambda\\_schedule\\_expression](#input\\_ami\\_housekeeper\\_lambda\\_schedule\\_expression) | Scheduler expression for action runner binary syncer. | `string` | `\"rate(1 day)\"` | no |\n| \u003ca name=\"input_ami_housekeeper_lambda_timeout\"\u003e\u003c/a\u003e [ami\\_housekeeper\\_lambda\\_timeout](#input\\_ami\\_housekeeper\\_lambda\\_timeout) | Time out of the lambda in seconds. | `number` | `300` | no |\n| \u003ca name=\"input_ami_housekeeper_lambda_zip\"\u003e\u003c/a\u003e [ami\\_housekeeper\\_lambda\\_zip](#input\\_ami\\_housekeeper\\_lambda\\_zip) | File location of the lambda zip file. | `string` | `null` | no |\n| \u003ca name=\"input_ami_id_ssm_parameter_name\"\u003e\u003c/a\u003e [ami\\_id\\_ssm\\_parameter\\_name](#input\\_ami\\_id\\_ssm\\_parameter\\_name) | Externally managed SSM parameter (of data type aws:ec2:image) that contains the AMI ID to launch runner instances from. Overrides ami\\_filter | `string` | `null` | no |\n| \u003ca name=\"input_ami_kms_key_arn\"\u003e\u003c/a\u003e [ami\\_kms\\_key\\_arn](#input\\_ami\\_kms\\_key\\_arn) | Optional CMK Key ARN to be used to launch an instance from a shared encrypted AMI | `string` | `null` | no |\n| \u003ca name=\"input_ami_owners\"\u003e\u003c/a\u003e [ami\\_owners](#input\\_ami\\_owners) | The list of owners used to select the AMI of action runner instances. | `list(string)` | \u003cpre\u003e[\u003cbr/\u003e  \"amazon\"\u003cbr/\u003e]\u003c/pre\u003e | no |\n| \u003ca name=\"input_associate_public_ipv4_address\"\u003e\u003c/a\u003e [associate\\_public\\_ipv4\\_address](#input\\_associate\\_public\\_ipv4\\_address) | Associate public IPv4 with the runner. Only tested with IPv4 | `bool` | `false` | no |\n| \u003ca name=\"input_aws_partition\"\u003e\u003c/a\u003e [aws\\_partition](#input\\_aws\\_partition) | (optiona) partition in the arn namespace to use if not 'aws' | `string` | `\"aws\"` | no |\n| \u003ca name=\"input_aws_region\"\u003e\u003c/a\u003e [aws\\_region](#input\\_aws\\_region) | AWS region. | `string` | n/a | yes |\n| \u003ca name=\"input_block_device_mappings\"\u003e\u003c/a\u003e [block\\_device\\_mappings](#input\\_block\\_device\\_mappings) | The EC2 instance block device configuration. Takes the following keys: `device_name`, `delete_on_termination`, `volume_type`, `volume_size`, `encrypted`, `iops`, `throughput`, `kms_key_id`, `snapshot_id`. | \u003cpre\u003elist(object({\u003cbr/\u003e    delete_on_termination = optional(bool, true)\u003cbr/\u003e    device_name           = optional(string, \"/dev/xvda\")\u003cbr/\u003e    encrypted             = optional(bool, true)\u003cbr/\u003e    iops                  = optional(number)\u003cbr/\u003e    kms_key_id            = optional(string)\u003cbr/\u003e    snapshot_id           = optional(string)\u003cbr/\u003e    throughput            = optional(number)\u003cbr/\u003e    volume_size           = number\u003cbr/\u003e    volume_type           = optional(string, \"gp3\")\u003cbr/\u003e  }))\u003c/pre\u003e | \u003cpre\u003e[\u003cbr/\u003e  {\u003cbr/\u003e    \"volume_size\": 30\u003cbr/\u003e  }\u003cbr/\u003e]\u003c/pre\u003e | no |\n| \u003ca name=\"input_cloudwatch_config\"\u003e\u003c/a\u003e [cloudwatch\\_config](#input\\_cloudwatch\\_config) | (optional) Replaces the module's default cloudwatch log config. See https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html for details. | `string` | `null` | no |\n| \u003ca name=\"input_create_service_linked_role_spot\"\u003e\u003c/a\u003e [create\\_service\\_linked\\_role\\_spot](#input\\_create\\_service\\_linked\\_role\\_spot) | (optional) create the service linked role for spot instances that is required by the scale-up lambda. | `bool` | `false` | no |\n| \u003ca name=\"input_delay_webhook_event\"\u003e\u003c/a\u003e [delay\\_webhook\\_event](#input\\_delay\\_webhook\\_event) | The number of seconds the event accepted by the webhook is invisible on the queue before the scale up lambda will receive the event. | `number` | `30` | no |\n| \u003ca name=\"input_disable_runner_autoupdate\"\u003e\u003c/a\u003e [disable\\_runner\\_autoupdate](#input\\_disable\\_runner\\_autoupdate) | Disable the auto update of the github runner agent. Be aware there is a grace period of 30 days, see also the [GitHub article](https://github.blog/changelog/2022-02-01-github-actions-self-hosted-runners-can-now-disable-automatic-updates/) | `bool` | `false` | no |\n| \u003ca name=\"input_enable_ami_housekeeper\"\u003e\u003c/a\u003e [enable\\_ami\\_housekeeper](#input\\_enable\\_ami\\_housekeeper) | Option to disable the lambda to clean up old AMIs. | `bool` | `false` | no |\n| \u003ca name=\"input_enable_cloudwatch_agent\"\u003e\u003c/a\u003e [enable\\_cloudwatch\\_agent](#input\\_enable\\_cloudwatch\\_agent) | Enables the cloudwatch agent on the ec2 runner instances. The runner uses a default config that can be overridden via `cloudwatch_config`. | `bool` | `true` | no |\n| \u003ca name=\"input_enable_ephemeral_runners\"\u003e\u003c/a\u003e [enable\\_ephemeral\\_runners](#input\\_enable\\_ephemeral\\_runners) | Enable ephemeral runners, runners will only be used once. | `bool` | `false` | no |\n| \u003ca name=\"input_enable_jit_config\"\u003e\u003c/a\u003e [enable\\_jit\\_config](#input\\_enable\\_jit\\_config) | Overwrite the default behavior for JIT configuration. By default JIT configuration is enabled for ephemeral runners and disabled for non-ephemeral runners. In case of GHES check first if the JIT config API is avaialbe. In case you upgradeing from 3.x to 4.x you can set `enable_jit_config` to `false` to avoid a breaking change when having your own AMI. | `bool` | `null` | no |\n| \u003ca name=\"input_enable_job_queued_check\"\u003e\u003c/a\u003e [enable\\_job\\_queued\\_check](#input\\_enable\\_job\\_queued\\_check) | Only scale if the job event received by the scale up lambda is in the queued state. By default enabled for non ephemeral runners and disabled for ephemeral. Set this variable to overwrite the default behavior. | `bool` | `null` | no |\n| \u003ca name=\"input_enable_managed_runner_security_group\"\u003e\u003c/a\u003e [enable\\_managed\\_runner\\_security\\_group](#input\\_enable\\_managed\\_runner\\_security\\_group) | Enables creation of the default managed security group. Unmanaged security groups can be specified via `runner_additional_security_group_ids`. | `bool` | `true` | no |\n| \u003ca name=\"input_enable_organization_runners\"\u003e\u003c/a\u003e [enable\\_organization\\_runners](#input\\_enable\\_organization\\_runners) | Register runners to organization, instead of repo level | `bool` | `false` | no |\n| \u003ca name=\"input_enable_runner_binaries_syncer\"\u003e\u003c/a\u003e [enable\\_runner\\_binaries\\_syncer](#input\\_enable\\_runner\\_binaries\\_syncer) | Option to disable the lambda to sync GitHub runner distribution, useful when using a pre-build AMI. | `bool` | `true` | no |\n| \u003ca name=\"input_enable_runner_detailed_monitoring\"\u003e\u003c/a\u003e [enable\\_runner\\_detailed\\_monitoring](#input\\_enable\\_runner\\_detailed\\_monitoring) | Should detailed monitoring be enabled for the runner. Set this to true if you want to use detailed monitoring. See https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-cloudwatch-new.html for details. | `bool` | `false` | no |\n| \u003ca name=\"input_enable_runner_on_demand_failover_for_errors\"\u003e\u003c/a\u003e [enable\\_runner\\_on\\_demand\\_failover\\_for\\_errors](#input\\_enable\\_runner\\_on\\_demand\\_failover\\_for\\_errors) | Enable on-demand failover. For example to fall back to on demand when no spot capacity is available the variable can be set to `InsufficientInstanceCapacity`. When not defined the default behavior is to retry later. | `list(string)` | `[]` | no |\n| \u003ca name=\"input_enable_runner_workflow_job_labels_check_all\"\u003e\u003c/a\u003e [enable\\_runner\\_workflow\\_job\\_labels\\_check\\_all](#input\\_enable\\_runner\\_workflow\\_job\\_labels\\_check\\_all) | If set to true all labels in the workflow job must match the GitHub labels (os, architecture and `self-hosted`). When false if __any__ label matches it will trigger the webhook. | `bool` | `true` | no |\n| \u003ca name=\"input_enable_ssm_on_runners\"\u003e\u003c/a\u003e [enable\\_ssm\\_on\\_runners](#input\\_enable\\_ssm\\_on\\_runners) | Enable to allow access to the runner instances for debugging purposes via SSM. Note that this adds additional permissions to the runner instances. | `bool` | `false` | no |\n| \u003ca name=\"input_enable_user_data_debug_logging_runner\"\u003e\u003c/a\u003e [enable\\_user\\_data\\_debug\\_logging\\_runner](#input\\_enable\\_user\\_data\\_debug\\_logging\\_runner) | Option to enable debug logging for user-data, this logs all secrets as well. | `bool` | `false` | no |\n| \u003ca name=\"input_enable_userdata\"\u003e\u003c/a\u003e [enable\\_userdata](#input\\_enable\\_userdata) | Should the userdata script be enabled for the runner. Set this to false if you are using your own prebuilt AMI. | `bool` | `true` | no |\n| \u003ca name=\"input_eventbridge\"\u003e\u003c/a\u003e [eventbridge](#input\\_eventbridge) | Enable the use of EventBridge by the module. By enabling this feature events will be put on the EventBridge by the webhook instead of directly dispatching to queues for scaling.\u003cbr/\u003e\u003cbr/\u003e    `enable`: Enable the EventBridge feature.\u003cbr/\u003e    `accept_events`: List can be used to only allow specific events to be putted on the EventBridge. By default all events, empty list will be be interpreted as all events. | \u003cpre\u003eobject({\u003cbr/\u003e    enable        = optional(bool, true)\u003cbr/\u003e    accept_events = optional(list(string), null)\u003cbr/\u003e  })\u003c/pre\u003e | `{}` | no |\n| \u003ca name=\"input_ghes_ssl_verify\"\u003e\u003c/a\u003e [ghes\\_ssl\\_verify](#input\\_ghes\\_ssl\\_verify) | GitHub Enterprise SSL verification. Set to 'false' when custom certificate (chains) is used for GitHub Enterprise Server (insecure). | `bool` | `true` | no |\n| \u003ca name=\"input_ghes_url\"\u003e\u003c/a\u003e [ghes\\_url](#input\\_ghes\\_url) | GitHub Enterprise Server URL. Example: https://github.internal.co - DO NOT SET IF USING PUBLIC GITHUB | `string` | `null` | no |\n| \u003ca name=\"input_github_app\"\u003e\u003c/a\u003e [github\\_app](#input\\_github\\_app) | GitHub app parameters, see your github app. Ensure the key is the base64-encoded `.pem` file (the output of `base64 app.private-key.pem`, not the content of `private-key.pem`). | \u003cpre\u003eobject({\u003cbr/\u003e    key_base64     = string\u003cbr/\u003e    id             = string\u003cbr/\u003e    webhook_secret = string\u003cbr/\u003e  })\u003c/pre\u003e | n/a | yes |\n| \u003ca name=\"input_idle_config\"\u003e\u003c/a\u003e [idle\\_config](#input\\_idle\\_config) | List of time periods, defined as a cron expression, to keep a minimum amount of runners active instead of scaling down to 0. By defining this list you can ensure that in time periods that match the cron expression within 5 seconds a runner is kept idle. | \u003cpre\u003elist(object({\u003cbr/\u003e    cron             = string\u003cbr/\u003e    timeZone         = string\u003cbr/\u003e    idleCount        = number\u003cbr/\u003e    evictionStrategy = optional(string, \"oldest_first\")\u003cbr/\u003e  }))\u003c/pre\u003e | `[]` | no |\n| \u003ca name=\"input_instance_allocation_strategy\"\u003e\u003c/a\u003e [instance\\_allocation\\_strategy](#input\\_instance\\_allocation\\_strategy) | The allocation strategy for spot instances. AWS recommends using `price-capacity-optimized` however the AWS default is `lowest-price`. | `string` | `\"lowest-price\"` | no |\n| \u003ca name=\"input_instance_max_spot_price\"\u003e\u003c/a\u003e [instance\\_max\\_spot\\_price](#input\\_instance\\_max\\_spot\\_price) | Max price price for spot instances per hour. This variable will be passed to the create fleet as max spot price for the fleet. | `string` | `null` | no |\n| \u003ca name=\"input_instance_profile_path\"\u003e\u003c/a\u003e [instance\\_profile\\_path](#input\\_instance\\_profile\\_path) | The path that will be added to the instance\\_profile, if not set the environment name will be used. | `string` | `null` | no |\n| \u003ca name=\"input_instance_target_capacity_type\"\u003e\u003c/a\u003e [instance\\_target\\_capacity\\_type](#input\\_instance\\_target\\_capacity\\_type) | Default lifecycle used for runner instances, can be either `spot` or `on-demand`. | `string` | `\"spot\"` | no |\n| \u003ca name=\"input_instance_termination_watcher\"\u003e\u003c/a\u003e [instance\\_termination\\_watcher](#input\\_instance\\_termination\\_watcher) | Configuration for the instance termination watcher. This feature is Beta, changes will not trigger a major release as long in beta.\u003cbr/\u003e\u003cbr/\u003e`enable`: Enable or disable the spot termination watcher.\u003cbr/\u003e'features': Enable or disable features of the termination watcher.\u003cbr/\u003e`memory_size`: Memory size linit in MB of the lambda.\u003cbr/\u003e`s3_key`: S3 key for syncer lambda function. Required if using S3 bucket to specify lambdas.\u003cbr/\u003e`s3_object_version`: S3 object version for syncer lambda function. Useful if S3 versioning is enabled on source bucket.\u003cbr/\u003e`timeout`: Time out of the lambda in seconds.\u003cbr/\u003e`zip`: File location of the lambda zip file. | \u003cpre\u003eobject({\u003cbr/\u003e    enable = optional(bool, false)\u003cbr/\u003e    features = optional(object({\u003cbr/\u003e      enable_spot_termination_handler              = optional(bool, true)\u003cbr/\u003e      enable_spot_termination_notification_watcher = optional(bool, true)\u003cbr/\u003e    }), {})\u003cbr/\u003e    memory_size       = optional(number, null)\u003cbr/\u003e    s3_key            = optional(string, null)\u003cbr/\u003e    s3_object_version = optional(string, null)\u003cbr/\u003e    timeout           = optional(number, null)\u003cbr/\u003e    zip               = optional(string, null)\u003cbr/\u003e  })\u003c/pre\u003e | `{}` | no |\n| \u003ca name=\"input_instance_types\"\u003e\u003c/a\u003e [instance\\_types](#input\\_instance\\_types) | List of instance types for the action runner. Defaults are based on runner\\_os (al2023 for linux and Windows Server Core for win). | `list(string)` | \u003cpre\u003e[\u003cbr/\u003e  \"m5.large\",\u003cbr/\u003e  \"c5.large\"\u003cbr/\u003e]\u003c/pre\u003e | no |\n| \u003ca name=\"input_job_queue_retention_in_seconds\"\u003e\u003c/a\u003e [job\\_queue\\_retention\\_in\\_seconds](#input\\_job\\_queue\\_retention\\_in\\_seconds) | The number of seconds the job is held in the queue before it is purged. | `number` | `86400` | no |\n| \u003ca name=\"input_job_retry\"\u003e\u003c/a\u003e [job\\_retry](#input\\_job\\_retry) | Experimental! Can be removed / changed without trigger a major release.Configure job retries. The configuration enables job retries (for ephemeral runners). After creating the insances a message will be published to a job retry queue. The job retry check lambda is checking after a delay if the job is queued. If not the message will be published again on the scale-up (build queue). Using this feature can impact the reate limit of the GitHub app.\u003cbr/\u003e\u003cbr/\u003e`enable`: Enable or disable the job retry feature.\u003cbr/\u003e`delay_in_seconds`: The delay in seconds before the job retry check lambda will check the job status.\u003cbr/\u003e`delay_backoff`: The backoff factor for the delay.\u003cbr/\u003e`lambda_memory_size`: Memory size limit in MB for the job retry check lambda.\u003cbr/\u003e`lambda_timeout`: Time out of the job retry check lambda in seconds.\u003cbr/\u003e`max_attempts`: The maximum number of attempts to retry the job. | \u003cpre\u003eobject({\u003cbr/\u003e    enable             = optional(bool, false)\u003cbr/\u003e    delay_in_seconds   = optional(number, 300)\u003cbr/\u003e    delay_backoff      = optional(number, 2)\u003cbr/\u003e    lambda_memory_size = optional(number, 256)\u003cbr/\u003e    lambda_timeout     = optional(number, 30)\u003cbr/\u003e    max_attempts       = optional(number, 1)\u003cbr/\u003e  })\u003c/pre\u003e | `{}` | no |\n| \u003ca name=\"input_key_name\"\u003e\u003c/a\u003e [key\\_name](#input\\_key\\_name) | Key pair name | `string` | `null` | no |\n| \u003ca name=\"input_kms_key_arn\"\u003e\u003c/a\u003e [kms\\_key\\_arn](#input\\_kms\\_key\\_arn) | Optional CMK Key ARN to be used for Parameter Store. This key must be in the current account. | `string` | `null` | no |\n| \u003ca name=\"input_lambda_architecture\"\u003e\u003c/a\u003e [lambda\\_architecture](#input\\_lambda\\_architecture) | AWS Lambda architecture. Lambda functions using Graviton processors ('arm64') tend to have better price/performance than 'x86\\_64' functions. | `string` | `\"arm64\"` | no |\n| \u003ca name=\"input_lambda_principals\"\u003e\u003c/a\u003e [lambda\\_principals](#input\\_lambda\\_principals) | (Optional) add extra principals to the role created for execution of the lambda, e.g. for local testing. | \u003cpre\u003elist(object({\u003cbr/\u003e    type        = string\u003cbr/\u003e    identifiers = list(string)\u003cbr/\u003e  }))\u003c/pre\u003e | `[]` | no |\n| \u003ca name=\"input_lambda_runtime\"\u003e\u003c/a\u003e [lambda\\_runtime](#input\\_lambda\\_runtime) | AWS Lambda runtime. | `string` | `\"nodejs22.x\"` | no |\n| \u003ca name=\"input_lambda_s3_bucket\"\u003e\u003c/a\u003e [lambda\\_s3\\_bucket](#input\\_lambda\\_s3\\_bucket) | S3 bucket from which to specify lambda functions. This is an alternative to providing local files directly. | `string` | `null` | no |\n| \u003ca name=\"input_lambda_security_group_ids\"\u003e\u003c/a\u003e [lambda\\_security\\_group\\_ids](#input\\_lambda\\_security\\_group\\_ids) | List of security group IDs associated with the Lambda function. | `list(string)` | `[]` | no |\n| \u003ca name=\"input_lambda_subnet_ids\"\u003e\u003c/a\u003e [lambda\\_subnet\\_ids](#input\\_lambda\\_subnet\\_ids) | List of subnets in which the action runners will be launched, the subnets needs to be subnets in the `vpc_id`. | `list(string)` | `[]` | no |\n| \u003ca name=\"input_lambda_tags\"\u003e\u003c/a\u003e [lambda\\_tags](#input\\_lambda\\_tags) | Map of tags that will be added to all the lambda function resources. Note these are additional tags to the default tags. | `map(string)` | `{}` | no |\n| \u003ca name=\"input_log_level\"\u003e\u003c/a\u003e [log\\_level](#input\\_log\\_level) | Logging level for lambda logging. Valid values are  'silly', 'trace', 'debug', 'info', 'warn', 'error', 'fatal'. | `string` | `\"info\"` | no |\n| \u003ca name=\"input_logging_kms_key_id\"\u003e\u003c/a\u003e [logging\\_kms\\_key\\_id](#input\\_logging\\_kms\\_key\\_id) | Specifies the kms key id to encrypt the logs with. | `string` | `null` | no |\n| \u003ca name=\"input_logging_retention_in_days\"\u003e\u003c/a\u003e [logging\\_retention\\_in\\_days](#input\\_logging\\_retention\\_in\\_days) | Specifies the number of days you want to retain log events for the lambda log group. Possible values are: 0, 1, 3, 5, 7, 14, 30, 60, 90, 120, 150, 180, 365, 400, 545, 731, 1827, and 3653. | `number` | `180` | no |\n| \u003ca name=\"input_matcher_config_parameter_store_tier\"\u003e\u003c/a\u003e [matcher\\_config\\_parameter\\_store\\_tier](#input\\_matcher\\_config\\_parameter\\_store\\_tier) | The tier of the parameter store for the matcher configuration. Valid values are `Standard`, and `Advanced`. | `string` | `\"Standard\"` | no |\n| \u003ca name=\"input_metrics\"\u003e\u003c/a\u003e [metrics](#input\\_metrics) | Configuration for metrics created by the module, by default disabled to avoid additional costs. When metrics are enable all metrics are created unless explicit configured otherwise. | \u003cpre\u003eobject({\u003cbr/\u003e    enable    = optional(bool, false)\u003cbr/\u003e    namespace = optional(string, \"GitHub Runners\")\u003cbr/\u003e    metric = optional(object({\u003cbr/\u003e      enable_github_app_rate_limit    = optional(bool, true)\u003cbr/\u003e      enable_job_retry                = optional(bool, true)\u003cbr/\u003e      enable_spot_termination_warning = optional(bool, true)\u003cbr/\u003e    }), {})\u003cbr/\u003e  })\u003c/pre\u003e | `{}` | no |\n| \u003ca name=\"input_minimum_running_time_in_minutes\"\u003e\u003c/a\u003e [minimum\\_running\\_time\\_in\\_minutes](#input\\_minimum\\_running\\_time\\_in\\_minutes) | The time an ec2 action runner should be running at minimum before terminated, if not busy. | `number` | `null` | no |\n| \u003ca name=\"input_pool_config\"\u003e\u003c/a\u003e [pool\\_config](#input\\_pool\\_config) | The configuration for updating the pool. The `pool_size` to adjust to by the events triggered by the `schedule_expression`. For example you can configure a cron expression for weekdays to adjust the pool to 10 and another expression for the weekend to adjust the pool to 1. Use `schedule_expression_timezone` to override the schedule time zone (defaults to UTC). | \u003cpre\u003elist(object({\u003cbr/\u003e    schedule_expression          = string\u003cbr/\u003e    schedule_expression_timezone = optional(string)\u003cbr/\u003e    size                         = number\u003cbr/\u003e  }))\u003c/pre\u003e | `[]` | no |\n| \u003ca name=\"input_pool_lambda_memory_size\"\u003e\u003c/a\u003e [pool\\_lambda\\_memory\\_size](#input\\_pool\\_lambda\\_memory\\_size) | Memory size limit for scale-up lambda. | `number` | `512` | no |\n| \u003ca name=\"input_pool_lambda_reserved_concurrent_executions\"\u003e\u003c/a\u003e [pool\\_lambda\\_reserved\\_concurrent\\_executions](#input\\_pool\\_lambda\\_reserved\\_concurrent\\_executions) | Amount of reserved concurrent executions for the scale-up lambda function. A value of 0 disables lambda from being triggered and -1 removes any concurrency limitations. | `number` | `1` | no |\n| \u003ca name=\"input_pool_lambda_timeout\"\u003e\u003c/a\u003e [pool\\_lambda\\_timeout](#input\\_pool\\_lambda\\_timeout) | Time out for the pool lambda in seconds. | `number` | `60` | no |\n| \u003ca name=\"input_pool_runner_owner\"\u003e\u003c/a\u003e [pool\\_runner\\_owner](#input\\_pool\\_runner\\_owner) | The pool will deploy runners to the GitHub org ID, set this value to the org to which you want the runners deployed. Repo level is not supported. | `string` | `null` | no |\n| \u003ca name=\"input_prefix\"\u003e\u003c/a\u003e [prefix](#input\\_prefix) | The prefix used for naming resources | `string` | `\"github-actions\"` | no |\n| \u003ca name=\"input_queue_encryption\"\u003e\u003c/a\u003e [queue\\_encryption](#input\\_queue\\_encryption) | Configure how data on queues managed by the modules in ecrypted at REST. Options are encryped via SSE, non encrypted and via KMSS. By default encryptes via SSE is enabled. See for more details the Terraform `aws_sqs_queue` resource https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/sqs_queue. | \u003cpre\u003eobject({\u003cbr/\u003e    kms_data_key_reuse_period_seconds = number\u003cbr/\u003e    kms_master_key_id                 = string\u003cbr/\u003e    sqs_managed_sse_enabled           = bool\u003cbr/\u003e  })\u003c/pre\u003e | \u003cpre\u003e{\u003cbr/\u003e  \"kms_data_key_reuse_period_seconds\": null,\u003cbr/\u003e  \"kms_master_key_id\": null,\u003cbr/\u003e  \"sqs_managed_sse_enabled\": true\u003cbr/\u003e}\u003c/pre\u003e | no |\n| \u003ca name=\"input_redrive_build_queue\"\u003e\u003c/a\u003e [redrive\\_build\\_queue](#input\\_redrive\\_build\\_queue) | Set options to attach (optional) a dead letter queue to the build queue, the queue between the webhook and the scale up lambda. You have the following options. 1. Disable by setting `enabled` to false. 2. Enable by setting `enabled` to `true`, `maxReceiveCount` to a number of max retries. | \u003cpre\u003eobject({\u003cbr/\u003e    enabled         = bool\u003cbr/\u003e    maxReceiveCount = number\u003cbr/\u003e  })\u003c/pre\u003e | \u003cpre\u003e{\u003cbr/\u003e  \"enabled\": false,\u003cbr/\u003e  \"maxReceiveCount\": null\u003cbr/\u003e}\u003c/pre\u003e | no |\n| \u003ca name=\"input_repository_white_list\"\u003e\u003c/a\u003e [repository\\_white\\_list](#input\\_repository\\_white\\_list) | List of github repository full names (owner/repo\\_name) that will be allowed to use the github app. Leave empty for no filtering. | `list(string)` | `[]` | no |\n| \u003ca name=\"input_role_path\"\u003e\u003c/a\u003e [role\\_path](#input\\_role\\_path) | The path that will be added to role path for created roles, if not set the environment name will be used. | `string` | `null` | no |\n| \u003ca name=\"input_role_permissions_boundary\"\u003e\u003c/a\u003e [role\\_permissions\\_boundary](#input\\_role\\_permissions\\_boundary) | Permissions boundary that will be added to the created roles. | `string` | `null` | no |\n| \u003ca name=\"input_runner_additional_security_group_ids\"\u003e\u003c/a\u003e [runner\\_additional\\_security\\_group\\_ids](#input\\_runner\\_additional\\_security\\_group\\_ids) | (optional) List of additional security groups IDs to apply to the runner. | `list(string)` | `[]` | no |\n| \u003ca name=\"input_runner_architecture\"\u003e\u003c/a\u003e [runner\\_architecture](#input\\_runner\\_architecture) | The platform architecture of the runner instance\\_type. | `string` | `\"x64\"` | no |\n| \u003ca name=\"input_runner_as_root\"\u003e\u003c/a\u003e [runner\\_as\\_root](#input\\_runner\\_as\\_root) | Run the action runner under the root user. Variable `runner_run_as` will be ignored. | `bool` | `false` | no |\n| \u003ca name=\"input_runner_binaries_s3_logging_bucket\"\u003e\u003c/a\u003e [runner\\_binaries\\_s3\\_logging\\_bucket](#input\\_runner\\_binaries\\_s3\\_logging\\_bucket) | Bucket for action runner distribution bucket access logging. | `string` | `null` | no |\n| \u003ca name=\"input_runner_binaries_s3_logging_bucket_prefix\"\u003e\u003c/a\u003e [runner\\_binaries\\_s3\\_logging\\_bucket\\_prefix](#input\\_runner\\_binaries\\_s3\\_logging\\_bucket\\_prefix) | Bucket prefix for action runner distribution bucket access logging. | `string` | `null` | no |\n| \u003ca name=\"input_runner_binaries_s3_sse_configuration\"\u003e\u003c/a\u003e [runner\\_binaries\\_s3\\_sse\\_configuration](#input\\_runner\\_binaries\\_s3\\_sse\\_configuration) | Map containing server-side encryption configuration for runner-binaries S3 bucket. | `any` | \u003cpre\u003e{\u003cbr/\u003e  \"rule\": {\u003cbr/\u003e    \"apply_server_side_encryption_by_default\": {\u003cbr/\u003e      \"sse_algorithm\": \"AES256\"\u003cbr/\u003e    }\u003cbr/\u003e  }\u003cbr/\u003e}\u003c/pre\u003e | no |\n| \u003ca name=\"input_runner_binaries_s3_versioning\"\u003e\u003c/a\u003e [runner\\_binaries\\_s3\\_versioning](#input\\_runner\\_binaries\\_s3\\_versioning) | Status of S3 versioning for runner-binaries S3 bucket. Once set to Enabled the change cannot be reverted via Terraform! | `string` | `\"Disabled\"` | no |\n| \u003ca name=\"input_runner_binaries_syncer_lambda_memory_size\"\u003e\u003c/a\u003e [runner\\_binaries\\_syncer\\_lambda\\_memory\\_size](#input\\_runner\\_binaries\\_syncer\\_lambda\\_memory\\_size) | Memory size limit in MB for binary syncer lambda. | `number` | `256` | no |\n| \u003ca name=\"input_runner_binaries_syncer_lambda_timeout\"\u003e\u003c/a\u003e [runner\\_binaries\\_syncer\\_lambda\\_timeout](#input\\_runner\\_binaries\\_syncer\\_lambda\\_timeout) | Time out of the binaries sync lambda in seconds. | `number` | `300` | no |\n| \u003ca name=\"input_runner_binaries_syncer_lambda_zip\"\u003e\u003c/a\u003e [runner\\_binaries\\_syncer\\_lambda\\_zip](#input\\_runner\\_binaries\\_syncer\\_lambda\\_zip) | File location of the binaries sync lambda zip file. | `string` | `null` | no |\n| \u003ca name=\"input_runner_boot_time_in_minutes\"\u003e\u003c/a\u003e [runner\\_boot\\_time\\_in\\_minutes](#input\\_runner\\_boot\\_time\\_in\\_minutes) | The minimum time for an EC2 runner to boot and register as a runner. | `number` | `5` | no |\n| \u003ca name=\"input_runner_credit_specification\"\u003e\u003c/a\u003e [runner\\_credit\\_specification](#input\\_runner\\_credit\\_specification) | The credit option for CPU usage of a T instance. Can be unset, \"standard\" or \"unlimited\". | `string` | `null` | no |\n| \u003ca name=\"input_runner_disable_default_labels\"\u003e\u003c/a\u003e [runner\\_disable\\_default\\_labels](#input\\_runner\\_disable\\_default\\_labels) | Disable default labels for the runners (os, architecture and `self-hosted`). If enabled, the runner will only have the extra labels provided in `runner_extra_labels`. In case you on own start script is used, this configuration parameter needs to be parsed via SSM. | `bool` | `false` | no |\n| \u003ca name=\"input_runner_ec2_tags\"\u003e\u003c/a\u003e [runner\\_ec2\\_tags](#input\\_runner\\_ec2\\_tags) | Map of tags that will be added to the launch template instance tag specifications. | `map(string)` | `{}` | no |\n| \u003ca name=\"input_runner_egress_rules\"\u003e\u003c/a\u003e [runner\\_egress\\_rules](#input\\_runner\\_egress\\_rules) | List of egress rules for the GitHub runner instances. | \u003cpre\u003elist(object({\u003cbr/\u003e    cidr_blocks      = list(string)\u003cbr/\u003e    ipv6_cidr_blocks = list(string)\u003cbr/\u003e    prefix_list_ids  = list(string)\u003cbr/\u003e    from_port        = number\u003cbr/\u003e    protocol         = string\u003cbr/\u003e    security_groups  = list(string)\u003cbr/\u003e    self             = bool\u003cbr/\u003e    to_port          = number\u003cbr/\u003e    description      = string\u003cbr/\u003e  }))\u003c/pre\u003e | \u003cpre\u003e[\u003cbr/\u003e  {\u003cbr/\u003e    \"cidr_blocks\": [\u003cbr/\u003e      \"0.0.0.0/0\"\u003cbr/\u003e    ],\u003cbr/\u003e    \"description\": null,\u003cbr/\u003e    \"from_port\": 0,\u003cbr/\u003e    \"ipv6_cidr_blocks\": [\u003cbr/\u003e      \"::/0\"\u003cbr/\u003e    ],\u003cbr/\u003e    \"prefix_list_ids\": null,\u003cbr/\u003e    \"protocol\": \"-1\",\u003cbr/\u003e    \"security_groups\": null,\u003cbr/\u003e    \"self\": null,\u003cbr/\u003e    \"to_port\": 0\u003cbr/\u003e  }\u003cbr/\u003e]\u003c/pre\u003e | no |\n| \u003ca name=\"input_runner_extra_labels\"\u003e\u003c/a\u003e [runner\\_extra\\_labels](#input\\_runner\\_extra\\_labels) | Extra (custom) labels for the runners (GitHub). Separate each label by a comma. Labels checks on the webhook can be enforced by setting `enable_workflow_job_labels_check`. GitHub read-only labels should not be provided. | `list(string)` | `[]` | no |\n| \u003ca name=\"input_runner_group_name\"\u003e\u003c/a\u003e [runner\\_group\\_name](#input\\_runner\\_group\\_name) | Name of the runner group. | `string` | `\"Default\"` | no |\n| \u003ca name=\"input_runner_hook_job_completed\"\u003e\u003c/a\u003e [runner\\_hook\\_job\\_completed](#input\\_runner\\_hook\\_job\\_completed) | Script to be ran in the runner environment at the end of every job | `string` | `\"\"` | no |\n| \u003ca name=\"input_runner_hook_job_started\"\u003e\u003c/a\u003e [runner\\_hook\\_job\\_started](#input\\_runner\\_hook\\_job\\_started) | Script to be ran in the runner environment at the beginning of every job | `string` | `\"\"` | no |\n| \u003ca name=\"input_runner_iam_role_managed_policy_arns\"\u003e\u003c/a\u003e [runner\\_iam\\_role\\_managed\\_policy\\_arns](#input\\_runner\\_iam\\_role\\_managed\\_policy\\_arns) | Attach AWS or customer-managed IAM policies (by ARN) to the runner IAM role | `list(string)` | `[]` | no |\n| \u003ca name=\"input_runner_log_files\"\u003e\u003c/a\u003e [runner\\_log\\_files](#input\\_runner\\_log\\_files) | (optional) Replaces the module default cloudwatch log config. See https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch-Agent-Configuration-File-Details.html for details. | \u003cpre\u003elist(object({\u003cbr/\u003e    log_group_name   = string\u003cbr/\u003e    prefix_log_group = bool\u003cbr/\u003e    file_path        = string\u003cbr/\u003e    log_stream_name  = string\u003cbr/\u003e  }))\u003c/pre\u003e | `null` | no |\n| \u003ca name=\"input_runner_metadata_options\"\u003e\u003c/a\u003e [runner\\_metadata\\_options](#input\\_runner\\_metadata\\_options) | Metadata options for the ec2 runner instances. By default, the module uses metadata tags for bootstrapping the runner, only disable `instance_metadata_tags` when using custom scripts for starting the runner. | `map(any)` | \u003cpre\u003e{\u003cbr/\u003e  \"http_endpoint\": \"enabled\",\u003cbr/\u003e  \"http_put_response_hop_limit\": 1,\u003cbr/\u003e  \"http_tokens\": \"required\",\u003cbr/\u003e  \"instance_metadata_tags\": \"enabled\"\u003cbr/\u003e}\u003c/pre\u003e | no |\n| \u003ca name=\"input_runner_name_prefix\"\u003e\u003c/a\u003e [runner\\_name\\_prefix](#input\\_runner\\_name\\_prefix) | The prefix used for the GitHub runner name. The prefix will be used in the default start script to prefix the instance name when register the runner in GitHub. The value is availabe via an EC2 tag 'ghr:runner\\_name\\_prefix'. | `string` | `\"\"` | no |\n| \u003ca name=\"input_runner_os\"\u003e\u003c/a\u003e [runner\\_os](#input\\_runner\\_os) | The EC2 Operating System type to use for action runner instances (linux,windows). | `string` | `\"linux\"` | no |\n| \u003ca name=\"input_runner_run_as\"\u003e\u003c/a\u003e [runner\\_run\\_as](#input\\_runner\\_run\\_as) | Run the GitHub actions agent as user. | `string` | `\"ec2-user\"` | no |\n| \u003ca name=\"input_runners_ebs_optimized\"\u003e\u003c/a\u003e [runners\\_ebs\\_optimized](#input\\_runners\\_ebs\\_optimized) | Enable EBS optimization for the runner instances. | `bool` | `false` | no |\n| \u003ca name=\"input_runners_lambda_s3_key\"\u003e\u003c/a\u003e [runners\\_lambda\\_s3\\_key](#input\\_runners\\_lambda\\_s3\\_key) | S3 key for runners lambda function. Required if using S3 bucket to specify lambdas. | `string` | `null` | no |\n| \u003ca name=\"input_runners_lambda_s3_object_version\"\u003e\u003c/a\u003e [runners\\_lambda\\_s3\\_object\\_version](#input\\_runners\\_lambda\\_s3\\_object\\_version) | S3 object version for runners lambda function. Useful if S3 versioning is enabled on source bucket. | `string` | `null` | no |\n| \u003ca name=\"input_runners_lambda_zip\"\u003e\u003c/a\u003e [runners\\_lambda\\_zip](#input\\_runners\\_lambda\\_zip) | File location of the lambda zip file for scaling runners. | `string` | `null` | no |\n| \u003ca name=\"input_runners_maximum_count\"\u003e\u003c/a\u003e [runners\\_maximum\\_count](#input\\_runners\\_maximum\\_count) | The maximum number of runners that will be created. | `number` | `3` | no |\n| \u003ca name=\"input_runners_scale_down_lambda_memory_size\"\u003e\u003c/a\u003e [runners\\_scale\\_down\\_lambda\\_memory\\_size](#input\\_runners\\_scale\\_down\\_lambda\\_memory\\_size) | Memory size limit in MB for scale-down lambda. | `number` | `512` | no |\n| \u003ca name=\"input_runners_scale_down_lambda_timeout\"\u003e\u003c/a\u003e [runners\\_scale\\_down\\_lambda\\_timeout](#input\\_runners\\_scale\\_down\\_lambda\\_timeout) | Time out for the scale down lambda in seconds. | `number` | `60` | no |\n| \u003ca name=\"input_runners_scale_up_lambda_memory_size\"\u003e\u003c/a\u003e [runners\\_scale\\_up\\_lambda\\_memory\\_size](#input\\_runners\\_scale\\_up\\_lambda\\_memory\\_size) | Memory size limit in MB for scale-up lambda. | `number` | `512` | no |\n| \u003ca name=\"input_runners_scale_up_lambda_timeout\"\u003e\u003c/a\u003e [runners\\_scale\\_up\\_lambda\\_timeout](#input\\_runners\\_scale\\_up\\_lambda\\_timeout) | Time out for the scale up lambda in seconds. | `number` | `30` | no |\n| \u003ca name=\"input_runners_ssm_housekeeper\"\u003e\u003c/a\u003e [runners\\_ssm\\_housekeeper](#input\\_runners\\_ssm\\_housekeeper) | Configuration for the SSM housekeeper lambda. This lambda deletes token / JIT config from SSM.\u003cbr/\u003e\u003cbr/\u003e  `schedule_expression`: is used to configure the schedule for the lambda.\u003cbr/\u003e  `enabled`: enable or disable the lambda trigger via the EventBridge.\u003cbr/\u003e  `lambda_memory_size`: lambda memery size limit.\u003cbr/\u003e  `lambda_timeout`: timeout for the lambda in seconds.\u003cbr/\u003e  `config`: configuration for the lambda function. Token path will be read by default from the module. | \u003cpre\u003eobject({\u003cbr/\u003e    schedule_expression = optional(string, \"rate(1 day)\")\u003cbr/\u003e    enabled             = optional(bool, true)\u003cbr/\u003e    lambda_memory_size  = optional(number, 512)\u003cbr/\u003e    lambda_timeout      = optional(number, 60)\u003cbr/\u003e    config = object({\u003cbr/\u003e      tokenPath      = optional(string)\u003cbr/\u003e      minimumDaysOld = optional(number, 1)\u003cbr/\u003e      dryRun         = optional(bool, false)\u003cbr/\u003e    })\u003cbr/\u003e  })\u003c/pre\u003e | \u003cpre\u003e{\u003cbr/\u003e  \"config\": {}\u003cbr/\u003e}\u003c/pre\u003e | no |\n| \u003ca name=\"input_scale_down_schedule_expression\"\u003e\u003c/a\u003e [scale\\_down\\_schedule\\_expression](#input\\_scale\\_down\\_schedule\\_expression) | Scheduler expression to check every x for scale down. | `string` | `\"cron(*/5 * * * ? *)\"` | no |\n| \u003ca name=\"input_scale_up_reserved_concurrent_executions\"\u003e\u003c/a\u003e [scale\\_up\\_reserved\\_concurrent\\_executions](#input\\_scale\\_up\\_reserved\\_concurrent\\_executions) | Amount of reserved concurrent executions for the scale-up lambda function. A value of 0 disables lambda from being triggered and -1 removes any concurrency limitations. | `number` | `1` | no |\n| \u003ca name=\"input_ssm_paths\"\u003e\u003c/a\u003e [ssm\\_paths](#input\\_ssm\\_paths) | The root path used in SSM to store configuration and secrets. | \u003cpre\u003eobject({\u003cbr/\u003e    root       = optional(string, \"github-action-runners\")\u003cbr/\u003e    app        = optional(string, \"app\")\u003cbr/\u003e    runners    = optional(string, \"runners\")\u003cbr/\u003e    webhook    = optional(string, \"webhook\")\u003cbr/\u003e    use_prefix = optional(bool, true)\u003cbr/\u003e  })\u003c/pre\u003e | `{}` | no |\n| \u003ca name=\"input_state_event_rule_binaries_syncer\"\u003e\u003c/a\u003e [state\\_event\\_rule\\_binaries\\_syncer](#input\\_state\\_event\\_rule\\_binaries\\_syncer) | Option to disable EventBridge Lambda trigger for the binary syncer, useful to stop automatic updates of binary distribution | `string` | `\"ENABLED\"` | no |\n| \u003ca name=\"input_subnet_ids\"\u003e\u003c/a\u003e [subnet\\_ids](#input\\_subnet\\_ids) | List of subnets in which the action runner instances will be launched. The subnets need to exist in the configured VPC (`vpc_id`), and must reside in different availability zones (see https://github.com/philips-labs/terraform-aws-github-runner/issues/2904) | `list(string)` | n/a | yes |\n| \u003ca name=\"input_syncer_lambda_s3_key\"\u003e\u003c/a\u003e [syncer\\_lambda\\_s3\\_key](#input\\_syncer\\_lambda\\_s3\\_key) | S3 key for syncer lambda function. Required if using an S3 bucket to specify lambdas. | `string` | `null` | no |\n| \u003ca name=\"input_syncer_lambda_s3_object_version\"\u003e\u003c/a\u003e [syncer\\_lambda\\_s3\\_object\\_version](#input\\_syncer\\_lambda\\_s3\\_object\\_version) | S3 object version for syncer lambda function. Useful if S3 versioning is enabled on source bucket. | `string` | `null` | no |\n| \u003ca name=\"input_tags\"\u003e\u003c/a\u003e [tags](#input\\_tags) | Map of tags that will be added to created resources. By default resources will be tagged with name and environment. | `map(string)` | `{}` | no |\n| \u003ca name=\"input_tracing_config\"\u003e\u003c/a\u003e [tracing\\_config](#input\\_tracing\\_config) | Configuration for lambda tracing. | \u003cpre\u003eobject({\u003cbr/\u003e    mode                  = optional(string, null)\u003cbr/\u003e    capture_http_requests = optional(bool, false)\u003cbr/\u003e    capture_error         = optional(bool, false)\u003cbr/\u003e  })\u003c/pre\u003e | `{}` | no |\n| \u003ca name=\"input_userdata_content\"\u003e\u003c/a\u003e [userdata\\_content](#input\\_userdata\\_content) | Alternative user-data content, replacing the templated one. By providing your own user\\_data you have to take care of installing all required software, including the action runner and registering the runner.  Be-aware configuration paramaters in SSM as well as tags are treated as internals. Changes will not trigger a breaking release. | `string` | `null` | no |\n| \u003ca name=\"input_userdata_post_install\"\u003e\u003c/a\u003e [userdata\\_post\\_install](#input\\_userdata\\_post\\_install) | Script to be ran after the GitHub Actions runner is installed on the EC2 instances | `string` | `\"\"` | no |\n| \u003ca name=\"input_userdata_pre_install\"\u003e\u003c/a\u003e [userdata\\_pre\\_install](#input\\_userdata\\_pre\\_install) | Script to be ran before the GitHub Actions runner is installed on the EC2 instances | `string` | `\"\"` | no |\n| \u003ca name=\"input_userdata_template\"\u003e\u003c/a\u003e [userdata\\_template](#input\\_userdata\\_template) | Alternative user-data template file path, replacing the default template. By providing your own user\\_data you have to take care of installing all required software, including the action runner. Variables userdata\\_pre/post\\_install are ignored. | `string` | `null` | no |\n| \u003ca name=\"input_vpc_id\"\u003e\u003c/a\u003e [vpc\\_id](#input\\_vpc\\_id) | The VPC for security groups of the action runners. | `string` | n/a | yes |\n| \u003ca name=\"input_webhook_lambda_apigateway_access_log_settings\"\u003e\u003c/a\u003e [webhook\\_lambda\\_apigateway\\_access\\_log\\_settings](#input\\_webhook\\_lambda\\_apigateway\\_access\\_log\\_settings) | Access log settings for webhook API gateway. | \u003cpre\u003eobject({\u003cbr/\u003e    destination_arn = string\u003cbr/\u003e    format          = string\u003cbr/\u003e  })\u003c/pre\u003e | `null` | no |\n| \u003ca name=\"input_webhook_lambda_memory_size\"\u003e\u003c/a\u003e [webhook\\_lambda\\_memory\\_size](#input\\_webhook\\_lambda\\_memory\\_size) | Memory size limit in MB for webhook lambda in. | `number` | `256` | no |\n| \u003ca name=\"input_webhook_lambda_s3_key\"\u003e\u003c/a\u003e [webhook\\_lambda\\_s3\\_key](#input\\_webhook\\_lambda\\_s3\\_key) | S3 key for webhook lambda function. Required if using S3 bucket to specify lambdas. | `string` | `null` | no |\n| \u003ca name=\"input_webhook_lambda_s3_object_version\"\u003e\u003c/a\u003e [webhook\\_lambda\\_s3\\_object\\_version](#input\\_webhook\\_lambda\\_s3\\_object\\_version) | S3 object version for webhook lambda function. Useful if S3 versioning is enabled on source bucket. | `string` | `null` | no |\n| \u003ca name=\"input_webhook_lambda_timeout\"\u003e\u003c/a\u003e [webhook\\_lambda\\_timeout](#input\\_webhook\\_lambda\\_timeout) | Time out of the webhook lambda in seconds. | `number` | `10` | no |\n| \u003ca name=\"input_webhook_lambda_zip\"\u003e\u003c/a\u003e [webhook\\_lambda\\_zip](#input\\_webhook\\_lambda\\_zip) | File location of the webhook lambda zip file. | `string` | `null` | no |\n\n## Outputs\n\n| Name | Description |\n|------|-------------|\n| \u003ca name=\"output_binaries_syncer\"\u003e\u003c/a\u003e [binaries\\_syncer](#output\\_binaries\\_syncer) | n/a |\n| \u003ca name=\"output_instance_termination_handler\"\u003e\u003c/a\u003e [instance\\_termination\\_handler](#output\\_instance\\_termination\\_handler) | n/a |\n| \u003ca name=\"output_instance_termination_watcher\"\u003e\u003c/a\u003e [instance\\_termination\\_watcher](#output\\_instance\\_termination\\_watcher) | n/a |\n| \u003ca name=\"output_queues\"\u003e\u003c/a\u003e [queues](#output\\_queues) | SQS queues. |\n| \u003ca name=\"output_runners\"\u003e\u003c/a\u003e [runners](#output\\_runners) | n/a |\n| \u003ca name=\"output_ssm_parameters\"\u003e\u003c/a\u003e [ssm\\_parameters](#output\\_ssm\\_parameters) | n/a |\n| \u003ca name=\"output_webhook\"\u003e\u003c/a\u003e [webhook](#output\\_webhook) | n/a |\n\u003c!-- END_TF_DOCS --\u003e\n\u003c!-- --8\u003c-- [end:mkdocsrunners] --\u003e\n\n\u003c/details\u003e\n","funding_links":[],"categories":["HCL","The matrix (might be better readable on [GitHub pages](https://jonico.github.io/awesome-runners/))","aws"],"sub_categories":["A word about self-hosted action runner images / virtual environments and how to test locally"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphilips-labs%2Fterraform-aws-github-runner","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fphilips-labs%2Fterraform-aws-github-runner","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fphilips-labs%2Fterraform-aws-github-runner/lists"}