호랑이한테물릴래

Terraform Full Stack 어플리케이션 구성 예시 본문

DevOps/sprint_project

Terraform Full Stack 어플리케이션 구성 예시

호랑이한테물릴래 2022. 6. 28. 11:52
반응형

Provider

Infrastructure의 타입으로 AWS, GCP, Azure 말한다.

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.16"
    }
  }
}

provider "aws" {
  region = "ap-northeast-2"
}

VPC

사용자의 AWS 계정 전용 가상 네트워크

  • VPC를 일정 범위(ip 주소범위)로 나눔
  • 라우트 테이블에 연결됨
resource "aws_vpc" "vpc" {
  cidr_block = "10.0.0.0/16"

  tags = {
    Name = "test_sprint-vpc"
  }
}

Gateway

VPC에서 호스팅하는 리소스와 인터넷 간의 통신을 가능하게 해주는 AWS 컴포넌트

resource "aws_internet_gateway" "testIGW" {
  vpc_id = aws_vpc.vpc.id
  tags = {
    "Name" = "testIGW"
  }
}

Route Table

IP 주소에 트래픽 라우팅 경로를 정의하여 Subnet 트래픽의 라우팅 경로 설정

resource "aws_route_table" "testPublicRTb" {
  vpc_id = aws_vpc.vpc.id


  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.testIGW.id
  }

  tags = {
    "Name" = "test-public-rtb"
  }
}

resource "aws_route_table" "testPrivateRTb" {
  vpc_id = aws_vpc.vpc.id
  tags = {
    "Name" = "test-private-rtb"
  }
}
resource "aws_route_table_association" "publicRTbAssociation01" {
  subnet_id      = aws_subnet.publicSubnet1.id
  route_table_id = aws_route_table.testPublicRTb.id
}

resource "aws_route_table_association" "publicRTbAssociation02" {
  subnet_id      = aws_subnet.publicSubnet2.id
  route_table_id = aws_route_table.testPublicRTb.id
}

resource "aws_route_table_association" "privateRTbAssociation01" {
  subnet_id      = aws_subnet.privateSubnet1.id
  route_table_id = aws_route_table.testPrivateRTb.id
}

resource "aws_route_table_association" "privateRTbAssociation02" {
  subnet_id      = aws_subnet.privateSubnet2.id
  route_table_id = aws_route_table.testPrivateRTb.id
}

AutoScaling Group

AutoScailing은 EC2 인스턴스를 자동으로 생성하고 삭제해주는 AWS 서비스다.

# AutoScaling 그룹에 시작되는 새 시작 구성설정
resource "aws_launch_configuration" "web" { 
  name              		  = "abc"
  image_id                    = "ami-063db2954fe2eec9f" //AMI 이름
  instance_type               = "t2.micro" // 인스턴스 타입
  security_groups             = [aws_security_group.publicSG01.id]
  key_name                    = "key"
  associate_public_ip_address = true // 공개 IP주소를 VPC 인스턴스와 연결

  user_data = <<-EOF
		#!/bin/bash
		echo "Hello, World" > index.html
		nohup busybox httpd -f -p 8080 &
		EOF

  lifecycle {
    create_before_destroy = true
  }
}

# AWS AutoScaling Group 생성
resource "aws_autoscaling_group" "tf-asg" {
  name                      = "autoscaling_group"
  max_size                  = 5 // Auto Scaling Group 최대크기
  min_size                  = 2 // Auto Scaling Group 최소크기
  health_check_grace_period = 300 // 서비스 시작한 후, 상태 확인하기 까지의 대기시간
  health_check_type         = "EC2" // 상태 확인 수행되는 방식 설정
  desired_capacity          = 3 // 그룹에서 실행해야 하는 EC2 인스턴스 수
  force_delete              = true // 풀의 모든 인스턴스가 종료될 때까지 기다리지 않고 그룹 삭제가능
  target_group_arns         = [aws_alb_target_group.terra-tg.arn] 
  launch_configuration      = aws_launch_configuration.web.name // 시작 구성 지정
  vpc_zone_identifier       = [aws_subnet.publicSubnet1.id, aws_subnet.publicSubnet2.id] // 사용 Subnet 설정
}

 

