4. 모듈로 재사용 가능한 인프라 구성

모듈 기본

실습. 기존 webserver-cluster 모듈화

1. stage/services/webserver-cluster에서 terraform destroy를 실행하여 정리

2. module이라는 새 최상위 폴더 생성

3. stage/services/webserver-cluster의 모든 파일을 module/services/webserver-cluster로
	 이동
	 
4. module/services/webserver-cluster에서 main.tf 파일을 열고 공급자 정의를 제거
   공깁자는 재사용이 가능한 모듈이 아닌 루트 모듈에서만 구성
module/services/webserver-cluster/main.tf - 수정된 부부만
---------------------------------------------------------
resource "aws_launch_configuration" "example" {
    image_id      = "ami-08943a151bd468f4e" 
    instance_type = "t3.micro"
    security_groups = [aws_security_group.instance.id]
    user_data = templatefile("${path.module}/user-data.sh", {
      server_port = var.server_port
      db_address = data.terraform_remote_state.db.outputs.address
      db_port = data.terraform_remote_state.db.outputs.port
    })
    lifecycle {
      create_before_destroy = true
    }    
}

data "terraform_remote_state" "db" {
    backend = "s3"
    config = {
      bucket = var.db_remote_state_bucket
      key =  var.db_remote_state_key
      region = "ap-northeast-2"
  }
}

module/services/webserver-cluster/variables.tf
----------------------------------------------
variable "cluster_name" {
    description = "The name to use for all the cluster resources"
    type = string
}
variable "db_remote_state_bucket" {
    description = "The name of the S3 bucket for the database's remote state"
    type = string
}
variable "db_remote_state_key" {
    description = "The path for the database's remote state in S3"
    type = string
}

stage/services/webserver-cluster/root.tf
----------------------------------------
provider "aws" {
    region = "ap-northeast-2"
}
module "webserver_cluster" {
    // 해당 디렉토리의 tf 파일을 참조
    source = "../../../modules/services/webserver-cluster"
    cluster_name = "webservers-stage"
    db_remote_state_bucket = "ttteeesssttt123123123"
    db_remote_state_key = "stage/data-stores/mysql/terraform.tfstate"
}

실행
----
cd stage/services/webserver-cluster

terraform init
terraform apply

image.png

동작 구조
---------
modules에서 resource별 로(vpc,ec2,sg 등) main.tf, variables.tf 등 정의하고
해당 메인 디렉토리의 root.tf에서 source="" 로 지정해서 여러 resource 한 번에 실행

5. 제어문과 무중단 배포

루프

count

기본적인 반복 구성
-----------------
resource "aws_iam_user" "example" {
	count = 3
	name = "neo.${count.index}"
}
=>
neo.1, neo.2, neo.3 생성
count.index 사용
- terraform 내장 함수와 결합 시 루프의 반복을 더 맞춤 설정 가능
-------------------------------------------------------------
variables "user_names" {
	description = "Create Iam user"
	type = list(string)
	default = ["neo", "trintiy", "morpheus"]
}

resource "aws_iam_user" "example" {
	count = length(var.user_names)
	name = var.user_names[count.index]
}
=>
var.user_names[0] == neo
var.user_names[1] == trintiy
var.user_names[2] == morpheus