{"id":21658034,"url":"https://github.com/cloudandthings/terraform-aws-github-runners-ec2","last_synced_at":"2026-05-10T15:33:40.939Z","repository":{"id":264151359,"uuid":"892514422","full_name":"cloudandthings/terraform-aws-github-runners-ec2","owner":"cloudandthings","description":null,"archived":false,"fork":false,"pushed_at":"2024-11-22T09:15:34.000Z","size":359,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-01-25T07:07:50.430Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"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/cloudandthings.png","metadata":{"files":{"readme":"README.md","changelog":"CHANGELOG.md","contributing":".github/CONTRIBUTING.md","funding":null,"license":"LICENSE.md","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2024-11-22T09:00:48.000Z","updated_at":"2024-11-22T09:15:23.000Z","dependencies_parsed_at":"2024-11-22T10:31:53.763Z","dependency_job_id":null,"html_url":"https://github.com/cloudandthings/terraform-aws-github-runners-ec2","commit_stats":null,"previous_names":["cloudandthings/terraform-aws-github-runners-ec2"],"tags_count":11,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudandthings%2Fterraform-aws-github-runners-ec2","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudandthings%2Fterraform-aws-github-runners-ec2/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudandthings%2Fterraform-aws-github-runners-ec2/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/cloudandthings%2Fterraform-aws-github-runners-ec2/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/cloudandthings","download_url":"https://codeload.github.com/cloudandthings/terraform-aws-github-runners-ec2/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":244555572,"owners_count":20471454,"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":[],"created_at":"2024-11-25T09:28:34.400Z","updated_at":"2026-05-10T15:33:35.890Z","avatar_url":"https://github.com/cloudandthings.png","language":"HCL","funding_links":[],"categories":[],"sub_categories":[],"readme":"# [DEPRECATION NOTICE]\n\nThis repo is deprecated in favor of [terraform-aws-github-runners](https://github.com/cloudandthings/terraform-aws-github-runners).\n\nThe new repo uses AWS CodeBuild to create ephemeral runners on-demand.\n\nNew projects should start with the new repo, and we recommend that existing projects migrate to the new repo wherever possible.\n\n# terraform-aws-github-runners-ec2\n\nSimple to use, self-hosted GitHub Action runners. Uses EC2 spot instances with configurable AutoScaling.\n\n[![GitHub repo link](https://github.com/cloudandthings/terraform-aws-github-runners-ec2/blob/main/docs/images/icon.gif )](https://github.com/cloudandthings/terraform-aws-github-runners-ec2)\n\n---\n\n[![Maintenance](https://img.shields.io/badge/Maintained-yes-green.svg)](https://github.com/cloudandthings/terraform-aws-github-runners-ec2/graphs/commit-activity)\n[![Test Status](https://github.com/cloudandthings/terraform-aws-github-runners-ec2/actions/workflows/main.yml/badge.svg)](https://github.com/cloudandthings/terraform-aws-github-runners-ec2/actions/workflows/main.yml)\n![Terraform Version](https://img.shields.io/badge/tf-%3E%3D0.13.0-blue)\n[![pre-commit](https://img.shields.io/badge/pre--commit-enabled-brightgreen?logo=pre-commit\u0026logoColor=white)](https://github.com/pre-commit/pre-commit)\n\n## Features\n\n- Simple! See the provided examples for a quick-start.\n- Cost-effective. Uses EC2 Spot pricing and AutoScaling to keep costs low. Runs multiple runners per EC2 instance depending on the number of vCPU available.\n- Customisable using [cloudinit](https://cloudinit.readthedocs.io/).\n- Scalable. By default one runner process and 20GB storage is provided per vCPU per EC2 instance.\n\n## Why?\n\nDeploying a self-hosted github runner should be simple.\nIt shouldn't need a long setup process or a lot of infrastructure.\n\nThis module additionally does not require public inbound traffic, and can be easily customised if needed.\n\n### Known limitations\n\n1. Needs a VPC.\n\nCurrently this module requires a VPC and Subnets for deployment. In future a non-VPC deployment could perhaps be added.\n\n2. Changes may affect the shared EC2 environment.\n\nParallel runners are ephemeral and their work environment is destroyed after each job is done.\nHowever, they still run on the same underlying EC2 instance.\nThis means they can make changes which impact each other, for example if the EBS storage gets full.\n\nA possible workaround could be to [run jobs in a container](https://docs.github.com/en/actions/using-jobs/running-jobs-in-a-container).\n\n## How it works\n\n[![Infrastructure diagram](https://github.com/cloudandthings/terraform-aws-github-runners-ec2/blob/main/docs/images/runner.svg)](https://github.com/cloudandthings/terraform-aws-github-runners-ec2/blob/main/docs/images/runner.svg)\n\nAn AutoScaling group is created to spin up Spot EC2 instances on a schedule. The instances retrieve a pre-configured GitHub access token from AWS SSM Parameter Store, and start one (or more) ephemeral actions runner processes. These authenticate with GitHub and wait for work.\n\nSteps execute arbitrary commands, defined by your repo workflows.\n\nFor example:\n - Perform a linting check.\n - Connect to another AWS Account using an IAM credential and operate on some EC2 or RDS infrastructure.\n - Anything else...\n\n\nA full list of created resources is shown below.\n\n## How to use it\n\n### 1. Store your GitHub token\nCreate a [GitHub personal access token](https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token).\nAdd it to AWS Systems Manager Parameter Store with the `SecureString` type.\n\n[![Parameter Store configuration](https://github.com/cloudandthings/terraform-aws-github-runners-ec2/blob/main/docs/images/ssm.png)](https://github.com/cloudandthings/terraform-aws-github-runners-ec2/blob/main/docs/images/ssm.png )\n\n\n### 2. Configure module\nConfigure and deploy the module using Terraform. See examples below.\n\n## More info\n\n- Found an issue? Want to help? [Contribute](https://github.com/cloudandthings/terraform-aws-github-runners-ec2/.github/contribute.md).\n- Review a [cost estimate](https://github.com/cloudandthings/terraform-aws-github-runners-ec2/blob/main/docs/cost_estimate.md).\n\n\u003c!-- BEGIN_TF_DOCS --\u003e\n## Module Docs\n\n### Basic Example\n```hcl\nmodule \"github_runner\" {\n  source = \"../../\"\n\n  # Required parameters\n  ############################\n  region     = \"af-south-1\"\n  github_url = \"https://github.com/my-org\"\n\n  # Naming for all created resources\n  naming_prefix = \"test-github-runner\"\n\n  ssm_parameter_name = \"/github/runner/token\"\n\n  # 2 cores, so 2 ephemeral runners will start in parallel.\n  ec2_instance_type = \"t3.micro\"\n\n  vpc_id     = \"vpc-0ffaabbcc1122\"\n  subnet_ids = [\"subnet-0123\", \"subnet-0456\"]\n}\n```\n### Advanced Example\n```hcl\nlocals {\n  naming_prefix = \"test-github-runner\"\n  vpc_id        = \"vpc-0ffaabbcc1122\"\n}\n\n# Create a custom security-group to allow SSH to all EC2 instances\nresource \"aws_security_group\" \"this\" {\n  name        = \"${local.naming_prefix}-sg\"\n  description = \"GitHub runner ${local.naming_prefix}-sg\"\n\n  # tfsec:ignore:aws-ec2-no-public-egress-sgr\n  egress {\n    description = \"egress\"\n    from_port   = 0\n    to_port     = 0\n    protocol    = \"-1\"\n    cidr_blocks = [\"0.0.0.0/0\"]\n  }\n\n  vpc_id = local.vpc_id\n  #checkov:skip=CKV2_AWS_5:The SG is attached by the module.\n}\n\ndata \"http\" \"myip\" {\n  url = \"http://ipv4.icanhazip.com\"\n}\n\nresource \"aws_security_group_rule\" \"ssh_ingress\" {\n  description       = \"Allow SSH ingress to EC2 instance\"\n  type              = \"ingress\"\n  from_port         = 22\n  to_port           = 22\n  protocol          = \"tcp\"\n  cidr_blocks       = [\"${chomp(data.http.myip.body)}/32\"]\n  security_group_id = aws_security_group.this.id\n}\n\nmodule \"github_runner\" {\n  source = \"../../\"\n\n  # Required parameters\n  ############################\n  region     = \"af-south-1\"\n  github_url = \"https://github.com/my-org\"\n\n  naming_prefix = local.naming_prefix\n\n  ssm_parameter_name = \"/github/runner/token\"\n\n  ec2_instance_type = \"t3.micro\"\n\n  vpc_id     = local.vpc_id\n  subnet_ids = [\"subnet-0123\", \"subnet-0456\"]\n\n  # Optional parameters\n  ################################\n\n  # If for some reason you dont want to install everything.\n  software_packs = [\n    \"BASE_PACKAGES\", # Extra utility packages like curl, zip, etc\n    \"docker-engine\",\n    \"node\",\n    \"python2\" # Required for cloudwatch logging\n  ]\n\n  ec2_associate_public_ip_address = true\n  ec2_key_pair_name               = \"my_key_pair\"\n  security_groups                 = [aws_security_group.this.id]\n\n  autoscaling_max_instance_lifetime = 86400\n  autoscaling_min_size              = 2\n  autoscaling_desired_size          = 2\n  autoscaling_max_size              = 5\n\n  autoscaling_schedule_time_zone = \"Africa/Johannesburg\"\n  # Scale up to desired capacity during work hours\n  autoscaling_schedule_on_recurrences = [\"0 07 * * MON-FRI\"]\n  # Scale down to zero after hours\n  autoscaling_schedule_off_recurrences = [\"0 18 * * *\"]\n\n  cloud_init_extra_packages = [\"neofetch\"]\n  cloud_init_extra_runcmds = [\n    \"echo \\\"hello world\\\" \u003e ~/test_file\"\n  ]\n\n  cloudwatch_log_group = \"/some/log/group\"\n}\n```\n### Software packs\n```hcl\nlocals {\n  # All available software packs\n  all = [\n    # Contains base packages eg curl, zip, etc\n    \"BASE_PACKAGES\",\n\n    \"docker-engine\",\n    \"node\",\n    \"pre-commit\",\n    \"python2\",\n    \"python3\",\n    \"terraform\",\n    \"terraform-docs\",\n    \"tflint\",\n    \"tfsec\"\n  ]\n}\n```\n\n----\n### Inputs\n\n| Name | Description | Type | Default | Required |\n|------|-------------|------|---------|:--------:|\n| \u003ca name=\"input_ami_name\"\u003e\u003c/a\u003e [ami\\_name](#input\\_ami\\_name) | AWS AMI name filter for launching instances. \u003cbr\u003e GitHub supports specific operating systems and architectures, including Ubuntu 22.04 amd64 which is the default. \u003cbr\u003e Note: The included software packs are not tested with other AMIs. | `string` | `\"ubuntu/images/hvm-ssd/ubuntu-jammy-22.04-amd64-server-20220609\"` | no |\n| \u003ca name=\"input_ami_owners\"\u003e\u003c/a\u003e [ami\\_owners](#input\\_ami\\_owners) | AWS AMI owners to limit AMI search. \u003cbr\u003e Values may be an AWS Account ID, \"self\", or an AWS owner alias eg \"amazon\". | `list(string)` | \u003cpre\u003e[\u003cbr\u003e  \"amazon\"\u003cbr\u003e]\u003c/pre\u003e | no |\n| \u003ca name=\"input_autoscaling_desired_size\"\u003e\u003c/a\u003e [autoscaling\\_desired\\_size](#input\\_autoscaling\\_desired\\_size) | The number of Amazon EC2 instances that should be running.\u003cbr\u003e*When `scaling_mode=\"autoscaling-group\"`* | `number` | `1` | no |\n| \u003ca name=\"input_autoscaling_max_instance_lifetime\"\u003e\u003c/a\u003e [autoscaling\\_max\\_instance\\_lifetime](#input\\_autoscaling\\_max\\_instance\\_lifetime) | The maximum amount of time, in seconds, that an instance can be in service. Values must be either equal to `0` or between `86400` and `31536000` seconds.\u003cbr\u003e*When `scaling_mode=\"autoscaling-group\"`* | `string` | `0` | no |\n| \u003ca name=\"input_autoscaling_max_size\"\u003e\u003c/a\u003e [autoscaling\\_max\\_size](#input\\_autoscaling\\_max\\_size) | The maximum size of the Auto Scaling Group.\u003cbr\u003e*When `scaling_mode=\"autoscaling-group\"`* | `number` | `3` | no |\n| \u003ca name=\"input_autoscaling_min_size\"\u003e\u003c/a\u003e [autoscaling\\_min\\_size](#input\\_autoscaling\\_min\\_size) | The minimum size of the Auto Scaling Group.\u003cbr\u003e*When `scaling_mode=\"autoscaling-group\"`* | `number` | `1` | no |\n| \u003ca name=\"input_autoscaling_schedule_off_recurrences\"\u003e\u003c/a\u003e [autoscaling\\_schedule\\_off\\_recurrences](#input\\_autoscaling\\_schedule\\_off\\_recurrences) | A list of schedule cron expressions, specifying when the Auto Scaling Group will terminate all instances.\u003cbr\u003eExample: `[\"0 18 * * *\"]`\u003cbr\u003e*When `scaling_mode=\"autoscaling-group\"`* | `list(string)` | `[]` | no |\n| \u003ca name=\"input_autoscaling_schedule_on_recurrences\"\u003e\u003c/a\u003e [autoscaling\\_schedule\\_on\\_recurrences](#input\\_autoscaling\\_schedule\\_on\\_recurrences) | A list of schedule cron expressions, specifying when the Auto Scaling Group will launch instances.\u003cbr\u003eExample: `[\"0 07 * * MON-FRI\"]`\u003cbr\u003e*When `scaling_mode=\"autoscaling-group\"`* | `list(string)` | `[]` | no |\n| \u003ca name=\"input_autoscaling_schedule_time_zone\"\u003e\u003c/a\u003e [autoscaling\\_schedule\\_time\\_zone](#input\\_autoscaling\\_schedule\\_time\\_zone) | The timezone for schedule cron expressions.\u003cbr\u003ehttps://www.joda.org/joda-time/timezones.html\u003cbr\u003e*When `scaling_mode=\"autoscaling-group\"`* | `string` | `\"\"` | no |\n| \u003ca name=\"input_cloud_init_extra_other\"\u003e\u003c/a\u003e [cloud\\_init\\_extra\\_other](#input\\_cloud\\_init\\_extra\\_other) | Arbitrary text to append to the `cloudinit` script. | `string` | `\"\"` | no |\n| \u003ca name=\"input_cloud_init_extra_packages\"\u003e\u003c/a\u003e [cloud\\_init\\_extra\\_packages](#input\\_cloud\\_init\\_extra\\_packages) | A list of strings to append beneath the `packages:` section of the `cloudinit` script.\u003cbr\u003ehttps://cloudinit.readthedocs.io/en/latest/topics/modules.html#package-update-upgrade-install | `list(string)` | `[]` | no |\n| \u003ca name=\"input_cloud_init_extra_runcmds\"\u003e\u003c/a\u003e [cloud\\_init\\_extra\\_runcmds](#input\\_cloud\\_init\\_extra\\_runcmds) | A list of strings to append beneath the `runcmd:` section of the `cloudinit` script.\u003cbr\u003ehttps://cloudinit.readthedocs.io/en/latest/topics/modules.html#runcmd | `list(string)` | `[]` | no |\n| \u003ca name=\"input_cloud_init_extra_write_files\"\u003e\u003c/a\u003e [cloud\\_init\\_extra\\_write\\_files](#input\\_cloud\\_init\\_extra\\_write\\_files) | A list of strings to append beneath the `write_files:` section of the `cloudinit` script.\u003cbr\u003ehttps://cloudinit.readthedocs.io/en/latest/topics/modules.html#write-files | `list(string)` | `[]` | no |\n| \u003ca name=\"input_cloudwatch_log_group\"\u003e\u003c/a\u003e [cloudwatch\\_log\\_group](#input\\_cloudwatch\\_log\\_group) | CloudWatch log group name prefix. Runner logs from /var/log/syslog are sent here. \u003cbr\u003eExample: `github_runner`, with this value logs will be written to `github_runner/var/log/syslog/\u003cinstance_id\u003e`.\u003cbr\u003eIf left unspecified then logging is disabled. | `string` | `\"\"` | no |\n| \u003ca name=\"input_create_iam_resources\"\u003e\u003c/a\u003e [create\\_iam\\_resources](#input\\_create\\_iam\\_resources) | Should the module create the IAM resources needed. If set to false then an \"iam\\_instance\\_profile\\_arn\" must be provided. | `bool` | `true` | no |\n| \u003ca name=\"input_ec2_associate_public_ip_address\"\u003e\u003c/a\u003e [ec2\\_associate\\_public\\_ip\\_address](#input\\_ec2\\_associate\\_public\\_ip\\_address) | Whether to associate a public IP address with EC2 instances in a VPC. | `bool` | `false` | no |\n| \u003ca name=\"input_ec2_ebs_volume_size\"\u003e\u003c/a\u003e [ec2\\_ebs\\_volume\\_size](#input\\_ec2\\_ebs\\_volume\\_size) | Size in GB of instance-attached EBS storage. By default this is set to `per_instance_runner_count * 20 GB`. | `number` | `-1` | no |\n| \u003ca name=\"input_ec2_instance_type\"\u003e\u003c/a\u003e [ec2\\_instance\\_type](#input\\_ec2\\_instance\\_type) | Instance type for EC2 instances. | `string` | n/a | yes |\n| \u003ca name=\"input_ec2_key_pair_name\"\u003e\u003c/a\u003e [ec2\\_key\\_pair\\_name](#input\\_ec2\\_key\\_pair\\_name) | EC2 Key Pair name to allow SSH to EC2 instances. | `string` | `\"\"` | no |\n| \u003ca name=\"input_github_organisation_name\"\u003e\u003c/a\u003e [github\\_organisation\\_name](#input\\_github\\_organisation\\_name) | GitHub orgnisation name. Derived from `github_url` by default. | `string` | `\"\"` | no |\n| \u003ca name=\"input_github_runner_group\"\u003e\u003c/a\u003e [github\\_runner\\_group](#input\\_github\\_runner\\_group) | Custom GitHub runner group. | `string` | `\"\"` | no |\n| \u003ca name=\"input_github_runner_labels\"\u003e\u003c/a\u003e [github\\_runner\\_labels](#input\\_github\\_runner\\_labels) | Custom GitHub runner labels. \u003cbr\u003eExample: `\"gpu,x64,linux\"`. | `list(string)` | `[]` | no |\n| \u003ca name=\"input_github_url\"\u003e\u003c/a\u003e [github\\_url](#input\\_github\\_url) | GitHub organisation URL.\u003cbr\u003eExample: \"https://github.com/cloudandthings/\". | `string` | n/a | yes |\n| \u003ca name=\"input_iam_instance_profile_arn\"\u003e\u003c/a\u003e [iam\\_instance\\_profile\\_arn](#input\\_iam\\_instance\\_profile\\_arn) | IAM Instance Profile to launch EC2 instances with. Must allow permissions to read the SSM Parameter. Will be created by default. | `string` | `\"\"` | no |\n| \u003ca name=\"input_iam_policy_arns\"\u003e\u003c/a\u003e [iam\\_policy\\_arns](#input\\_iam\\_policy\\_arns) | A list of existing IAM policy ARNs to attach to the runner IAM role. | `list(string)` | `[]` | no |\n| \u003ca name=\"input_naming_prefix\"\u003e\u003c/a\u003e [naming\\_prefix](#input\\_naming\\_prefix) | Created resources will be prefixed with this. | `string` | `\"github-runner\"` | no |\n| \u003ca name=\"input_per_instance_runner_count\"\u003e\u003c/a\u003e [per\\_instance\\_runner\\_count](#input\\_per\\_instance\\_runner\\_count) | Number of runners per instance. By default this is set to `num_vCPUs * num_cores * threads_per_core`. May be set to 0 to never create runners. | `number` | `-1` | no |\n| \u003ca name=\"input_region\"\u003e\u003c/a\u003e [region](#input\\_region) | AWS region. | `string` | n/a | yes |\n| \u003ca name=\"input_scaling_mode\"\u003e\u003c/a\u003e [scaling\\_mode](#input\\_scaling\\_mode) | How instances are managed. \u003cbr\u003e Can be either `\"autoscaling-group\"` or `\"single-instance\"`. | `string` | `\"autoscaling-group\"` | no |\n| \u003ca name=\"input_security_groups\"\u003e\u003c/a\u003e [security\\_groups](#input\\_security\\_groups) | A list of security groups to assign to EC2 instances.\u003cbr\u003eNote: If none are provided, a new security group will be used which will deny inbound traffic **including SSH**. | `list(string)` | `[]` | no |\n| \u003ca name=\"input_software_packs\"\u003e\u003c/a\u003e [software\\_packs](#input\\_software\\_packs) | A list of pre-defined software packs to install.\u003cbr\u003eValid options are: `\"ALL\"`, `\"BASE_PACKAGES\"`, `\"docker-engine\"`, `\"node\"`, `\"python2\"`, `\"python3\"`, `\"terraform\"`, `\"terraform-docs\"`, `\"tflint\"`, `\"tfsec\"`.\u003cbr\u003eAn empty list will mean none are installed. | `list(string)` | \u003cpre\u003e[\u003cbr\u003e  \"ALL\"\u003cbr\u003e]\u003c/pre\u003e | no |\n| \u003ca name=\"input_ssm_parameter_name\"\u003e\u003c/a\u003e [ssm\\_parameter\\_name](#input\\_ssm\\_parameter\\_name) | SSM parameter name for the GitHub Runner token.\u003cbr\u003eExample: `\"/github/runner/token\"`. | `string` | n/a | yes |\n| \u003ca name=\"input_subnet_ids\"\u003e\u003c/a\u003e [subnet\\_ids](#input\\_subnet\\_ids) | The list of Subnet IDs to launch EC2 instances in. \u003cbr\u003e If `scaling_mode=\"single-instance\"` then the first Subnet ID from this list will be used. | `list(string)` | n/a | yes |\n| \u003ca name=\"input_vpc_id\"\u003e\u003c/a\u003e [vpc\\_id](#input\\_vpc\\_id) | The VPC ID to launch instances in. | `string` | n/a | yes |\n\n----\n### Modules\n\n| Name | Source | Version |\n|------|--------|---------|\n| \u003ca name=\"module_software_packs\"\u003e\u003c/a\u003e [software\\_packs](#module\\_software\\_packs) | ./modules/software | n/a |\n| \u003ca name=\"module_user_data\"\u003e\u003c/a\u003e [user\\_data](#module\\_user\\_data) | ./modules/user_data | n/a |\n\n----\n### Outputs\n\n| Name | Description |\n|------|-------------|\n| \u003ca name=\"output_aws_instance_id\"\u003e\u003c/a\u003e [aws\\_instance\\_id](#output\\_aws\\_instance\\_id) | Instance ID (when `scaled_mode=single-instance`) |\n| \u003ca name=\"output_aws_instance_public_ip\"\u003e\u003c/a\u003e [aws\\_instance\\_public\\_ip](#output\\_aws\\_instance\\_public\\_ip) | Instance public IP (when `scaled_mode=single-instance`) |\n| \u003ca name=\"output_per_instance_runner_count\"\u003e\u003c/a\u003e [per\\_instance\\_runner\\_count](#output\\_per\\_instance\\_runner\\_count) | Effective per instance runner count. |\n| \u003ca name=\"output_software_packs\"\u003e\u003c/a\u003e [software\\_packs](#output\\_software\\_packs) | List of software packs that were installed. |\n\n----\n### Providers\n\n| Name | Version |\n|------|---------|\n| \u003ca name=\"provider_aws\"\u003e\u003c/a\u003e [aws](#provider\\_aws) | ~\u003e 4.9 |\n| \u003ca name=\"provider_null\"\u003e\u003c/a\u003e [null](#provider\\_null) | ~\u003e 3.2 |\n\n----\n### Requirements\n\n| Name | Version |\n|------|---------|\n| \u003ca name=\"requirement_terraform\"\u003e\u003c/a\u003e [terraform](#requirement\\_terraform) | \u003e= 0.14.0 |\n| \u003ca name=\"requirement_aws\"\u003e\u003c/a\u003e [aws](#requirement\\_aws) | ~\u003e 4.9 |\n| \u003ca name=\"requirement_http\"\u003e\u003c/a\u003e [http](#requirement\\_http) | ~\u003e 3.0 |\n| \u003ca name=\"requirement_null\"\u003e\u003c/a\u003e [null](#requirement\\_null) | ~\u003e 3.2 |\n\n----\n### Resources\n\n| Name | Type |\n|------|------|\n| [aws_autoscaling_group.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/autoscaling_group) | resource |\n| [aws_autoscaling_policy.scale_down](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/autoscaling_policy) | resource |\n| [aws_autoscaling_schedule.off](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/autoscaling_schedule) | resource |\n| [aws_autoscaling_schedule.on](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/autoscaling_schedule) | resource |\n| [aws_cloudwatch_metric_alarm.scale_down](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/cloudwatch_metric_alarm) | resource |\n| [aws_iam_instance_profile.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_instance_profile) | resource |\n| [aws_iam_policy.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_policy) | resource |\n| [aws_iam_role.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role) | resource |\n| [aws_iam_role_policy_attachment.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment) | resource |\n| [aws_iam_role_policy_attachment.user_defined_policies](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/iam_role_policy_attachment) | resource |\n| [aws_instance.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/instance) | resource |\n| [aws_launch_template.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/launch_template) | resource |\n| [aws_security_group.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/security_group) | resource |\n| [null_resource.validate_instance_profile](https://registry.terraform.io/providers/hashicorp/null/latest/docs/resources/resource) | resource |\n| [aws_ami.ami](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/ami) | data source |\n| [aws_caller_identity.current](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/caller_identity) | data source |\n| [aws_ec2_instance_type.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/ec2_instance_type) | data source |\n| [aws_ssm_parameter.this](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/data-sources/ssm_parameter) | data source |\n\n----\n\n```\n\u003c!-- END_TF_DOCS --\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcloudandthings%2Fterraform-aws-github-runners-ec2","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fcloudandthings%2Fterraform-aws-github-runners-ec2","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fcloudandthings%2Fterraform-aws-github-runners-ec2/lists"}