commit b4b9ea75432e3ff6ea4aec29e35e8f89ac27cc36 Author: art.dambrine <art.dambrine@gmail.com> Date: Wed Feb 10 09:16:52 2021 +0100 initial diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..60d079c --- /dev/null +++ b/.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 diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000..0b4d412 --- /dev/null +++ b/.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 diff --git a/README.md b/README.md new file mode 100644 index 0000000..f30e1b6 --- /dev/null +++ b/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) + + + +## 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) + + + +## 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) + diff --git a/alb.tf b/alb.tf new file mode 100644 index 0000000..e69de29 diff --git a/asg.tf b/asg.tf new file mode 100644 index 0000000..e69de29 diff --git a/docs/1-alb.png b/docs/1-alb.png new file mode 100644 index 0000000..a951012 Binary files /dev/null and b/docs/1-alb.png differ diff --git a/docs/2-alb-asg.png b/docs/2-alb-asg.png new file mode 100644 index 0000000..ed0faff Binary files /dev/null and b/docs/2-alb-asg.png differ diff --git a/docs/3-alb-asg-monitoring.png b/docs/3-alb-asg-monitoring.png new file mode 100644 index 0000000..3ba621c Binary files /dev/null and b/docs/3-alb-asg-monitoring.png differ diff --git a/main.tf b/main.tf new file mode 100644 index 0000000..abb1899 --- /dev/null +++ b/main.tf @@ -0,0 +1,8 @@ +### Provider definition + +provider "aws" { + region = "${var.aws_region}" +} + +### Module Main + diff --git a/outputs.tf b/outputs.tf new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/outputs.tf @@ -0,0 +1 @@ + diff --git a/variables.tf b/variables.tf new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/variables.tf @@ -0,0 +1 @@ +