Browse Source

initial

master
art.dambrine 4 years ago
commit
b4b9ea7543
  1. 22
      .gitignore
  2. 10
      .pre-commit-config.yaml
  3. 84
      README.md
  4. 0
      alb.tf
  5. 0
      asg.tf
  6. BIN
      docs/1-alb.png
  7. BIN
      docs/2-alb-asg.png
  8. BIN
      docs/3-alb-asg-monitoring.png
  9. 8
      main.tf
  10. 1
      outputs.tf
  11. 1
      variables.tf

22
.gitignore

@ -0,0 +1,22 @@
# Created by https://www.gitignore.io/api/terraform
### Terraform ###
# Local .terraform directories
**/.terraform/*
# .tfstate files
*.tfstate
*.tfstate.*
# Crash log files
crash.log
# Ignore any .tfvars files that are generated automatically for each Terraform run. Most
# .tfvars files are managed as part of configuration and so should be included in
# version control.
#
*.tfvars
# End of https://www.gitignore.io/api/terraform

10
.pre-commit-config.yaml

@ -0,0 +1,10 @@
repos:
- repo: git://github.com/antonbabenko/pre-commit-terraform
sha: v1.7.3
hooks:
- id: terraform_fmt
- repo: git://github.com/pre-commit/pre-commit-hooks
sha: v1.4.0
hooks:
- id: check-merge-conflict

84
README.md

@ -0,0 +1,84 @@
# Terraform AWS Autoscaling
## :triangular_ruler: Naming Convention
Common variables referenced in naming standards
| Variable | RegExp | Example |
|:----------------------|:--------------------------------|:------------------------------------------------------------|
| `<availability_zone>` | `[a-z]{2}-[a-z]{1,}-[1-2][a-f]` | `us-east-1a`, `us-west-2c`, `eu-west-1a`, `ap-northeast-1c` |
---
## :triangular_ruler: AWS - Resource Naming Standards
* ALB
| AWS Resource | Resource Naming | Comment | Example |
|:--------------------|:-------------------------|:---------------------|:----------------------------------------|
| ALB | `<app_name>-alb-private` | Tag `Tier = private` | `web-api-alb-private` |
| | `<app_name>-alb-public` | Tag `Tier = public` | `web-api-alb-public` |
| ALB Target group | `<app_name>-<protocol>` | | `web-api-alb-http`, `web-api-alb-https` |
| ALB Security Groups | `<app_name>-alb` | | `web-api-alb` |
* ASG
| AWS Resource | Resource Naming | Comment | Example |
|:--------------------|:----------------------------|:--------|:------------------------|
| ASG Security Groups | `<app_name>` | | `web-api` |
| ASG Launch Config | `<app_name>-lc-<timestamp>` | | `web-api-lc-1537774225` |
| ASG Launch Template | `<app_name>-lt-<timestamp>` | | `web-api-lt-1537774225` |
---
## :crystal_ball: Terraform Discovery module
If you followed the naming conventions listed in [terraform-aws-vpc](https://github.com/Lowess/terraform-aws-vpc) you will find it useful to use this [terraform-aws-discovery](https://github.com/Lowess/terraform-aws-discovery) module. The idea of using a discovery module is to centralize `datasource` usage in a central place and keep the source code DRY.
Here is an example usage:
```hcl
module "discovery" {
source = "github.com/Lowess/terraform-aws-discovery"
aws_region = var.aws_region
vpc_name = var.vpc_name
ec2_ami_names = ["<AMI-NAME>"]
ec2_ami_owners = "<TEACHER-ACCOUNT-ID>"
ec2_security_groups = [...]
}
```
> :point_up: If you do not what to use this module you are free to redefine the datasources you need but keep in mind that you will be rebuilding the wheel :ferris_wheel:
---
## 1. Create an `AWS ALB`
Let's create an `ALB` and the related resources needed (security groups, listeners and target groups).
* [aws_lb](https://www.terraform.io/docs/providers/aws/r/lb.html)
* [aws_lb_target_group](https://www.terraform.io/docs/providers/aws/r/lb_target_group.html)
* [aws_lb_listener](https://www.terraform.io/docs/providers/aws/r/lb_listener.html)
* [aws_security_group](https://www.terraform.io/docs/providers/aws/r/security_group.html)
* [aws_security_group_rule](https://www.terraform.io/docs/providers/aws/r/security_group_rule.html)
![ALB](./docs/1-alb.png)
## 2. Create the `AWS Autoscaling group`
* [aws_security_group](https://www.terraform.io/docs/providers/aws/r/security_group.html)
* [aws_security_group_rule](https://www.terraform.io/docs/providers/aws/r/security_group_rule.html)
* [aws_launch_template](https://www.terraform.io/docs/providers/aws/r/launch_template.html)
* [aws_autoscaling_group](https://www.terraform.io/docs/providers/aws/r/autoscaling_group.html)
![ALB & ASG](./docs/2-alb-asg.png)
## 3. Create policies to make the `AWS Autoscaling group` scale in/out
* Visit the `Cloudwatch` service and discover what this service does
> :point_up: Think about what's the best metric to use in order to adjust the size of the Autoscaling group
* [aws_autoscaling_policy](https://registry.terraform.io/providers/hashicorp/aws/latest/docs/resources/autoscaling_policy)

0
alb.tf

0
asg.tf

BIN
docs/1-alb.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

BIN
docs/2-alb-asg.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 42 KiB

BIN
docs/3-alb-asg-monitoring.png

Binary file not shown.

After

Width:  |  Height:  |  Size: 52 KiB

8
main.tf

@ -0,0 +1,8 @@
### Provider definition
provider "aws" {
region = "${var.aws_region}"
}
### Module Main

1
outputs.tf

@ -0,0 +1 @@

1
variables.tf

@ -0,0 +1 @@
Loading…
Cancel
Save