T101-4주차(도전과제) [Terraform 101 Study]

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

}
위로 스크롤