본문 바로가기

카카오테크 부트캠프

[KTB] 프로젝트 시작을 위한 Terraform 코드 작성 + RDS란 뭔가..?

Terraform이란?

IaC(Infra ac Code)의 도구로 코드로 만들어 인프라를 구성해주는 것입니다. 항상 인스턴스, 보안그룹, 서브넷 등을 손으로 하나하나 만들어 연결하다 terraform을 쓰니... 정말 신세계더군요. terraform apply 명령어 하나로 서버를 자동으로 만들어주는 아주 편리하고 신비로운 도구입니다.

 

이번 카테부 프로젝트에서 제가 담당한 클라우드 분야는 terraform을 이용해서 서버를 구축하려고 합니다! 그래서 테라폼에 대해 좀 더 공부하고 코드를 작성하는 활동을 해보려고 해요.

 

실습할 때 사용했던 terraform코드를 한 번 보여드리겠습니다.

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

variable "instance_count" {
  default = 2
}

variable "instance_type" {
  default = "t2.micro"
}

resource "aws_vpc" "main" {
  cidr_block = "192.168.0.0/16"

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

resource "aws_subnet" "main" {
  vpc_id            = aws_vpc.main.id
  cidr_block        = "192.168.1.0/24"
  availability_zone = "ap-northeast-2a"
  map_public_ip_on_launch = true

  tags = {
    Name = "main-subnet"
  }
}

resource "aws_internet_gateway" "main" {
  vpc_id = aws_vpc.main.id

  tags = {
    Name = "main-igw"
  }
}

resource "aws_route_table" "main" {
  vpc_id = aws_vpc.main.id

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

  tags = {
    Name = "main-route-table"
  }
}

resource "aws_route_table_association" "main" {
  subnet_id      = aws_subnet.main.id
  route_table_id = aws_route_table.main.id
}

resource "aws_security_group" "main" {
  vpc_id = aws_vpc.main.id

  ingress {
    from_port   = 22
    to_port     = 22
    protocol    = "tcp"
    cidr_blocks = ["0.0.0.0/0"]
  }

  egress {
    from_port   = 0
    to_port     = 0
    protocol    = "-1"
    cidr_blocks = ["0.0.0.0/0"]
  }

  tags = {
    Name = "main-sg"
  }
}

resource "aws_instance" "web" {
  count         = var.instance_count
  ami           = "ami-04ea5b2d3c8ceccf8"
  instance_type = var.instance_type
  key_name      = "<ssh 키 이름>"
  subnet_id     = aws_subnet.main.id
  vpc_security_group_ids = [aws_security_group.main.id]

  tags = {
    Name = "WebServer-${count.index}"
  }
}

output "instance_ips" {
  value = aws_instance.web.*.public_ip
}

사용할 디렉토리에 main.tf로 이 파일을 만들어 두고 

terraform init : 테라폼을 실행하기 전 설정을 해주는 명령어

terraform plan : 실행 후 결과를 미리 알려줌

terraform apply : 실제로 적용해주는 명령어

terraform destroy : 설정한 인프라를 모두 삭제

destroy를 제외한 명령어들을 입력해주면 실제로 저는 provider를 aws라고 했기 때문에 aws에 인스턴스, vpc 등과 같은 인프라가 구축됩니다.

 

provider

terraform이 사용할 클라우드 공급자

 

variable

재사용 가능한 변수 선언으로 instance_count는 EC2 인스턴스의 수를 정의하고, instance_type EC2 인스턴스 유형을 지정

 

resource

생성하는 것!

vpc, 서브넷 등 생성할 RDS같은 경우도 resource를 이용해 만들 수 있다.

 

자세한 테라폼 코드들은 gpt에게 말하면 아주 잘 작성해주는 것 같습니다. 코드를 작성하고 plan을 사용해 시험해보고 apply하면 될 듯!

https://sonit.tistory.com/13

 

[Terraform] 테라폼 기본 사용법 - AWS 인프라를 코드로 관리하기

클라우드 인프라 관리는 많은 기업과 조직에게 중요한 과제 중 하나입니다. 이를 효율적으로 관리하고 자동화하기 위해 Terraform이라는 도구가 많이 사용되고 있습니다. 이번 블로그에서는 Terrafo

sonit.tistory.com

테라폼 참고 사이트

 

 

 

RDS에 대한 궁금증! RDS가 뭔데

스프링부트를 활용해 프로젝트 한 적 있지만 RDS가 뭔지 잘 모른채 사용했었습니다. 그냥 원격 DB라고만 생각하고 서버에 올리기 위해서는 원격 DB를 써야겠지 하고 썼는데 구글링과 GPT의 도움을 받아보았습니다. 구글링은 제 고민을 잘 해결해주지 못하더라고요.. 아무래도 아무것도 모르는 질문이니..

 

그런결과! 

 

RDS는 데이터베이스 인프라를 자동으로 관리해준다고 합니다! 사실 DB인프라에 대해 그렇게 자세하게 구축한 적은 없어서 이 장점이 잘 와닿지는 않는데 소프트웨어 업데이트, 백업, 모니터링, 프로비저닝 등을 다 자동으로 수행해준다고 합니다. 그리고 필요에 따라 인프라를 확장하거나 축소해 비용 관리하기 좋다고 합니다

 

원격 DB라고 생각하면 편할 것 같네요

 

백엔드에서 연동하려면 로컬 연동 하듯이 application.properties(또는yml)에 설정을 해주면 됩니다

 

# PostgreSQL 데이터베이스 연결 정보
spring.datasource.url=jdbc:postgresql://<RDS엔드포인트>:5432/mydb
spring.datasource.username=admin
spring.datasource.password=mypassword
spring.datasource.driver-class-name=org.postgresql.Driver

# Hibernate 설정 (JPA 사용 시)
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.PostgreSQLDialect

 

resource "aws_db_instance" "mydb" {
  allocated_storage    = 20
  engine               = "postgres"
  engine_version       = "13.3"
  instance_class       = "db.t2.micro"
  name                 = "mydb"
  username             = "admin"
  password             = "mypassword"
  parameter_group_name = "default.postgres13"
  skip_final_snapshot  = true
  publicly_accessible  = true

  vpc_security_group_ids = [aws_security_group.main.id]
  db_subnet_group_name   = aws_db_subnet_group.main.name
}

resource "aws_db_subnet_group" "main" {
  name       = "main-subnet-group"
  subnet_ids = [aws_subnet.main.id]

  tags = {
    Name = "main-subnet-group"
  }
}

 

예시로 스프링 설정 코드와 terraform설정 코드를 가져와봤습니다~

이제 좀 이해가 되는 듯 하네요! 다음 창에서는 직접 테라폼으로 실습하는 부분을 정리하겠습니다.

 

 

 

https://inpa.tistory.com/entry/AWS-%F0%9F%93%9A-RDS-%EA%B0%9C%EB%85%90-%EC%95%84%ED%82%A4%ED%85%8D%EC%B3%90-%EC%A0%95%EB%A6%AC-%EC%9D%B4%EB%A1%A0%ED%8E%B8

 

[AWS] 📚 RDS 개념 & 아키텍쳐 정리 [이론편]

RDS (Relational Database Service) 란? AWS RDS란 관계형 데이터베이스를 간편하게 클라우드에서 설정, 운영, 확장이 가능하도록 지원하는 웹 서비스이다. RDS는 MySQL이나 오라클 같은 데이터베이스의 설치,

inpa.tistory.com

RDS공부를 위한 참고 사이트