Application Load Balancer

# create alb
resource "aws_alb" "terra-alb" {
  name                             = "terra-alb"
  internal                         = false
  load_balancer_type               = "application"
  security_groups                  = [aws_security_group.publicSG01.id]
  subnets                          = [aws_subnet.publicSubnet1.id, aws_subnet.publicSubnet2.id]
  enable_cross_zone_load_balancing = true

  tags = {
    Environment = "production"
  }
}

# create target group
resource "aws_alb_target_group" "terra-tg" {
  name     = "terraform-ec2-tg"
  port     = 8080
  protocol = "HTTP"
  vpc_id   = aws_vpc.vpc.id
}

# create alb listner
resource "aws_alb_listener" "listner-alb" {
  load_balancer_arn = aws_alb.terra-alb.arn
  port              = 80
  protocol          = "HTTP"

  default_action {
    target_group_arn = aws_alb_target_group.terra-tg.arn
    type             = "forward"
  }
}

RDS

# create RDS
resource "aws_db_subnet_group" "testSubnetGroup" {
  name = "test"
  subnet_ids = [
    aws_subnet.privateSubnet1.id,
    aws_subnet.privateSubnet2.id
  ]
  tags = {
    "Name" = "test-subnet-group"
  }
}

resource "aws_db_instance" "testDB-rds" {
  allocated_storage      = 20
  max_allocated_storage  = 50
  availability_zone      = "ap-northeast-2a"
  db_subnet_group_name   = aws_db_subnet_group.testSubnetGroup.name
  engine                 = "mysql"
  engine_version         = "8.0.28"
  instance_class         = "db.t2.micro"
  skip_final_snapshot    = true
  identifier             = "test-mysql"
  username               = "root"
  password               = "12341234"
  name                   = "abcrdsjh"
  port                   = "3306"
  vpc_security_group_ids = [aws_security_group.privateSG01.id]
}

Subnet

라우팅 테이블에 연결한게 무엇이냐에 따라서 Public과 Private가 결정된다. 

  • Public Subnet -> Route-table -> IGW
  • Pirvate Subnet -> Route-table -> NAT
resource "aws_subnet" "publicSubnet1" {
  vpc_id            = aws_vpc.vpc.id
  cidr_block        = "10.0.0.0/24"
  availability_zone = "ap-northeast-2a"
  tags = {
    "Name" = "test-public-subnet-01"
  }
}

resource "aws_subnet" "publicSubnet2" {
  vpc_id            = aws_vpc.vpc.id
  cidr_block        = "10.0.1.0/24"
  availability_zone = "ap-northeast-2c"
  tags = {
    "Name" = "test-public-subnet-02"
  }
}

resource "aws_subnet" "privateSubnet1" {
  vpc_id            = aws_vpc.vpc.id
  cidr_block        = "10.0.4.0/24"
  availability_zone = "ap-northeast-2a"
  tags = {
    "Name" = "test-private-subnet-01"
  }
}

resource "aws_subnet" "privateSubnet2" {
  vpc_id            = aws_vpc.vpc.id
  cidr_block        = "10.0.5.0/24"
  availability_zone = "ap-northeast-2c"
  tags = {
    "Name" = "test-private-subnet-02"
  }
}

NAT

프라이빗 서브넷의 인스턴스가 인터넷에 연결, 인터넷에서 원치않는 인바운드 연결 수신하지 않는다.

  • 위치 : Public Subnet
  • 연결 : Private Subnet
  • EIP 생성이 필요.
  • 생성과 삭제에 시간이 많이 소요된다.

 

 

반응형

'DevOps > sprint_project' 카테고리의 다른 글

Final_project Day 5  (0) 2022.07.29
Final_project Day 4  (0) 2022.07.28
Final_project Day 3  (0) 2022.07.27
Final_project Day 2  (0) 2022.07.26
재고관리 시스템 Serverless 구현  (0) 2022.07.09
0 Comments
댓글쓰기 폼