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하면 될 듯!
테라폼 참고 사이트
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설정 코드를 가져와봤습니다~
이제 좀 이해가 되는 듯 하네요! 다음 창에서는 직접 테라폼으로 실습하는 부분을 정리하겠습니다.
RDS공부를 위한 참고 사이트
'카카오테크 부트캠프' 카테고리의 다른 글
[KTB]Dockerfile만들기(with 스프링부트와 리액트)로 시작했지만 AWS public/private 서버 연결하기(+RDS) (0) | 2024.08.13 |
---|---|
[KTB]AWS인스턴스와 RDS연결 및 RDS서버 접속(postgreSQL) (0) | 2024.08.08 |
[KTB]IaC : Terraform과 Ansible을 사용한 인프라 구축 (0) | 2024.08.07 |
[KTB]Docker를 사용하여 애플리케이션을 컨테이너화하고 배포 (1) (0) | 2024.07.16 |
[KTB]클라우드 실습 - AWS 가상 머신 생성하기 (1) | 2024.07.02 |