Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Initial implementation #3

Merged
merged 9 commits into from
Sep 14, 2018
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,3 +7,9 @@

# .tfvars files
*.tfvars

**/.idea
**/*.iml

**/.build-harness
**/build-harness
16 changes: 16 additions & 0 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -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
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
Expand Up @@ -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.
Expand Down
10 changes: 10 additions & 0 deletions Makefile
Original file line number Diff line number Diff line change
@@ -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
298 changes: 296 additions & 2 deletions README.md

Large diffs are not rendered by default.

111 changes: 111 additions & 0 deletions README.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,111 @@
---
#
# 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 Configuration](https://www.terraform.io/docs/providers/aws/r/launch_configuration.html) on AWS.

__NOTE:__ By default, the module will create an Auto Scaling Group and a Launch Configuration and bind them together.
If you want to provide an external Launch Configuration, set the variable `launch_configuration_enabled` to `"false"` and provide the existing Launch Configuration name in the variable `launch_configuration`.

# How to use this project
usage: |-

```hcl
provider "aws" {
region = "us-west-2"
}

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_groups = ["sg-xxxxxxxx"]
subnet_ids = ["subnet-xxxxxxxx", "subnet-yyyyyyyy", "subnet-zzzzzzzz"]
health_check_type = "EC2"
min_size = 1
max_size = 3
desired_capacity = 2
wait_for_capacity_timeout = "5m"
associate_public_ip_address = true

root_block_device = [
{
volume_type = "gp2"
volume_size = "20"
delete_on_termination = true
},
]

ebs_block_device = [
{
device_name = "/dev/xvdd"
volume_type = "gp2"
volume_size = "100"
delete_on_termination = true
},
]
}
```

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"
10 changes: 10 additions & 0 deletions docs/targets.md
Original file line number Diff line number Diff line change
@@ -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

```
66 changes: 66 additions & 0 deletions docs/terraform.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,66 @@

## 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 | `<list>` | no |
| autoscaling_group_enabled | Whether to create autoscaling group | string | `true` | 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 |
| desired_capacity | The number of Amazon EC2 instances that should be running in the group | string | - | yes |
| ebs_block_device | Additional EBS block devices to attach to the instance | list | `<list>` | no |
| ebs_optimized | If true, the launched EC2 instance will be EBS-optimized | string | `false` | no |
| enable_monitoring | Enables/disables detailed monitoring. This is enabled by default. | string | `true` | no |
| enabled_metrics | A list of metrics to collect. The allowed values are GroupMinSize, GroupMaxSize, GroupDesiredCapacity, GroupInServiceInstances, GroupPendingInstances, GroupStandbyInstances, GroupTerminatingInstances, GroupTotalInstances | list | `<list>` | no |
| environment | Environment, e.g. 'testing', 'UAT' | string | `` | no |
| ephemeral_block_device | Customize Ephemeral (also known as 'Instance Store') volumes on the instance | list | `<list>` | 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 | The IAM instance profile to associate with launched instances | string | `` | no |
| image_id | The EC2 image ID to launch | string | `` | no |
| instance_type | Instance type to launch | string | `` | no |
| key_name | The SSH key name that should be used for the instance | string | `` | no |
| launch_configuration | The name of the existing launch configuration to use | string | `` | no |
| launch_configuration_enabled | Whether to create launch configuration | string | `true` | 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 | `<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_group | The name of the placement group into which you'll launch your instances, if any | string | `` | no |
| placement_tenancy | The tenancy of the instance. Valid values are 'default' or 'dedicated' | string | `default` | 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 |
| root_block_device | Customize details about the root block device of the instance | list | `<list>` | no |
| security_groups | A list of associated security group IDs | list | `<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 |
| spot_price | The price to use for reserving spot instances | 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 | `<list>` | no |
| tags | Additional tags (e.g. `map('BusinessUnit`,`XYZ`) | map | `<map>` | no |
| target_group_arns | A list of aws_alb_target_group ARNs, for use with Application Load Balancing | list | `<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 | `<list>` | no |
| user_data_base64 | Used to pass base64-encoded binary data to the EC2 instances. For example, gzip-encoded user data must be base64-encoded and passed via this argument to avoid corruption | 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_configuration_id | The ID of the launch configuration |
| launch_configuration_name | The name of the launch configuration |

39 changes: 39 additions & 0 deletions examples/complete/main.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
provider "aws" {
region = "us-west-2"
}

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_groups = ["sg-xxxxxxxx"]
subnet_ids = ["subnet-xxxxxxxx", "subnet-yyyyyyyy", "subnet-zzzzzzzz"]
health_check_type = "EC2"
min_size = 1
max_size = 3
desired_capacity = 2
wait_for_capacity_timeout = "5m"
associate_public_ip_address = true

root_block_device = [
{
volume_type = "gp2"
volume_size = "20"
delete_on_termination = true
},
]

ebs_block_device = [
{
device_name = "/dev/xvdd"
volume_type = "gp2"
volume_size = "100"
delete_on_termination = true
},
]
}
54 changes: 54 additions & 0 deletions examples/complete/outputs.tf
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
output "launch_configuration_id" {
description = "The ID of the launch configuration"
value = "${module.autoscale_group.launch_configuration_id}"
}

output "launch_configuration_name" {
description = "The name of the launch configuration"
value = "${module.autoscale_group.launch_configuration_name}"
}

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}"
}
Loading