cloudNet@ 팀의 가시다 님이 진행하는 테라폼 102 스터디 입니다. (테라폼으로 시작하는 IaC” (한빛미디어) 도서로 진행!)
- 사용하기 편리한 리소스를 모듈화 해보고, 해당 모듈을 활용해서 반복 리소스들 배포
- 먼저 구조는 아래와 같습니다.
- 자식모듈 경로: alb-mod
- root 모듈 경로: alb
- ALB 생성하는 모듈 입니다 [외부]
#alb-mod 경로입니다.
# main.tf 입니다
# ALB에 대한 보안 그룹 생성
resource "aws_security_group" "alb_sg" {
name = "${var.lb_name}-sg"
description = "ALB security group"
vpc_id = var.vpc_id
}
# 보안 그룹에 HTTP(80)를 허용하는 규칙 추가
resource "aws_security_group_rule" "allow_http" {
#aws_security_group 리소스와 aws_security_group_rule 리소스가 동일한 보안 그룹연길 및 규칙이 적용
security_group_id = aws_security_group.alb_sg.id
#인바운드
type = "ingress"
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
# ALB 생성
resource "aws_lb" "alb-test" {
name = var.lb_name
#ALB를 외부 인터넷에 공개
internal = false
load_balancer_type = "application"
security_groups = [aws_security_group.alb_sg.id]
subnets = var.subnets
}
# ALB에 대한 리스너 생성
resource "aws_lb_listener" "http" {
load_balancer_arn = aws_lb.alb-test.arn
port = 80
protocol = "HTTP"
default_action {
#리스너가 받은 요청을 특정 타겟 그룹으로 전달(forward)하도록 설정
type = "forward"
target_group_arn = aws_lb_target_group.example.arn
}
}
# ALB에 대한 타겟 그룹 생성
resource "aws_lb_target_group" "example" {
name = "${var.lb_name}-tg"
port = 80
protocol = "HTTP"
vpc_id = var.vpc_id
}
#alb-mod 경로입니다.
# variables.tf 입니다
variable "lb_name" {
description = "ALB Name"
type = string
}
variable "vpc_id" {
description = "VPC ID "
type = string
}
variable "subnets" {
description = "Subnets-ALB"
type = list(string)
}
#alb-mod 경로입니다.
# outputs.tf 입니다
# 생성된 ALB의 ARN 출력
output "alb_arn" {
description = "ALB-arn"
value = aws_lb.alb-test.arn
}
# 생성된 ALB와 연결된 보안 그룹 ID 출력
output "alb_sg_id" {
description = "ALB-sg"
value = aws_security_group.alb_sg.id
}
# alb경로 입니다
# main.tf 입니다.
#root 모듈 입니다.
module "example_alb" {
source = "/home/minho/alb/alb-mod"
lb_name = "test-alb"
vpc_id = "vpc-0985ac2957c66cdf8"
subnets = ["subnet-099c1ab612038fa73", "subnet-0094ec830a1dda66a"]
}
- 테라폼 레지스트리에 공개된 모듈을 사용하여 리소스를 배포
- Terraform Rgistery에 공개된 VPC 모듈을 사용하여 리소스를 만들었습니다.
#variables.tf 파일을 생성하고 모듈에서 사용할 변수들을 추가하여 줍니다.
--------------------------------------------------------------------
# 가용 영역(Availability Zones)을 정의하는 변수
variable "azs" {
type = list(string)
default = ["ap-northeast-2a", "ap-northeast-2b", "ap-northeast-2c"]
}
# 퍼블릭 서브넷을 정의하는 변수
variable "public_subnets" {
type = list(string)
description = "List - public subnets"
default = ["100.30.1.0/24", "100.30.3.0/24", "100.30.5.0/24"]
}
# 프라이빗 서브넷을 정의하는 변수
variable "private_subnets" {
type = list(string)
description = "List - private subnets"
default = ["100.30.2.0/24", "100.30.4.0/24", "100.30.6.0/24"]
}
# VPC 태그 변수를 선언합니다.
variable "vpc_tag" {
# 변수의 타입을 map(string)으로 설정합니다. 각 키-값 쌍은 문자열을 포함합니다.
type = map(string)
# 변수의 설명을 추가합니다. 여기서 vpc_tag의 값은 EC2 태그 값임을 설명합니다.
description = "value of ec2 tag"
# 변수의 기본값을 정의합니다. key-value 맵 형식으로 설정되어 있습니다.
default = {
"Owner" = "Gril"
"Purpose" = "SBX"
"Environment" = "Dev"
}
}
main.tf 생성합니다
----------------------------------------------
module "vpc" {
# 사용할 모듈을 지정
source = "terraform-aws-modules/vpc/aws"
# 모듈의 VPC 이름을 지정
name = "gril-module-vpc"
# 모듈의 CIDR 블록을 지정
cidr = "100.30.0.0/16"
# 변수 내용을 참고하여 모듈에 전달할 인자를 지정
azs = var.azs
private_subnets = var.public_subnets
public_subnets = var.private_subnets
create_database_subnet_group = false
# DNS HOST, DHCP 활성화
enable_dns_hostnames = true
enable_dns_support = true
enable_dhcp_options = true
# 단일 NAT GATEWAY 활성화
enable_nat_gateway = true
single_nat_gateway = true
enable_vpn_gateway = false
# 변수 내용을 참고하여 모듈에 전달할 인자를 지정
tags = var.vpc_tag
}