SeSac) DevOps

Terraform 실습 코드

tierr 2026. 2. 5. 16:19

Terraform이란?

HashiCorp사에서 만든 코드형 인프라(IaC, Infrastructure as Code) 도구로, 수동으로 버튼을 클릭하는 대신 설정 파일을 작성하여 인프라를 자동 생성, 관리, 업데이트할 수 있게 해줌

 

기초 명령어

terraform fmt : 코드의 들여쓰기와 형식을 깔끔하게 자동 정렬
terraform validate : 코드에 문법적 오류가 없는지 검사
terraform plan : 생성·수정·삭제될 인프라 변경 사항을 미리 확인
terraform apply -auto-approve : 승인 절차 없이 즉시 인프라를 생성/반영
terraform destroy : 생성했던 모든 인프라 리소스를 삭제


실습 코드

https://registry.terraform.io/ 에서 Docs 확인 가능

예) AWS - https://registry.terraform.io/providers/hashicorp/aws/latest/docs

 

vpc.tf -> vpc 생성

vm.tf -> 인스턴스 생성

sg.tf -> 보안그룹 생성

keypair.tf -> 키페어 생성

provider.tf -> 프로바이더(aws) 지정

 

vpc.tf

resource "aws_vpc" "myvpc" {
  cidr_block = "10.0.0.0/16"
}

resource "aws_internet_gateway" "myigw" {
  vpc_id = aws_vpc.myvpc.id
}

resource "aws_subnet" "public_a" {
  vpc_id            = aws_vpc.myvpc.id
  cidr_block        = "10.0.0.0/24"
  availability_zone = "ap-northeast-2a"
}

resource "aws_route_table" "public_rt" {
  vpc_id = aws_vpc.myvpc.id
  route {
    cidr_block = "0.0.0.0/0"
    gateway_id = aws_internet_gateway.myigw.id
  }
  route {
    cidr_block = "10.0.0.0/16"
    gateway_id = "local"
  }
}
resource "aws_route_table_association" "public_association" {
  subnet_id      = aws_subnet.public_a.id
  route_table_id = aws_route_table.public_rt.id
}

 

vm.tf

resource "aws_instance" "my_instance" {
  ami                         = "ami-0130d8d35bcd2d433"
  instance_type               = "t2.micro"
  key_name                    = aws_key_pair.mykey.key_name
  subnet_id                   = aws_subnet.public_a.id
  vpc_security_group_ids      = [aws_security_group.my_sg.id]
  associate_public_ip_address = true
  tags = {
    Name = "instance-yji"
  }
}

 

sg.tf

resource "aws_security_group" "my_sg" {
  name   = "my_sg"
  vpc_id = aws_vpc.myvpc.id
}

resource "aws_vpc_security_group_ingress_rule" "allow_ssh" {
  security_group_id = aws_security_group.my_sg.id
  cidr_ipv4         = "0.0.0.0/0"
  from_port         = 22
  ip_protocol       = "tcp"
  to_port           = 22
}

resource "aws_vpc_security_group_egress_rule" "allow_all_traffic_ipv4" {
  security_group_id = aws_security_group.my_sg.id
  cidr_ipv4         = "0.0.0.0/0"
  ip_protocol       = "-1" # semantically equivalent to all ports
}

 

keypair.tf

resource "aws_key_pair" "mykey" {
  key_name   = "mykey-yji"
  public_key = "ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCfhgwGm0Mk4Ip0+ielnJzBDPsOknw1i3UqvbkVAaLnhzcr9jjKt0TtpYIsZ+ONMVhJB7zo7H7BY/42H1oNPd/DXbgSVrdlY9wIYZ78OWyDjiYEhGVh4nVdGasmXE3iQ17tCgDOfGxac7GujbPs6Su6Ww21n3aDMH8vRRHxFynkgElAMXvTiRe4NsEYMwb4+daljm6qBpOR8IoyAtcb/EjV1egStF6VjObve+3j8BwrYh/KdMmmTCQnPN5j2+4UO6JuulpPNeH8ugaWBLYU0rI/m3qRef0oAYl2cfHRNPYeTWui2h/IHwMRyzZwng0G4bIsFQICMItQlM5sdCzW12K9txxP+KyvpFsGEIafD/wXFae3Nmk8YLVDUOMV2S11WTjBf1RKBJVKNXxxoJYxFt5D1OiwGB+/abbi3TWcWRRFUIhHvkETiHjvtpJwnE6Hy+ic1x+IAEYJsYahUQA7tg+PuRn+C0N8Jpo5BISauqsVio2LigrKTixjc2EhaUUlGd0= vagrant@localhost.localdomain"
}

 

provider.tf

terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "6.31.0"
    }
  }
}

provider "aws" {
  # Configuration options
}

왜 사용하는지 잘 알겠는데 문법이 어렵고 Docs를 봐도 필요한 모듈을 사용하는게 어려운 것 같다.

잘 습득하면 편하게 인프라를 구성할 수 있을 것 같다.