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

동작 구조
---------
modules에서 resource별 로(vpc,ec2,sg 등) main.tf, variables.tf 등 정의하고
해당 메인 디렉토리의 root.tf에서 source="" 로 지정해서 여러 resource 한 번에 실행
각각 약간 다른 시나리오에서 사용하도록 고안된 여러 가지 루프 구성
* 자원과 모듈을 반복하기 위한 count 매개변수
* for_each 표현식, 리소스, 리소스 내의 인라인 블록 및 모듈을 반복
* 표현식의 경우 목록과 맵을 반복
* 문자열 지시문의 경우 문자열 내의 목록과 맵을 반복
기본적인 반복 구성
-----------------
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