From 3739bb36e7a42c0cf6495a456d1b440aaf969055 Mon Sep 17 00:00:00 2001 From: Kaito Date: Mon, 24 Jul 2023 01:01:59 +0400 Subject: [PATCH 1/2] add terragrunt, add multi env support --- .gitignore | 5 +- .terraform.lock.hcl | 93 ------------------------------- Dockerfile | 8 ++- Makefile | 16 ++++++ backend.tf | 10 ++++ common/.terraform.lock.hcl | 25 +++++++++ common/backend.tf | 10 ++++ common/main.tf | 0 common/terragrunt.hcl | 24 ++++++++ common/variables.tf | 3 + versions.tf => common/versions.tf | 3 +- main.tf | 22 -------- outputs.tf | 3 - staging/main.tf | 0 terraform.tfvars | 5 -- terragrunt.hcl | 28 ++++++++++ variables.tf | 24 -------- 17 files changed, 126 insertions(+), 153 deletions(-) create mode 100644 Makefile create mode 100644 backend.tf create mode 100644 common/.terraform.lock.hcl create mode 100644 common/backend.tf create mode 100644 common/main.tf create mode 100644 common/terragrunt.hcl create mode 100644 common/variables.tf rename versions.tf => common/versions.tf (99%) delete mode 100644 main.tf delete mode 100644 outputs.tf create mode 100644 staging/main.tf delete mode 100644 terraform.tfvars create mode 100644 terragrunt.hcl delete mode 100644 variables.tf diff --git a/.gitignore b/.gitignore index 0543edb..0c082f9 100644 --- a/.gitignore +++ b/.gitignore @@ -1,4 +1,7 @@ **/.terraform .vscode ssh_keys -*.tfstate* \ No newline at end of file +*.tfstate* +*tfvars* +.aws +secrets.tfvars \ No newline at end of file diff --git a/.terraform.lock.hcl b/.terraform.lock.hcl index 0e6cac4..6e7e533 100644 --- a/.terraform.lock.hcl +++ b/.terraform.lock.hcl @@ -1,95 +1,2 @@ # This file is maintained automatically by "terraform init". # Manual edits may be lost in future updates. - -provider "registry.terraform.io/hashicorp/aws" { - version = "3.76.1" - constraints = "~> 3.38" - hashes = [ - "h1:5WSHHV9CgBvZ0rDDDxLnNHsjDfm4knb7ihJ2AIGB58A=", - "h1:nrYpq9ne3FNUmjekbc0ayKE7wNu7BaMpV7oSC+qjAC4=", - "zh:1cf933104a641ffdb64d71a76806f4df35d19101b47e0eb02c9c36bd64bfdd2d", - "zh:273afaf908775ade6c9d32462938e7739ee8b00a0de2ef3cdddc5bc115bb1d4f", - "zh:2bc24ae989e38f575de034083082c69b41c54b8df69d35728853257c400ce0f4", - "zh:53ba88dbdaf9f818d35001c3d519a787f457283d9341f562dc3d0af51fd9606e", - "zh:5cdac7afea68bbd89d3bdb345d99470226482eff41f375f220fe338d2e5808da", - "zh:63127808890ac4be6cff6554985510b15ac715df698d550a3e722722dc56523c", - "zh:97a1237791f15373743189b078a0e0f2fa4dd7d7474077423376cd186312dc55", - "zh:9b12af85486a96aedd8d7984b0ff811a4b42e3d88dad1a3fb4c0b580d04fa425", - "zh:a4f625e97e5f25073c08080e4a619f959bc0149fc853a6b1b49ab41d58b59665", - "zh:b56cca54019237941f7614e8d2712586a6ab3092e8e9492c70f06563259171e9", - "zh:d4bc33bfd6ac78fb61e6d48a61c179907dfdbdf149b89fb97272c663989a7fcd", - "zh:e0089d73fa56d128c574601305634a774eebacf4a84babba71da10040cecf99a", - "zh:e957531f1d92a6474c9b02bd9200da91b99ba07a0ab761c8e3176400dd41721c", - "zh:eceb85818d57d8270db4df7564cf4ed51b5c650a361aaa017c42227158e1946b", - "zh:f565e5caa1b349ec404c6d03d01c68b02233f5485ed038d0aab810dd4023a880", - ] -} - -provider "registry.terraform.io/hashicorp/local" { - version = "2.4.0" - hashes = [ - "h1:R97FTYETo88sT2VHfMgkPU3lzCsZLunPftjSI5vfKe8=", - "zh:53604cd29cb92538668fe09565c739358dc53ca56f9f11312b9d7de81e48fab9", - "zh:66a46e9c508716a1c98efbf793092f03d50049fa4a83cd6b2251e9a06aca2acf", - "zh:70a6f6a852dd83768d0778ce9817d81d4b3f073fab8fa570bff92dcb0824f732", - "zh:78d5eefdd9e494defcb3c68d282b8f96630502cac21d1ea161f53cfe9bb483b3", - "zh:82a803f2f484c8b766e2e9c32343e9c89b91997b9f8d2697f9f3837f62926b35", - "zh:9708a4e40d6cc4b8afd1352e5186e6e1502f6ae599867c120967aebe9d90ed04", - "zh:973f65ce0d67c585f4ec250c1e634c9b22d9c4288b484ee2a871d7fa1e317406", - "zh:c8fa0f98f9316e4cfef082aa9b785ba16e36ff754d6aba8b456dab9500e671c6", - "zh:cfa5342a5f5188b20db246c73ac823918c189468e1382cb3c48a9c0c08fc5bf7", - "zh:e0e2b477c7e899c63b06b38cd8684a893d834d6d0b5e9b033cedc06dd7ffe9e2", - "zh:f62d7d05ea1ee566f732505200ab38d94315a4add27947a60afa29860822d3fc", - "zh:fa7ce69dde358e172bd719014ad637634bbdabc49363104f4fca759b4b73f2ce", - ] -} - -provider "registry.terraform.io/hashicorp/tls" { - version = "4.0.4" - hashes = [ - "h1:pe9vq86dZZKCm+8k1RhzARwENslF3SXb9ErHbQfgjXU=", - "zh:23671ed83e1fcf79745534841e10291bbf34046b27d6e68a5d0aab77206f4a55", - "zh:45292421211ffd9e8e3eb3655677700e3c5047f71d8f7650d2ce30242335f848", - "zh:59fedb519f4433c0fdb1d58b27c210b27415fddd0cd73c5312530b4309c088be", - "zh:5a8eec2409a9ff7cd0758a9d818c74bcba92a240e6c5e54b99df68fff312bbd5", - "zh:5e6a4b39f3171f53292ab88058a59e64825f2b842760a4869e64dc1dc093d1fe", - "zh:810547d0bf9311d21c81cc306126d3547e7bd3f194fc295836acf164b9f8424e", - "zh:824a5f3617624243bed0259d7dd37d76017097dc3193dac669be342b90b2ab48", - "zh:9361ccc7048be5dcbc2fafe2d8216939765b3160bd52734f7a9fd917a39ecbd8", - "zh:aa02ea625aaf672e649296bce7580f62d724268189fe9ad7c1b36bb0fa12fa60", - "zh:c71b4cd40d6ec7815dfeefd57d88bc592c0c42f5e5858dcc88245d371b4b8b1e", - "zh:dabcd52f36b43d250a3d71ad7abfa07b5622c69068d989e60b79b2bb4f220316", - "zh:f569b65999264a9416862bca5cd2a6177d94ccb0424f3a4ef424428912b9cb3c", - ] -} - -provider "registry.terraform.io/kreuzwerker/docker" { - version = "2.11.0" - constraints = "2.11.0" - hashes = [ - "h1:2BuPcSQY9DSRhPufzrbiGyMW2NX1qqXkH1KfzrMUQmU=", - "zh:1b9d93385cc0329467725ce90affc76a361bc23384a7358431e6ee281ae323de", - "zh:21a327746cdad2abfc22df3d72eb9b36134bb7daeb72b2a52112adfd3a39555a", - "zh:31ed477f429686015271188b03e89bfc400b74eea9e83956ea4cc16018b561f3", - "zh:4302d65b5cbedbe42cf35094748058aea44f75dd7ec2b257330b5f60a2521def", - "zh:43f53e3e29070dfec0621915d0a5266c386f7416f6a719531b7c55924cefd280", - "zh:4bf7704bf46868edd834991f350aa6204c72397be1e1a784278391bb911e29f5", - "zh:503434ddf9c801aa9a9e47e76b6b5758dd4583a49f7ac373066430b37b3efcaf", - "zh:67410f9ed6503692121519b81e13cf5274ceadb5566bf2ec2dc0a6e43c700621", - "zh:c0fd724ed8da52375976c3595a2a6748bf28c07ec881ad7154e657ab5c38f25b", - "zh:cbe762d96c4ae61c42d8c02c047954b52a6567b214a0263345135baf249accd7", - "zh:d3a23b086199d4a2a63707f28c0da8b392d8d11281c6881d85a959e76626fb7e", - ] -} - -provider "registry.terraform.io/poseidon/ct" { - version = "0.8.0" - constraints = "0.8.0" - hashes = [ - "h1:lh82ZqChuYXkZF3vhGas86JoGYfzXDss1dBu+Y6pUn4=", - "zh:50cd14b2edf141f6f55eece7a3469d79f4bcb835c1a46fe750972b21a7111059", - "zh:62af7f256976bab1c077175af52c18087710f277aff156ea504bda57ff0f1c8e", - "zh:9ab73eaacfef1e81973a1b7d4054ccc23b87c6d12d874080b336a351a9a9ac71", - "zh:c3efc500fdf84f9ea121d92818ea03e2b8f30ed62e9acfceff5e20de17bb00ef", - ] -} diff --git a/Dockerfile b/Dockerfile index f675aaa..6d891d1 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -FROM hashicorp/terraform:1.1.3 +FROM alpine/terragrunt:1.1.3 RUN apk update && apk upgrade RUN apk add bash groff openssh git vim jq make curl @@ -15,9 +15,11 @@ RUN apk -v --update add \ rm /var/cache/apk/* RUN mkdir -p /infra + +ENV PS1 '\[\033[1;37m\]($(echo `terraform workspace show`)) \[\033[1;33m\]\u \[\033[1;36m\]\h \[\033[1;34m\]\w\[\033[0;35m\] \[\033[1;36m\]# \[\033[0m\]' + WORKDIR /infra -RUN echo 'alias t=terraform' > ~/.bashrc && \ - terraform -install-autocomplete +RUN echo 'alias t=terragrunt' > ~/.bashrc ENTRYPOINT "bash" \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..4884c49 --- /dev/null +++ b/Makefile @@ -0,0 +1,16 @@ +WORKSPACE := $(shell terraform workspace show) +BUCKET := $(shell cat backend.tf | grep bucket | awk '{print $$3}') + +ifeq ($(WORKSPACE),default) + REMOTE_TFVARS_PATH := "s3://$(BUCKET)/terraform.tfvars" + LOCAL_TFVARS_PATH := "../tfvars/terraform.tfvars" +else + REMOTE_TFVARS_PATH := "s3://$(BUCKET)/env:/$(WORKSPACE)/terraform.tfvars" + LOCAL_TFVARS_PATH := "tfvars/$(WORKSPACE)/terraform.tfvars" +endif + +push_vars: + aws s3 cp --sse="AES256" $(LOCAL_TFVARS_PATH) $(REMOTE_TFVARS_PATH) + +pull_vars: + aws s3 cp --sse="AES256" $(REMOTE_TFVARS_PATH) $(LOCAL_TFVARS_PATH) \ No newline at end of file diff --git a/backend.tf b/backend.tf new file mode 100644 index 0000000..c2864c6 --- /dev/null +++ b/backend.tf @@ -0,0 +1,10 @@ +# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa +terraform { + backend "s3" { + bucket = "infra-by-terragrunt-tf" + dynamodb_table = "infra-by-terragrunt-lock" + encrypt = true + key = "terraform.tfstate" + region = "us-east-1" + } +} diff --git a/common/.terraform.lock.hcl b/common/.terraform.lock.hcl new file mode 100644 index 0000000..0a0d0fc --- /dev/null +++ b/common/.terraform.lock.hcl @@ -0,0 +1,25 @@ +# This file is maintained automatically by "terraform init". +# Manual edits may be lost in future updates. + +provider "registry.terraform.io/hashicorp/aws" { + version = "3.76.1" + constraints = "~> 3.38" + hashes = [ + "h1:5WSHHV9CgBvZ0rDDDxLnNHsjDfm4knb7ihJ2AIGB58A=", + "zh:1cf933104a641ffdb64d71a76806f4df35d19101b47e0eb02c9c36bd64bfdd2d", + "zh:273afaf908775ade6c9d32462938e7739ee8b00a0de2ef3cdddc5bc115bb1d4f", + "zh:2bc24ae989e38f575de034083082c69b41c54b8df69d35728853257c400ce0f4", + "zh:53ba88dbdaf9f818d35001c3d519a787f457283d9341f562dc3d0af51fd9606e", + "zh:5cdac7afea68bbd89d3bdb345d99470226482eff41f375f220fe338d2e5808da", + "zh:63127808890ac4be6cff6554985510b15ac715df698d550a3e722722dc56523c", + "zh:97a1237791f15373743189b078a0e0f2fa4dd7d7474077423376cd186312dc55", + "zh:9b12af85486a96aedd8d7984b0ff811a4b42e3d88dad1a3fb4c0b580d04fa425", + "zh:a4f625e97e5f25073c08080e4a619f959bc0149fc853a6b1b49ab41d58b59665", + "zh:b56cca54019237941f7614e8d2712586a6ab3092e8e9492c70f06563259171e9", + "zh:d4bc33bfd6ac78fb61e6d48a61c179907dfdbdf149b89fb97272c663989a7fcd", + "zh:e0089d73fa56d128c574601305634a774eebacf4a84babba71da10040cecf99a", + "zh:e957531f1d92a6474c9b02bd9200da91b99ba07a0ab761c8e3176400dd41721c", + "zh:eceb85818d57d8270db4df7564cf4ed51b5c650a361aaa017c42227158e1946b", + "zh:f565e5caa1b349ec404c6d03d01c68b02233f5485ed038d0aab810dd4023a880", + ] +} diff --git a/common/backend.tf b/common/backend.tf new file mode 100644 index 0000000..c2864c6 --- /dev/null +++ b/common/backend.tf @@ -0,0 +1,10 @@ +# Generated by Terragrunt. Sig: nIlQXj57tbuaRZEa +terraform { + backend "s3" { + bucket = "infra-by-terragrunt-tf" + dynamodb_table = "infra-by-terragrunt-lock" + encrypt = true + key = "terraform.tfstate" + region = "us-east-1" + } +} diff --git a/common/main.tf b/common/main.tf new file mode 100644 index 0000000..e69de29 diff --git a/common/terragrunt.hcl b/common/terragrunt.hcl new file mode 100644 index 0000000..5057da9 --- /dev/null +++ b/common/terragrunt.hcl @@ -0,0 +1,24 @@ +locals { + region = "us-east-1" + project = "infra-by-terragrunt" +} + +inputs = { + region = local.region + project = local.project +} + +remote_state { + backend = "s3" + generate = { + path = "backend.tf" + if_exists = "overwrite_terragrunt" + } + config = { + bucket = "${local.project}-tf" + key = "terraform.tfstate" + region = local.region + encrypt = true + dynamodb_table = "${local.project}-lock" + } +} \ No newline at end of file diff --git a/common/variables.tf b/common/variables.tf new file mode 100644 index 0000000..9777d65 --- /dev/null +++ b/common/variables.tf @@ -0,0 +1,3 @@ +variable "region" { + description = "the AWS region in which resources are created, you must set the availability_zones variable as well if you define this value to something other than the default" +} \ No newline at end of file diff --git a/versions.tf b/common/versions.tf similarity index 99% rename from versions.tf rename to common/versions.tf index 9d44a6a..ddac9b9 100644 --- a/versions.tf +++ b/common/versions.tf @@ -1,12 +1,11 @@ terraform { - required_version = ">= 0.15.3" - required_providers { aws = { source = "hashicorp/aws" version = "~> 3.38" } } + required_version = ">= 0.15.3" } provider "aws" { diff --git a/main.tf b/main.tf deleted file mode 100644 index 023d7df..0000000 --- a/main.tf +++ /dev/null @@ -1,22 +0,0 @@ -module "application" { - source = "./modules/application" - host = "ssh://${var.instance_user}@${module.instance.public_ip}:22" - image = var.image -} - -module "instance" { - source = "./modules/instance" - instance_ami = var.instance_ami - user = var.instance_user - ssh_key = module.ssh.public_key_openssh - ec2_sg_id = module.networking.ec2_sg_id -} - -module "networking" { - source = "./modules/networking" -} - -module "ssh" { - source = "./modules/ssh" - env = var.env -} \ No newline at end of file diff --git a/outputs.tf b/outputs.tf deleted file mode 100644 index 3caa2db..0000000 --- a/outputs.tf +++ /dev/null @@ -1,3 +0,0 @@ -output "public_ip" { - value = module.instance.public_ip -} diff --git a/staging/main.tf b/staging/main.tf new file mode 100644 index 0000000..e69de29 diff --git a/terraform.tfvars b/terraform.tfvars deleted file mode 100644 index 385891f..0000000 --- a/terraform.tfvars +++ /dev/null @@ -1,5 +0,0 @@ -region = "us-east-1" -instance_ami = "ami-09e2e5104f310ffb5" -instance_user = "core" -image = "kaitoendo/ping-pong:latest" -env = "staging" \ No newline at end of file diff --git a/terragrunt.hcl b/terragrunt.hcl new file mode 100644 index 0000000..19e69bf --- /dev/null +++ b/terragrunt.hcl @@ -0,0 +1,28 @@ +locals { + workspace = run_cmd("--terragrunt-quiet", "terraform", "workspace", "show") + common = read_terragrunt_config("common/terragrunt.hcl") +} + +inputs = { + region = local.common.inputs.region + project = local.common.inputs.project + environment = local.workspace +} + +remote_state = local.common.remote_state + +terraform { + extra_arguments "conditional_vars" { + commands = get_terraform_commands_that_need_vars() + + required_var_files = [ + "tfvars/${local.workspace}/terraform.tfvars" + ] + } + + after_hook "upload_vars" { + commands = ["apply"] + execute = ["make", "push_vars"] + run_on_error = false + } +} \ No newline at end of file diff --git a/variables.tf b/variables.tf deleted file mode 100644 index e46a945..0000000 --- a/variables.tf +++ /dev/null @@ -1,24 +0,0 @@ -variable "region" { - description = "aws region" - type = string -} - -variable "instance_ami" { - description = "AWS AMI" - type = string -} - -variable "instance_user" { - description = "instance user" - type = string -} - -variable "image" { - description = "container image you will run on the instance" - type = string -} - -variable "env" { - description = "environment" - type = string -} \ No newline at end of file From 82ea4be0e46bafc872a481bfc036dfc3fa54d0eb Mon Sep 17 00:00:00 2001 From: Kaito Date: Mon, 24 Jul 2023 21:39:52 +0400 Subject: [PATCH 2/2] remove redundant code --- staging/main.tf | 0 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 staging/main.tf diff --git a/staging/main.tf b/staging/main.tf deleted file mode 100644 index e69de29..0000000