diff --git a/.gitignore b/.gitignore index 1fef4ab..10db001 100644 --- a/.gitignore +++ b/.gitignore @@ -7,3 +7,9 @@ # .tfvars files *.tfvars + +**/.idea +**/*.iml + +**/.build-harness +**/build-harness diff --git a/.travis.yml b/.travis.yml new file mode 100644 index 0000000..241026e --- /dev/null +++ b/.travis.yml @@ -0,0 +1,16 @@ +addons: + apt: + packages: + - git + - make + - curl + +install: + - make init + +script: + - make terraform/install + - make terraform/get-plugins + - make terraform/get-modules + - make terraform/lint + - make terraform/validate diff --git a/LICENSE b/LICENSE index 261eeb9..c37833f 100644 --- a/LICENSE +++ b/LICENSE @@ -186,7 +186,7 @@ same "printed page" as the copyright notice for easier identification within third-party archives. - Copyright [yyyy] [name of copyright owner] + Copyright 2018 Cloud Posse, LLC Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..97d8087 --- /dev/null +++ b/Makefile @@ -0,0 +1,10 @@ +SHELL := /bin/bash + +# List of targets the `readme` target should call before generating the readme +export README_DEPS ?= docs/targets.md docs/terraform.md + +-include $(shell curl -sSL -o .build-harness "https://git.io/build-harness"; echo .build-harness) + +## Lint terraform code +lint: + $(SELF) terraform/install terraform/get-modules terraform/get-plugins terraform/lint terraform/validate diff --git a/README.md b/README.md index 81de72d..f297bf4 100644 --- a/README.md +++ b/README.md @@ -1,2 +1,314 @@ -# terraform-aws-ec2-autoscale-group -Terraform module provision an EC2 autoscale group + + +[![Cloud Posse](https://cloudposse.com/logo-300x69.svg)](https://cloudposse.com) + +# terraform-aws-ec2-autoscale-group [![Build Status](https://travis-ci.org/cloudposse/terraform-aws-ec2-autoscale-group.svg?branch=master)](https://travis-ci.org/cloudposse/terraform-aws-ec2-autoscale-group) [![Latest Release](https://img.shields.io/github/release/cloudposse/terraform-aws-ec2-autoscale-group.svg)](https://github.com/cloudposse/terraform-aws-ec2-autoscale-group/releases/latest) [![Slack Community](https://slack.cloudposse.com/badge.svg)](https://slack.cloudposse.com) + + +Terraform module to provision [Auto Scaling Group](https://www.terraform.io/docs/providers/aws/r/autoscaling_group.html) and [Launch Template](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html) on AWS. + +The module also creates AutoScaling Policies and CloudWatch Metric Alarms to monitor CPU utilization on the EC2 instances and scale the number of instance in the AutoScaling Group up or down. +If you don't want to use the provided functionality, or want to provide your own policies, disable it by setting the variable `autoscaling_policies_enabled` to `"false"`. + + +--- + +This project is part of our comprehensive ["SweetOps"](https://docs.cloudposse.com) approach towards DevOps. + + +It's 100% Open Source and licensed under the [APACHE2](LICENSE). + + + + + + + + + + +## Usage + + +```hcl +locals { + userdata = < /home/ec2-user/.ssh/config + Host * + StrictHostKeyChecking no + __EOF__ + chmod 600 /home/ec2-user/.ssh/config + chown ec2-user:ec2-user /home/ec2-user/.ssh/config + USERDATA +} + +module "autoscale_group" { + source = "git::https://github.com/cloudposse/terraform-aws-ec2-autoscale-group.git?ref=master" + + namespace = "eg" + stage = "dev" + name = "test" + + image_id = "ami-08cab282f9979fc7a" + instance_type = "t2.small" + security_group_ids = ["sg-xxxxxxxx"] + subnet_ids = ["subnet-xxxxxxxx", "subnet-yyyyyyyy", "subnet-zzzzzzzz"] + health_check_type = "EC2" + min_size = 2 + max_size = 3 + wait_for_capacity_timeout = "5m" + associate_public_ip_address = true + user_data_base64 = "${base64encode(local.userdata)}" + + tags = { + Tier = "1" + KubernetesCluster = "us-west-2.testing.cloudposse.co" + } + + # Auto-scaling policies and CloudWatch metric alarms + autoscaling_policies_enabled = "true" + cpu_utilization_high_threshold_percent = "70" + cpu_utilization_low_threshold_percent = "20" +} +``` + + + + + + +## Makefile Targets +``` +Available targets: + + help Help screen + help/all Display help for all targets + help/short This help short screen + lint Lint terraform code + +``` + +## Inputs + +| Name | Description | Type | Default | Required | +|------|-------------|:----:|:-----:|:-----:| +| associate_public_ip_address | Associate a public IP address with an instance in a VPC | string | `false` | no | +| attributes | Additional attributes (e.g. `1`) | list | `` | no | +| autoscaling_policies_enabled | Whether to create `aws_autoscaling_policy` and `aws_cloudwatch_metric_alarm` resources to control Auto Scaling | string | `true` | no | +| block_device_mappings | Specify volumes to attach to the instance besides the volumes specified by the AMI | list | `` | no | +| cpu_utilization_high_evaluation_periods | The number of periods over which data is compared to the specified threshold | string | `2` | no | +| cpu_utilization_high_period_seconds | The period in seconds over which the specified statistic is applied | string | `300` | no | +| cpu_utilization_high_statistic | The statistic to apply to the alarm's associated metric. Either of the following is supported: `SampleCount`, `Average`, `Sum`, `Minimum`, `Maximum` | string | `Average` | no | +| cpu_utilization_high_threshold_percent | The value against which the specified statistic is compared | string | `90` | no | +| cpu_utilization_low_evaluation_periods | The number of periods over which data is compared to the specified threshold | string | `2` | no | +| cpu_utilization_low_period_seconds | The period in seconds over which the specified statistic is applied | string | `300` | no | +| cpu_utilization_low_statistic | The statistic to apply to the alarm's associated metric. Either of the following is supported: `SampleCount`, `Average`, `Sum`, `Minimum`, `Maximum` | string | `Average` | no | +| cpu_utilization_low_threshold_percent | The value against which the specified statistic is compared | string | `10` | no | +| credit_specification | Customize the credit specification of the instances | list | `` | no | +| default_cooldown | The amount of time, in seconds, after a scaling activity completes before another scaling activity can start | string | `300` | no | +| delimiter | Delimiter to be used between `name`, `namespace`, `stage`, etc. | string | `-` | no | +| disable_api_termination | If `true`, enables EC2 Instance Termination Protection | string | `false` | no | +| ebs_optimized | If true, the launched EC2 instance will be EBS-optimized | string | `false` | no | +| elastic_gpu_specifications | Specifications of Elastic GPU to attach to the instances | list | `` | no | +| enable_monitoring | Enable/disable detailed monitoring | string | `true` | no | +| enabled | Whether to create the resources. Set to `false` to prevent the module from creating any resources | string | `true` | no | +| enabled_metrics | A list of metrics to collect. The allowed values are `GroupMinSize`, `GroupMaxSize`, `GroupDesiredCapacity`, `GroupInServiceInstances`, `GroupPendingInstances`, `GroupStandbyInstances`, `GroupTerminatingInstances`, `GroupTotalInstances` | list | `` | no | +| environment | Environment, e.g. 'testing', 'UAT' | string | `` | no | +| force_delete | Allows deleting the autoscaling group without waiting for all instances in the pool to terminate. You can force an autoscaling group to delete even if it's in the process of scaling a resource. Normally, Terraform drains all the instances before deleting the group. This bypasses that behavior and potentially leaves resources dangling | string | `false` | no | +| health_check_grace_period | Time (in seconds) after instance comes into service before checking health | string | `300` | no | +| health_check_type | Controls how health checking is done. Valid values are `EC2` or `ELB` | string | `EC2` | no | +| iam_instance_profile_name | The IAM instance profile name to associate with launched instances | string | `` | no | +| image_id | The EC2 image ID to launch | string | `` | no | +| instance_initiated_shutdown_behavior | Shutdown behavior for the instances. Can be `stop` or `terminate` | string | `terminate` | no | +| instance_market_options | The market (purchasing) option for the instances | list | `` | no | +| instance_type | Instance type to launch | string | - | yes | +| key_name | The SSH key name that should be used for the instance | string | `` | no | +| launch_template_version | Launch template version. Can be version number, `$Latest` or `$Default` | string | `$$Latest` | no | +| load_balancers | A list of elastic load balancer names to add to the autoscaling group names. Only valid for classic load balancers. For ALBs, use `target_group_arns` instead | list | `` | no | +| max_size | The maximum size of the autoscale group | string | - | yes | +| metrics_granularity | The granularity to associate with the metrics to collect. The only valid value is 1Minute | string | `1Minute` | no | +| min_elb_capacity | Setting this causes Terraform to wait for this number of instances to show up healthy in the ELB only on creation. Updates will not wait on ELB instance number changes | string | `0` | no | +| min_size | The minimum size of the autoscale group | string | - | yes | +| name | Solution name, e.g. 'app' or 'cluster' | string | `app` | no | +| namespace | Namespace, which could be your organization name, e.g. 'eg' or 'cp' | string | - | yes | +| placement | The placement specifications of the instances | list | `` | no | +| placement_group | The name of the placement group into which you'll launch your instances, if any | string | `` | no | +| protect_from_scale_in | Allows setting instance protection. The autoscaling group will not select instances with this setting for terminination during scale in events | string | `false` | no | +| scale_down_adjustment_type | Specifies whether the adjustment is an absolute number or a percentage of the current capacity. Valid values are `ChangeInCapacity`, `ExactCapacity` and `PercentChangeInCapacity` | string | `ChangeInCapacity` | no | +| scale_down_cooldown_seconds | The amount of time, in seconds, after a scaling activity completes and before the next scaling activity can start | string | `300` | no | +| scale_down_policy_type | The scalling policy type, either `SimpleScaling`, `StepScaling` or `TargetTrackingScaling` | string | `SimpleScaling` | no | +| scale_down_scaling_adjustment | The number of instances by which to scale. `scale_down_scaling_adjustment` determines the interpretation of this number (e.g. as an absolute number or as a percentage of the existing Auto Scaling group size). A positive increment adds to the current capacity and a negative value removes from the current capacity | string | `-1` | no | +| scale_up_adjustment_type | Specifies whether the adjustment is an absolute number or a percentage of the current capacity. Valid values are `ChangeInCapacity`, `ExactCapacity` and `PercentChangeInCapacity` | string | `ChangeInCapacity` | no | +| scale_up_cooldown_seconds | The amount of time, in seconds, after a scaling activity completes and before the next scaling activity can start | string | `300` | no | +| scale_up_policy_type | The scalling policy type, either `SimpleScaling`, `StepScaling` or `TargetTrackingScaling` | string | `SimpleScaling` | no | +| scale_up_scaling_adjustment | The number of instances by which to scale. `scale_up_adjustment_type` determines the interpretation of this number (e.g. as an absolute number or as a percentage of the existing Auto Scaling group size). A positive increment adds to the current capacity and a negative value removes from the current capacity | string | `1` | no | +| security_group_ids | A list of associated security group IDs | list | `` | no | +| service_linked_role_arn | The ARN of the service-linked role that the ASG will use to call other AWS services | string | `` | no | +| stage | Stage, e.g. 'prod', 'staging', 'dev', or 'test' | string | - | yes | +| subnet_ids | A list of subnet IDs to launch resources in | list | - | yes | +| suspended_processes | A list of processes to suspend for the AutoScaling Group. The allowed values are `Launch`, `Terminate`, `HealthCheck`, `ReplaceUnhealthy`, `AZRebalance`, `AlarmNotification`, `ScheduledActions`, `AddToLoadBalancer`. Note that if you suspend either the `Launch` or `Terminate` process types, it can prevent your autoscaling group from functioning properly. | list | `` | no | +| tags | Additional tags (e.g. `map('BusinessUnit`,`XYZ`) | map | `` | no | +| target_group_arns | A list of aws_alb_target_group ARNs, for use with Application Load Balancing | list | `` | no | +| termination_policies | A list of policies to decide how the instances in the auto scale group should be terminated. The allowed values are `OldestInstance`, `NewestInstance`, `OldestLaunchConfiguration`, `ClosestToNextInstanceHour`, `Default` | list | `` | no | +| user_data_base64 | The Base64-encoded user data to provide when launching the instances | string | `` | no | +| wait_for_capacity_timeout | A maximum duration that Terraform should wait for ASG instances to be healthy before timing out. (See also Waiting for Capacity below.) Setting this to '0' causes Terraform to skip all Capacity Waiting behavior | string | `10m` | no | +| wait_for_elb_capacity | Setting this will cause Terraform to wait for exactly this number of healthy instances in all attached load balancers on both create and update operations. Takes precedence over `min_elb_capacity` behavior | string | `false` | no | + +## Outputs + +| Name | Description | +|------|-------------| +| autoscaling_group_arn | The ARN for this AutoScaling Group | +| autoscaling_group_default_cooldown | Time between a scaling activity and the succeeding scaling activity | +| autoscaling_group_desired_capacity | The number of Amazon EC2 instances that should be running in the group | +| autoscaling_group_health_check_grace_period | Time after instance comes into service before checking health | +| autoscaling_group_health_check_type | `EC2` or `ELB`. Controls how health checking is done | +| autoscaling_group_id | The autoscaling group id | +| autoscaling_group_max_size | The maximum size of the autoscale group | +| autoscaling_group_min_size | The minimum size of the autoscale group | +| autoscaling_group_name | The autoscaling group name | +| launch_template_arn | The ARN of the launch template | +| launch_template_id | The ID of the launch template | + + + + +## Related Projects + +Check out these related projects. + +- [terraform-aws-ec2-instance](https://github.com/cloudposse/terraform-aws-ec2-instance) - Terraform module for providing a general purpose EC2 instance +- [terraform-aws-ec2-bastion-server](https://github.com/cloudposse/terraform-aws-ec2-bastion-server) - Terraform module to define a generic bastion host with parameterized user data +- [terraform-aws-ec2-admin-server](https://github.com/cloudposse/terraform-aws-ec2-admin-server) - Terraform module for providing an EC2 instance capable of running admin tasks +- [terraform-aws-ec2-instance-group](https://github.com/cloudposse/terraform-aws-ec2-instance-group) - Terraform module for provisioning multiple general purpose EC2 hosts for stateful applications +- [terraform-aws-ec2-ami-snapshot](https://github.com/cloudposse/terraform-aws-ec2-ami-snapshot) - Terraform module to easily generate AMI snapshots to create replica instances + + + +## Help + +**Got a question?** + +File a GitHub [issue](https://github.com/cloudposse/terraform-aws-ec2-autoscale-group/issues), send us an [email][email] or join our [Slack Community][slack]. + +## Commercial Support + +Work directly with our team of DevOps experts via email, slack, and video conferencing. + +We provide [*commercial support*][commercial_support] for all of our [Open Source][github] projects. As a *Dedicated Support* customer, you have access to our team of subject matter experts at a fraction of the cost of a full-time engineer. + +[![E-Mail](https://img.shields.io/badge/email-hello@cloudposse.com-blue.svg)](mailto:hello@cloudposse.com) + +- **Questions.** We'll use a Shared Slack channel between your team and ours. +- **Troubleshooting.** We'll help you triage why things aren't working. +- **Code Reviews.** We'll review your Pull Requests and provide constructive feedback. +- **Bug Fixes.** We'll rapidly work to fix any bugs in our projects. +- **Build New Terraform Modules.** We'll develop original modules to provision infrastructure. +- **Cloud Architecture.** We'll assist with your cloud strategy and design. +- **Implementation.** We'll provide hands-on support to implement our reference architectures. + + +## Community Forum + +Get access to our [Open Source Community Forum][slack] on Slack. It's **FREE** to join for everyone! Our "SweetOps" community is where you get to talk with others who share a similar vision for how to rollout and manage infrastructure. This is the best place to talk shop, ask questions, solicit feedback, and work together as a community to build *sweet* infrastructure. + +## Contributing + +### Bug Reports & Feature Requests + +Please use the [issue tracker](https://github.com/cloudposse/terraform-aws-ec2-autoscale-group/issues) to report any bugs or file feature requests. + +### Developing + +If you are interested in being a contributor and want to get involved in developing this project or [help out](https://github.com/orgs/cloudposse/projects/3) with our other projects, we would love to hear from you! Shoot us an [email](mailto:hello@cloudposse.com). + +In general, PRs are welcome. We follow the typical "fork-and-pull" Git workflow. + + 1. **Fork** the repo on GitHub + 2. **Clone** the project to your own machine + 3. **Commit** changes to your own branch + 4. **Push** your work back up to your fork + 5. Submit a **Pull Request** so that we can review your changes + +**NOTE:** Be sure to merge the latest changes from "upstream" before making a pull request! + + +## Copyright + +Copyright © 2017-2018 [Cloud Posse, LLC](https://cloudposse.com) + + + +## License + +[![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) + +See [LICENSE](LICENSE) for full details. + + Licensed to the Apache Software Foundation (ASF) under one + or more contributor license agreements. See the NOTICE file + distributed with this work for additional information + regarding copyright ownership. The ASF licenses this file + to you under the Apache License, Version 2.0 (the + "License"); you may not use this file except in compliance + with the License. You may obtain a copy of the License at + + https://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, + software distributed under the License is distributed on an + "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + KIND, either express or implied. See the License for the + specific language governing permissions and limitations + under the License. + + + + + + + + + +## Trademarks + +All other trademarks referenced herein are the property of their respective owners. + +## About + +This project is maintained and funded by [Cloud Posse, LLC][website]. Like it? Please let us know at + +[![Cloud Posse](https://cloudposse.com/logo-300x69.svg)](https://cloudposse.com) + +We're a [DevOps Professional Services][hire] company based in Los Angeles, CA. We love [Open Source Software](https://github.com/cloudposse/)! + +We offer paid support on all of our projects. + +Check out [our other projects][github], [apply for a job][jobs], or [hire us][hire] to help with your cloud strategy and implementation. + + [docs]: https://docs.cloudposse.com/ + [website]: https://cloudposse.com/ + [github]: https://github.com/cloudposse/ + [commercial_support]: https://github.com/orgs/cloudposse/projects + [jobs]: https://cloudposse.com/jobs/ + [hire]: https://cloudposse.com/contact/ + [slack]: https://slack.cloudposse.com/ + [linkedin]: https://www.linkedin.com/company/cloudposse + [twitter]: https://twitter.com/cloudposse/ + [email]: mailto:hello@cloudposse.com + + +### Contributors + +| [![Erik Osterman][osterman_avatar]][osterman_homepage]
[Erik Osterman][osterman_homepage] | [![Andriy Knysh][aknysh_avatar]][aknysh_homepage]
[Andriy Knysh][aknysh_homepage] | [![Igor Rodionov][goruha_avatar]][goruha_homepage]
[Igor Rodionov][goruha_homepage] | +|---|---|---| + + [osterman_homepage]: https://github.com/osterman + [osterman_avatar]: https://github.com/osterman.png?size=150 + [aknysh_homepage]: https://github.com/aknysh + [aknysh_avatar]: https://github.com/aknysh.png?size=150 + [goruha_homepage]: https://github.com/goruha + [goruha_avatar]: https://github.com/goruha.png?size=150 + + diff --git a/README.yaml b/README.yaml new file mode 100644 index 0000000..d4b9b74 --- /dev/null +++ b/README.yaml @@ -0,0 +1,112 @@ +--- +# +# This is the canonical configuration for the `README.md` +# Run `make readme` to rebuild the `README.md` +# + +# Name of this project +name: terraform-aws-ec2-autoscale-group + +# Logo for this project +#logo: docs/logo.png + +# License of this project +license: "APACHE2" + +# Canonical GitHub repo +github_repo: cloudposse/terraform-aws-ec2-autoscale-group + +# Badges to display +badges: + - name: "Build Status" + image: "https://travis-ci.org/cloudposse/terraform-aws-ec2-autoscale-group.svg?branch=master" + url: "https://travis-ci.org/cloudposse/terraform-aws-ec2-autoscale-group" + - name: "Latest Release" + image: "https://img.shields.io/github/release/cloudposse/terraform-aws-ec2-autoscale-group.svg" + url: "https://github.com/cloudposse/terraform-aws-ec2-autoscale-group/releases/latest" + - name: "Slack Community" + image: "https://slack.cloudposse.com/badge.svg" + url: "https://slack.cloudposse.com" + +related: + - name: "terraform-aws-ec2-instance" + description: "Terraform module for providing a general purpose EC2 instance" + url: "https://github.com/cloudposse/terraform-aws-ec2-instance" + - name: "terraform-aws-ec2-bastion-server" + description: "Terraform module to define a generic bastion host with parameterized user data" + url: "https://github.com/cloudposse/terraform-aws-ec2-bastion-server" + - name: "terraform-aws-ec2-admin-server" + description: "Terraform module for providing an EC2 instance capable of running admin tasks" + url: "https://github.com/cloudposse/terraform-aws-ec2-admin-server" + - name: "terraform-aws-ec2-instance-group" + description: "Terraform module for provisioning multiple general purpose EC2 hosts for stateful applications" + url: "https://github.com/cloudposse/terraform-aws-ec2-instance-group" + - name: "terraform-aws-ec2-ami-snapshot" + description: "Terraform module to easily generate AMI snapshots to create replica instances" + url: "https://github.com/cloudposse/terraform-aws-ec2-ami-snapshot" + +# Short description of this project +description: |- + Terraform module to provision [Auto Scaling Group](https://www.terraform.io/docs/providers/aws/r/autoscaling_group.html) and [Launch Template](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-templates.html) on AWS. + + The module also creates AutoScaling Policies and CloudWatch Metric Alarms to monitor CPU utilization on the EC2 instances and scale the number of instance in the AutoScaling Group up or down. + If you don't want to use the provided functionality, or want to provide your own policies, disable it by setting the variable `autoscaling_policies_enabled` to `"false"`. + +# How to use this project +usage: |- + + ```hcl + locals { + userdata = < /home/ec2-user/.ssh/config + Host * + StrictHostKeyChecking no + __EOF__ + chmod 600 /home/ec2-user/.ssh/config + chown ec2-user:ec2-user /home/ec2-user/.ssh/config + USERDATA + } + + module "autoscale_group" { + source = "git::https://github.com/cloudposse/terraform-aws-ec2-autoscale-group.git?ref=master" + + namespace = "eg" + stage = "dev" + name = "test" + + image_id = "ami-08cab282f9979fc7a" + instance_type = "t2.small" + security_group_ids = ["sg-xxxxxxxx"] + subnet_ids = ["subnet-xxxxxxxx", "subnet-yyyyyyyy", "subnet-zzzzzzzz"] + health_check_type = "EC2" + min_size = 2 + max_size = 3 + wait_for_capacity_timeout = "5m" + associate_public_ip_address = true + user_data_base64 = "${base64encode(local.userdata)}" + + tags = { + Tier = "1" + KubernetesCluster = "us-west-2.testing.cloudposse.co" + } + + # Auto-scaling policies and CloudWatch metric alarms + autoscaling_policies_enabled = "true" + cpu_utilization_high_threshold_percent = "70" + cpu_utilization_low_threshold_percent = "20" + } + ``` + +include: + - "docs/targets.md" + - "docs/terraform.md" + +# Contributors to this project +contributors: + - name: "Erik Osterman" + github: "osterman" + - name: "Andriy Knysh" + github: "aknysh" + - name: "Igor Rodionov" + github: "goruha" diff --git a/autoscaling.tf b/autoscaling.tf new file mode 100644 index 0000000..caeadf3 --- /dev/null +++ b/autoscaling.tf @@ -0,0 +1,63 @@ +# https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/ec2-metricscollected.html + +locals { + autoscaling_enabled = "${var.enabled == "true" && var.autoscaling_policies_enabled == "true" ? true : false}" +} + +resource "aws_autoscaling_policy" "scale_up" { + count = "${local.autoscaling_enabled ? 1 : 0}" + name = "${module.label.id}${var.delimiter}scale${var.delimiter}up" + scaling_adjustment = "${var.scale_up_scaling_adjustment}" + adjustment_type = "${var.scale_up_adjustment_type}" + policy_type = "${var.scale_up_policy_type}" + cooldown = "${var.scale_up_cooldown_seconds}" + autoscaling_group_name = "${join("", aws_autoscaling_group.default.*.name)}" +} + +resource "aws_autoscaling_policy" "scale_down" { + count = "${local.autoscaling_enabled ? 1 : 0}" + name = "${module.label.id}${var.delimiter}scale${var.delimiter}down" + scaling_adjustment = "${var.scale_down_scaling_adjustment}" + adjustment_type = "${var.scale_down_adjustment_type}" + policy_type = "${var.scale_down_policy_type}" + cooldown = "${var.scale_down_cooldown_seconds}" + autoscaling_group_name = "${join("", aws_autoscaling_group.default.*.name)}" +} + +resource "aws_cloudwatch_metric_alarm" "cpu_high" { + count = "${local.autoscaling_enabled ? 1 : 0}" + alarm_name = "${module.label.id}${var.delimiter}cpu${var.delimiter}utilization${var.delimiter}high" + comparison_operator = "GreaterThanOrEqualToThreshold" + evaluation_periods = "${var.cpu_utilization_high_evaluation_periods}" + metric_name = "CPUUtilization" + namespace = "AWS/EC2" + period = "${var.cpu_utilization_high_period_seconds}" + statistic = "${var.cpu_utilization_high_statistic}" + threshold = "${var.cpu_utilization_high_threshold_percent}" + + dimensions { + AutoScalingGroupName = "${join("", aws_autoscaling_group.default.*.name)}" + } + + alarm_description = "Scale up if CPU utilization is above ${var.cpu_utilization_high_threshold_percent} for ${var.cpu_utilization_high_period_seconds} seconds" + alarm_actions = ["${join("", aws_autoscaling_policy.scale_up.*.arn)}"] +} + +resource "aws_cloudwatch_metric_alarm" "cpu_low" { + count = "${local.autoscaling_enabled ? 1 : 0}" + alarm_name = "${module.label.id}${var.delimiter}cpu${var.delimiter}utilization${var.delimiter}low" + comparison_operator = "LessThanOrEqualToThreshold" + evaluation_periods = "${var.cpu_utilization_low_evaluation_periods}" + metric_name = "CPUUtilization" + namespace = "AWS/EC2" + period = "${var.cpu_utilization_low_period_seconds}" + statistic = "${var.cpu_utilization_low_statistic}" + threshold = "${var.cpu_utilization_low_threshold_percent}" + + dimensions { + AutoScalingGroupName = "${join("", aws_autoscaling_group.default.*.name)}" + } + + alarm_description = "Scale down if the CPU utilization is below ${var.cpu_utilization_low_threshold_percent} for ${var.cpu_utilization_low_period_seconds} seconds" + alarm_actions = ["${join("", aws_autoscaling_policy.scale_down.*.arn)}"] +} diff --git a/docs/targets.md b/docs/targets.md new file mode 100644 index 0000000..3d4be2a --- /dev/null +++ b/docs/targets.md @@ -0,0 +1,10 @@ +## Makefile Targets +``` +Available targets: + + help Help screen + help/all Display help for all targets + help/short This help short screen + lint Lint terraform code + +``` diff --git a/docs/terraform.md b/docs/terraform.md new file mode 100644 index 0000000..3d4fc14 --- /dev/null +++ b/docs/terraform.md @@ -0,0 +1,83 @@ + +## Inputs + +| Name | Description | Type | Default | Required | +|------|-------------|:----:|:-----:|:-----:| +| associate_public_ip_address | Associate a public IP address with an instance in a VPC | string | `false` | no | +| attributes | Additional attributes (e.g. `1`) | list | `` | no | +| autoscaling_policies_enabled | Whether to create `aws_autoscaling_policy` and `aws_cloudwatch_metric_alarm` resources to control Auto Scaling | string | `true` | no | +| block_device_mappings | Specify volumes to attach to the instance besides the volumes specified by the AMI | list | `` | no | +| cpu_utilization_high_evaluation_periods | The number of periods over which data is compared to the specified threshold | string | `2` | no | +| cpu_utilization_high_period_seconds | The period in seconds over which the specified statistic is applied | string | `300` | no | +| cpu_utilization_high_statistic | The statistic to apply to the alarm's associated metric. Either of the following is supported: `SampleCount`, `Average`, `Sum`, `Minimum`, `Maximum` | string | `Average` | no | +| cpu_utilization_high_threshold_percent | The value against which the specified statistic is compared | string | `90` | no | +| cpu_utilization_low_evaluation_periods | The number of periods over which data is compared to the specified threshold | string | `2` | no | +| cpu_utilization_low_period_seconds | The period in seconds over which the specified statistic is applied | string | `300` | no | +| cpu_utilization_low_statistic | The statistic to apply to the alarm's associated metric. Either of the following is supported: `SampleCount`, `Average`, `Sum`, `Minimum`, `Maximum` | string | `Average` | no | +| cpu_utilization_low_threshold_percent | The value against which the specified statistic is compared | string | `10` | no | +| credit_specification | Customize the credit specification of the instances | list | `` | no | +| default_cooldown | The amount of time, in seconds, after a scaling activity completes before another scaling activity can start | string | `300` | no | +| delimiter | Delimiter to be used between `name`, `namespace`, `stage`, etc. | string | `-` | no | +| disable_api_termination | If `true`, enables EC2 Instance Termination Protection | string | `false` | no | +| ebs_optimized | If true, the launched EC2 instance will be EBS-optimized | string | `false` | no | +| elastic_gpu_specifications | Specifications of Elastic GPU to attach to the instances | list | `` | no | +| enable_monitoring | Enable/disable detailed monitoring | string | `true` | no | +| enabled | Whether to create the resources. Set to `false` to prevent the module from creating any resources | string | `true` | no | +| enabled_metrics | A list of metrics to collect. The allowed values are `GroupMinSize`, `GroupMaxSize`, `GroupDesiredCapacity`, `GroupInServiceInstances`, `GroupPendingInstances`, `GroupStandbyInstances`, `GroupTerminatingInstances`, `GroupTotalInstances` | list | `` | no | +| environment | Environment, e.g. 'testing', 'UAT' | string | `` | no | +| force_delete | Allows deleting the autoscaling group without waiting for all instances in the pool to terminate. You can force an autoscaling group to delete even if it's in the process of scaling a resource. Normally, Terraform drains all the instances before deleting the group. This bypasses that behavior and potentially leaves resources dangling | string | `false` | no | +| health_check_grace_period | Time (in seconds) after instance comes into service before checking health | string | `300` | no | +| health_check_type | Controls how health checking is done. Valid values are `EC2` or `ELB` | string | `EC2` | no | +| iam_instance_profile_name | The IAM instance profile name to associate with launched instances | string | `` | no | +| image_id | The EC2 image ID to launch | string | `` | no | +| instance_initiated_shutdown_behavior | Shutdown behavior for the instances. Can be `stop` or `terminate` | string | `terminate` | no | +| instance_market_options | The market (purchasing) option for the instances | list | `` | no | +| instance_type | Instance type to launch | string | - | yes | +| key_name | The SSH key name that should be used for the instance | string | `` | no | +| launch_template_version | Launch template version. Can be version number, `$Latest` or `$Default` | string | `$$Latest` | no | +| load_balancers | A list of elastic load balancer names to add to the autoscaling group names. Only valid for classic load balancers. For ALBs, use `target_group_arns` instead | list | `` | no | +| max_size | The maximum size of the autoscale group | string | - | yes | +| metrics_granularity | The granularity to associate with the metrics to collect. The only valid value is 1Minute | string | `1Minute` | no | +| min_elb_capacity | Setting this causes Terraform to wait for this number of instances to show up healthy in the ELB only on creation. Updates will not wait on ELB instance number changes | string | `0` | no | +| min_size | The minimum size of the autoscale group | string | - | yes | +| name | Solution name, e.g. 'app' or 'cluster' | string | `app` | no | +| namespace | Namespace, which could be your organization name, e.g. 'eg' or 'cp' | string | - | yes | +| placement | The placement specifications of the instances | list | `` | no | +| placement_group | The name of the placement group into which you'll launch your instances, if any | string | `` | no | +| protect_from_scale_in | Allows setting instance protection. The autoscaling group will not select instances with this setting for terminination during scale in events | string | `false` | no | +| scale_down_adjustment_type | Specifies whether the adjustment is an absolute number or a percentage of the current capacity. Valid values are `ChangeInCapacity`, `ExactCapacity` and `PercentChangeInCapacity` | string | `ChangeInCapacity` | no | +| scale_down_cooldown_seconds | The amount of time, in seconds, after a scaling activity completes and before the next scaling activity can start | string | `300` | no | +| scale_down_policy_type | The scalling policy type, either `SimpleScaling`, `StepScaling` or `TargetTrackingScaling` | string | `SimpleScaling` | no | +| scale_down_scaling_adjustment | The number of instances by which to scale. `scale_down_scaling_adjustment` determines the interpretation of this number (e.g. as an absolute number or as a percentage of the existing Auto Scaling group size). A positive increment adds to the current capacity and a negative value removes from the current capacity | string | `-1` | no | +| scale_up_adjustment_type | Specifies whether the adjustment is an absolute number or a percentage of the current capacity. Valid values are `ChangeInCapacity`, `ExactCapacity` and `PercentChangeInCapacity` | string | `ChangeInCapacity` | no | +| scale_up_cooldown_seconds | The amount of time, in seconds, after a scaling activity completes and before the next scaling activity can start | string | `300` | no | +| scale_up_policy_type | The scalling policy type, either `SimpleScaling`, `StepScaling` or `TargetTrackingScaling` | string | `SimpleScaling` | no | +| scale_up_scaling_adjustment | The number of instances by which to scale. `scale_up_adjustment_type` determines the interpretation of this number (e.g. as an absolute number or as a percentage of the existing Auto Scaling group size). A positive increment adds to the current capacity and a negative value removes from the current capacity | string | `1` | no | +| security_group_ids | A list of associated security group IDs | list | `` | no | +| service_linked_role_arn | The ARN of the service-linked role that the ASG will use to call other AWS services | string | `` | no | +| stage | Stage, e.g. 'prod', 'staging', 'dev', or 'test' | string | - | yes | +| subnet_ids | A list of subnet IDs to launch resources in | list | - | yes | +| suspended_processes | A list of processes to suspend for the AutoScaling Group. The allowed values are `Launch`, `Terminate`, `HealthCheck`, `ReplaceUnhealthy`, `AZRebalance`, `AlarmNotification`, `ScheduledActions`, `AddToLoadBalancer`. Note that if you suspend either the `Launch` or `Terminate` process types, it can prevent your autoscaling group from functioning properly. | list | `` | no | +| tags | Additional tags (e.g. `map('BusinessUnit`,`XYZ`) | map | `` | no | +| target_group_arns | A list of aws_alb_target_group ARNs, for use with Application Load Balancing | list | `` | no | +| termination_policies | A list of policies to decide how the instances in the auto scale group should be terminated. The allowed values are `OldestInstance`, `NewestInstance`, `OldestLaunchConfiguration`, `ClosestToNextInstanceHour`, `Default` | list | `` | no | +| user_data_base64 | The Base64-encoded user data to provide when launching the instances | string | `` | no | +| wait_for_capacity_timeout | A maximum duration that Terraform should wait for ASG instances to be healthy before timing out. (See also Waiting for Capacity below.) Setting this to '0' causes Terraform to skip all Capacity Waiting behavior | string | `10m` | no | +| wait_for_elb_capacity | Setting this will cause Terraform to wait for exactly this number of healthy instances in all attached load balancers on both create and update operations. Takes precedence over `min_elb_capacity` behavior | string | `false` | no | + +## Outputs + +| Name | Description | +|------|-------------| +| autoscaling_group_arn | The ARN for this AutoScaling Group | +| autoscaling_group_default_cooldown | Time between a scaling activity and the succeeding scaling activity | +| autoscaling_group_desired_capacity | The number of Amazon EC2 instances that should be running in the group | +| autoscaling_group_health_check_grace_period | Time after instance comes into service before checking health | +| autoscaling_group_health_check_type | `EC2` or `ELB`. Controls how health checking is done | +| autoscaling_group_id | The autoscaling group id | +| autoscaling_group_max_size | The maximum size of the autoscale group | +| autoscaling_group_min_size | The minimum size of the autoscale group | +| autoscaling_group_name | The autoscaling group name | +| launch_template_arn | The ARN of the launch template | +| launch_template_id | The ID of the launch template | + diff --git a/examples/complete/main.tf b/examples/complete/main.tf new file mode 100644 index 0000000..651a65e --- /dev/null +++ b/examples/complete/main.tf @@ -0,0 +1,40 @@ +locals { + userdata = < /home/ec2-user/.ssh/config + Host * + StrictHostKeyChecking no + __EOF__ + chmod 600 /home/ec2-user/.ssh/config + chown ec2-user:ec2-user /home/ec2-user/.ssh/config + USERDATA +} + +module "autoscale_group" { + source = "git::https://github.com/cloudposse/terraform-aws-ec2-autoscale-group.git?ref=master" + + namespace = "eg" + stage = "dev" + name = "test" + + image_id = "ami-08cab282f9979fc7a" + instance_type = "t2.small" + security_group_ids = ["sg-xxxxxxxx"] + subnet_ids = ["subnet-xxxxxxxx", "subnet-yyyyyyyy", "subnet-zzzzzzzz"] + health_check_type = "EC2" + min_size = 2 + max_size = 3 + wait_for_capacity_timeout = "5m" + associate_public_ip_address = true + user_data_base64 = "${base64encode(local.userdata)}" + + tags = { + Tier = "1" + KubernetesCluster = "us-west-2.testing.cloudposse.co" + } + + # Auto-scaling policies and CloudWatch metric alarms + autoscaling_policies_enabled = "true" + cpu_utilization_high_threshold_percent = "70" + cpu_utilization_low_threshold_percent = "20" +} diff --git a/examples/complete/outputs.tf b/examples/complete/outputs.tf new file mode 100644 index 0000000..a0668e9 --- /dev/null +++ b/examples/complete/outputs.tf @@ -0,0 +1,54 @@ +output "launch_template_id" { + description = "The ID of the launch template" + value = "${module.autoscale_group.launch_template_id}" +} + +output "launch_template_arn" { + description = "The ARN of the launch template" + value = "${module.autoscale_group.launch_template_arn}" +} + +output "autoscaling_group_id" { + description = "The autoscaling group id" + value = "${module.autoscale_group.autoscaling_group_id}" +} + +output "autoscaling_group_name" { + description = "The autoscaling group name" + value = "${module.autoscale_group.autoscaling_group_name}" +} + +output "autoscaling_group_arn" { + description = "The ARN for this AutoScaling Group" + value = "${module.autoscale_group.autoscaling_group_arn}" +} + +output "autoscaling_group_min_size" { + description = "The minimum size of the autoscale group" + value = "${module.autoscale_group.autoscaling_group_min_size}" +} + +output "autoscaling_group_max_size" { + description = "The maximum size of the autoscale group" + value = "${module.autoscale_group.autoscaling_group_max_size}" +} + +output "autoscaling_group_desired_capacity" { + description = "The number of Amazon EC2 instances that should be running in the group" + value = "${module.autoscale_group.autoscaling_group_desired_capacity}" +} + +output "autoscaling_group_default_cooldown" { + description = "Time between a scaling activity and the succeeding scaling activity" + value = "${module.autoscale_group.autoscaling_group_default_cooldown}" +} + +output "autoscaling_group_health_check_grace_period" { + description = "Time after instance comes into service before checking health" + value = "${module.autoscale_group.autoscaling_group_health_check_grace_period}" +} + +output "autoscaling_group_health_check_type" { + description = "`EC2` or `ELB`. Controls how health checking is done" + value = "${module.autoscale_group.autoscaling_group_health_check_type}" +} diff --git a/main.tf b/main.tf new file mode 100644 index 0000000..4d52359 --- /dev/null +++ b/main.tf @@ -0,0 +1,95 @@ +module "label" { + source = "git::https://github.com/cloudposse/terraform-null-label.git?ref=tags/0.5.3" + namespace = "${var.namespace}" + name = "${var.name}" + stage = "${var.stage}" + environment = "${var.environment}" + delimiter = "${var.delimiter}" + attributes = "${var.attributes}" + tags = "${var.tags}" + + additional_tag_map = { + propagate_at_launch = true + } +} + +resource "aws_launch_template" "default" { + count = "${var.enabled == "true" ? 1 : 0}" + + name_prefix = "${format("%s%s", module.label.id, var.delimiter)}" + block_device_mappings = ["${var.block_device_mappings}"] + credit_specification = ["${var.credit_specification}"] + disable_api_termination = "${var.disable_api_termination}" + ebs_optimized = "${var.ebs_optimized}" + elastic_gpu_specifications = ["${var.elastic_gpu_specifications}"] + image_id = "${var.image_id}" + instance_initiated_shutdown_behavior = "${var.instance_initiated_shutdown_behavior}" + instance_market_options = ["${var.instance_market_options }"] + instance_type = "${var.instance_type}" + key_name = "${var.key_name}" + placement = ["${var.placement}"] + user_data = "${var.user_data_base64}" + vpc_security_group_ids = ["${var.security_group_ids}"] + + iam_instance_profile { + name = "${var.iam_instance_profile_name}" + } + + monitoring { + enabled = "${var.enable_monitoring}" + } + + network_interfaces { + associate_public_ip_address = "${var.associate_public_ip_address}" + } + + tag_specifications { + resource_type = "volume" + tags = "${module.label.tags}" + } + + tag_specifications { + resource_type = "instance" + tags = "${module.label.tags}" + } + + lifecycle { + create_before_destroy = true + } +} + +resource "aws_autoscaling_group" "default" { + count = "${var.enabled == "true" ? 1 : 0}" + + name_prefix = "${format("%s%s", module.label.id, var.delimiter)}" + vpc_zone_identifier = ["${var.subnet_ids}"] + max_size = "${var.max_size}" + min_size = "${var.min_size}" + load_balancers = ["${var.load_balancers}"] + health_check_grace_period = "${var.health_check_grace_period}" + health_check_type = "${var.health_check_type}" + min_elb_capacity = "${var.min_elb_capacity}" + wait_for_elb_capacity = "${var.wait_for_elb_capacity}" + target_group_arns = ["${var.target_group_arns}"] + default_cooldown = "${var.default_cooldown}" + force_delete = "${var.force_delete}" + termination_policies = "${var.termination_policies}" + suspended_processes = "${var.suspended_processes}" + placement_group = "${var.placement_group}" + enabled_metrics = ["${var.enabled_metrics}"] + metrics_granularity = "${var.metrics_granularity}" + wait_for_capacity_timeout = "${var.wait_for_capacity_timeout}" + protect_from_scale_in = "${var.protect_from_scale_in}" + service_linked_role_arn = "${var.service_linked_role_arn}" + + launch_template = { + id = "${join("", aws_launch_template.default.*.id)}" + version = "${var.launch_template_version}" + } + + tags = ["${module.label.tags_as_list_of_maps}"] + + lifecycle { + create_before_destroy = true + } +} diff --git a/outputs.tf b/outputs.tf new file mode 100644 index 0000000..ed7dfe7 --- /dev/null +++ b/outputs.tf @@ -0,0 +1,54 @@ +output "launch_template_id" { + description = "The ID of the launch template" + value = "${join("", aws_launch_template.default.*.id)}" +} + +output "launch_template_arn" { + description = "The ARN of the launch template" + value = "${join("", aws_launch_template.default.*.arn)}" +} + +output "autoscaling_group_id" { + description = "The autoscaling group id" + value = "${join("", aws_autoscaling_group.default.*.id)}" +} + +output "autoscaling_group_name" { + description = "The autoscaling group name" + value = "${join("", aws_autoscaling_group.default.*.name)}" +} + +output "autoscaling_group_arn" { + description = "The ARN for this AutoScaling Group" + value = "${join("", aws_autoscaling_group.default.*.arn)}" +} + +output "autoscaling_group_min_size" { + description = "The minimum size of the autoscale group" + value = "${join("", aws_autoscaling_group.default.*.min_size)}" +} + +output "autoscaling_group_max_size" { + description = "The maximum size of the autoscale group" + value = "${join("", aws_autoscaling_group.default.*.max_size)}" +} + +output "autoscaling_group_desired_capacity" { + description = "The number of Amazon EC2 instances that should be running in the group" + value = "${join("", aws_autoscaling_group.default.*.desired_capacity)}" +} + +output "autoscaling_group_default_cooldown" { + description = "Time between a scaling activity and the succeeding scaling activity" + value = "${join("", aws_autoscaling_group.default.*.default_cooldown)}" +} + +output "autoscaling_group_health_check_grace_period" { + description = "Time after instance comes into service before checking health" + value = "${join("", aws_autoscaling_group.default.*.health_check_grace_period)}" +} + +output "autoscaling_group_health_check_type" { + description = "`EC2` or `ELB`. Controls how health checking is done" + value = "${join("", aws_autoscaling_group.default.*.health_check_type)}" +} diff --git a/variables.tf b/variables.tf new file mode 100644 index 0000000..a3835dd --- /dev/null +++ b/variables.tf @@ -0,0 +1,355 @@ +variable "namespace" { + type = "string" + description = "Namespace, which could be your organization name, e.g. 'eg' or 'cp'" +} + +variable "stage" { + type = "string" + description = "Stage, e.g. 'prod', 'staging', 'dev', or 'test'" +} + +variable "environment" { + type = "string" + default = "" + description = "Environment, e.g. 'testing', 'UAT'" +} + +variable "name" { + type = "string" + default = "app" + description = "Solution name, e.g. 'app' or 'cluster'" +} + +variable "delimiter" { + type = "string" + default = "-" + description = "Delimiter to be used between `name`, `namespace`, `stage`, etc." +} + +variable "attributes" { + type = "list" + default = [] + description = "Additional attributes (e.g. `1`)" +} + +variable "tags" { + type = "map" + default = {} + description = "Additional tags (e.g. `map('BusinessUnit`,`XYZ`)" +} + +variable "enabled" { + type = "string" + description = "Whether to create the resources. Set to `false` to prevent the module from creating any resources" + default = "true" +} + +variable "image_id" { + type = "string" + description = "The EC2 image ID to launch" + default = "" +} + +variable "instance_initiated_shutdown_behavior" { + type = "string" + description = "Shutdown behavior for the instances. Can be `stop` or `terminate`" + default = "terminate" +} + +variable "instance_type" { + type = "string" + description = "Instance type to launch" +} + +variable "iam_instance_profile_name" { + type = "string" + description = "The IAM instance profile name to associate with launched instances" + default = "" +} + +variable "key_name" { + type = "string" + description = "The SSH key name that should be used for the instance" + default = "" +} + +variable "security_group_ids" { + description = "A list of associated security group IDs" + type = "list" + default = [] +} + +variable "launch_template_version" { + type = "string" + description = "Launch template version. Can be version number, `$Latest` or `$Default`" + default = "$$Latest" +} + +variable "associate_public_ip_address" { + description = "Associate a public IP address with an instance in a VPC" + default = false +} + +variable "user_data_base64" { + type = "string" + description = "The Base64-encoded user data to provide when launching the instances" + default = "" +} + +variable "enable_monitoring" { + description = "Enable/disable detailed monitoring" + default = true +} + +variable "ebs_optimized" { + description = "If true, the launched EC2 instance will be EBS-optimized" + default = false +} + +variable "block_device_mappings" { + description = "Specify volumes to attach to the instance besides the volumes specified by the AMI" + type = "list" + default = [] +} + +variable "instance_market_options" { + description = "The market (purchasing) option for the instances" + type = "list" + default = [] +} + +variable "placement" { + description = "The placement specifications of the instances" + type = "list" + default = [] +} + +variable "credit_specification" { + description = "Customize the credit specification of the instances" + type = "list" + default = [] +} + +variable "elastic_gpu_specifications" { + description = "Specifications of Elastic GPU to attach to the instances" + type = "list" + default = [] +} + +variable "disable_api_termination" { + description = "If `true`, enables EC2 Instance Termination Protection" + default = false +} + +variable "max_size" { + description = "The maximum size of the autoscale group" +} + +variable "min_size" { + description = "The minimum size of the autoscale group" +} + +variable "subnet_ids" { + description = "A list of subnet IDs to launch resources in" + type = "list" +} + +variable "default_cooldown" { + description = "The amount of time, in seconds, after a scaling activity completes before another scaling activity can start" + default = 300 +} + +variable "health_check_grace_period" { + description = "Time (in seconds) after instance comes into service before checking health" + default = 300 +} + +variable "health_check_type" { + type = "string" + description = "Controls how health checking is done. Valid values are `EC2` or `ELB`" + default = "EC2" +} + +variable "force_delete" { + description = "Allows deleting the autoscaling group without waiting for all instances in the pool to terminate. You can force an autoscaling group to delete even if it's in the process of scaling a resource. Normally, Terraform drains all the instances before deleting the group. This bypasses that behavior and potentially leaves resources dangling" + default = false +} + +variable "load_balancers" { + type = "list" + description = "A list of elastic load balancer names to add to the autoscaling group names. Only valid for classic load balancers. For ALBs, use `target_group_arns` instead" + default = [] +} + +variable "target_group_arns" { + type = "list" + description = "A list of aws_alb_target_group ARNs, for use with Application Load Balancing" + default = [] +} + +variable "termination_policies" { + description = "A list of policies to decide how the instances in the auto scale group should be terminated. The allowed values are `OldestInstance`, `NewestInstance`, `OldestLaunchConfiguration`, `ClosestToNextInstanceHour`, `Default`" + type = "list" + default = ["Default"] +} + +variable "suspended_processes" { + type = "list" + description = "A list of processes to suspend for the AutoScaling Group. The allowed values are `Launch`, `Terminate`, `HealthCheck`, `ReplaceUnhealthy`, `AZRebalance`, `AlarmNotification`, `ScheduledActions`, `AddToLoadBalancer`. Note that if you suspend either the `Launch` or `Terminate` process types, it can prevent your autoscaling group from functioning properly." + default = [] +} + +variable "placement_group" { + type = "string" + description = "The name of the placement group into which you'll launch your instances, if any" + default = "" +} + +variable "metrics_granularity" { + type = "string" + description = "The granularity to associate with the metrics to collect. The only valid value is 1Minute" + default = "1Minute" +} + +variable "enabled_metrics" { + description = "A list of metrics to collect. The allowed values are `GroupMinSize`, `GroupMaxSize`, `GroupDesiredCapacity`, `GroupInServiceInstances`, `GroupPendingInstances`, `GroupStandbyInstances`, `GroupTerminatingInstances`, `GroupTotalInstances`" + type = "list" + + default = [ + "GroupMinSize", + "GroupMaxSize", + "GroupDesiredCapacity", + "GroupInServiceInstances", + "GroupPendingInstances", + "GroupStandbyInstances", + "GroupTerminatingInstances", + "GroupTotalInstances", + ] +} + +variable "wait_for_capacity_timeout" { + type = "string" + description = "A maximum duration that Terraform should wait for ASG instances to be healthy before timing out. (See also Waiting for Capacity below.) Setting this to '0' causes Terraform to skip all Capacity Waiting behavior" + default = "10m" +} + +variable "min_elb_capacity" { + description = "Setting this causes Terraform to wait for this number of instances to show up healthy in the ELB only on creation. Updates will not wait on ELB instance number changes" + default = 0 +} + +variable "wait_for_elb_capacity" { + description = "Setting this will cause Terraform to wait for exactly this number of healthy instances in all attached load balancers on both create and update operations. Takes precedence over `min_elb_capacity` behavior" + default = false +} + +variable "protect_from_scale_in" { + description = "Allows setting instance protection. The autoscaling group will not select instances with this setting for terminination during scale in events" + default = false +} + +variable "service_linked_role_arn" { + type = "string" + description = "The ARN of the service-linked role that the ASG will use to call other AWS services" + default = "" +} + +variable "autoscaling_policies_enabled" { + type = "string" + default = "true" + description = "Whether to create `aws_autoscaling_policy` and `aws_cloudwatch_metric_alarm` resources to control Auto Scaling" +} + +variable "scale_up_cooldown_seconds" { + type = "string" + default = "300" + description = "The amount of time, in seconds, after a scaling activity completes and before the next scaling activity can start" +} + +variable "scale_up_scaling_adjustment" { + default = 1 + description = "The number of instances by which to scale. `scale_up_adjustment_type` determines the interpretation of this number (e.g. as an absolute number or as a percentage of the existing Auto Scaling group size). A positive increment adds to the current capacity and a negative value removes from the current capacity" +} + +variable "scale_up_adjustment_type" { + type = "string" + default = "ChangeInCapacity" + description = "Specifies whether the adjustment is an absolute number or a percentage of the current capacity. Valid values are `ChangeInCapacity`, `ExactCapacity` and `PercentChangeInCapacity`" +} + +variable "scale_up_policy_type" { + type = "string" + default = "SimpleScaling" + description = "The scalling policy type, either `SimpleScaling`, `StepScaling` or `TargetTrackingScaling`" +} + +variable "scale_down_cooldown_seconds" { + type = "string" + default = "300" + description = "The amount of time, in seconds, after a scaling activity completes and before the next scaling activity can start" +} + +variable "scale_down_scaling_adjustment" { + default = -1 + description = "The number of instances by which to scale. `scale_down_scaling_adjustment` determines the interpretation of this number (e.g. as an absolute number or as a percentage of the existing Auto Scaling group size). A positive increment adds to the current capacity and a negative value removes from the current capacity" +} + +variable "scale_down_adjustment_type" { + type = "string" + default = "ChangeInCapacity" + description = "Specifies whether the adjustment is an absolute number or a percentage of the current capacity. Valid values are `ChangeInCapacity`, `ExactCapacity` and `PercentChangeInCapacity`" +} + +variable "scale_down_policy_type" { + type = "string" + default = "SimpleScaling" + description = "The scalling policy type, either `SimpleScaling`, `StepScaling` or `TargetTrackingScaling`" +} + +variable "cpu_utilization_high_evaluation_periods" { + type = "string" + default = "2" + description = "The number of periods over which data is compared to the specified threshold" +} + +variable "cpu_utilization_high_period_seconds" { + type = "string" + default = "300" + description = "The period in seconds over which the specified statistic is applied" +} + +variable "cpu_utilization_high_threshold_percent" { + type = "string" + default = "90" + description = "The value against which the specified statistic is compared" +} + +variable "cpu_utilization_high_statistic" { + type = "string" + default = "Average" + description = "The statistic to apply to the alarm's associated metric. Either of the following is supported: `SampleCount`, `Average`, `Sum`, `Minimum`, `Maximum`" +} + +variable "cpu_utilization_low_evaluation_periods" { + type = "string" + default = "2" + description = "The number of periods over which data is compared to the specified threshold" +} + +variable "cpu_utilization_low_period_seconds" { + type = "string" + default = "300" + description = "The period in seconds over which the specified statistic is applied" +} + +variable "cpu_utilization_low_threshold_percent" { + type = "string" + default = "10" + description = "The value against which the specified statistic is compared" +} + +variable "cpu_utilization_low_statistic" { + type = "string" + default = "Average" + description = "The statistic to apply to the alarm's associated metric. Either of the following is supported: `SampleCount`, `Average`, `Sum`, `Minimum`, `Maximum`" +}