DevSecOps/ํด๋ผ์šฐ๋“œ(Cloud)

Terraform ๊ตฌ์„ฑ ์š”์†Œ

์‹œํ๋ฆฌํ‹ฐ์ง€ํ˜ธ 2025. 5. 31. 04:37

 

Terraform ํ”„๋กœ์ ํŠธ๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ฃผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋„ค ๊ฐ€์ง€ ํŒŒ์ผ(main.tf, variables,tf, terraform.tfvars, terraform.tfstate)์˜ ์—ญํ• ๊ณผ ์˜ˆ์‹œ๋ฅผ ์ •๋ฆฌํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

 

1. main.tf

  • ์—ญํ•  : ์‹ค์ œ ๋ฆฌ์†Œ์Šค (Resource)์™€ ํ”„๋กœ๋ฐ”์ด๋”(Provider)๋ฅผ ์ •์˜ํ•˜๋Š” "๋ฉ”์ธ" ๊ตฌ์„ฑ ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.
  • ์˜ˆ์‹œ : AWS EC2 ์ธ์Šคํ„ด์Šค๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ•˜๋Š” ๊ฐ„๋‹จํ•œ ์˜ˆ์ œ
// main.tf

// 1) ์‚ฌ์šฉํ•  ํ”„๋กœ๋ฐ”์ด๋” ์„ค์ •
provider "aws" {
  region = var.aws_region
}

// 2) EC2 ์ธ์Šคํ„ด์Šค ๋ฆฌ์†Œ์Šค ์„ ์–ธ
resource "aws_instance" "example" {
  ami           = var.ami_id
  instance_type = var.instance_type

  tags = {
    Name = "example-instance"
  }
}

 

 

2. variables.tf

  • ์—ญํ•  : ์ž…๋ ฅ ๋ณ€์ˆ˜(variable)๋ฅผ ์„ ์–ธํ•ฉ๋‹ˆ๋‹ค. ๋ณ€์ˆ˜์˜ ํƒ€์ž…, ๊ธฐ๋ณธ๊ฐ’, ์„ค๋ช… ๋“ฑ์„ ์ •์˜ํ•˜์—ฌ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ๊ฐ€๋…์„ฑ์„ ๋†’์ž…๋‹ˆ๋‹ค.
  • ์˜ˆ์‹œ :
// variables.tf

// AWS ๋ฆฌ์ „
variable "aws_region" {
  description = "AWS region to deploy resources in"
  type        = string
  default     = "ap-northeast-2"
}

// EC2์šฉ AMI ID
variable "ami_id" {
  description = "The AMI ID for the EC2 instance"
  type        = string
  default     = "ami-0a12345b6789cdef0"
}

// EC2 ์ธ์Šคํ„ด์Šค ํƒ€์ž…
variable "instance_type" {
  description = "EC2 instance type"
  type        = string
  default     = "t3.micro"
}

 

 

3. terraform.tfvars

  • ์—ญํ•  : variables.tf์— ์„ ์–ธ๋œ ๋ณ€์ˆ˜๋“ค์— ์‹ค์ œ ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค. (.tfvars ํ™•์žฅ์ž)
  • ํŠน์ง• : ๊ธฐ๋ณธ์ ์œผ๋กœ terraform apply ์‹œ ์ž๋™์œผ๋กœ ๋กœ๋“œ๋˜๋ฏ€๋กœ, ๋ฏผ๊ฐ ์ •๋ณด(API ํ‚ค ๋“ฑ)๋„ ์ด๊ณณ์— ๋„ฃ์–ด ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์˜ˆ์‹œ :
# terraform.tfvars

aws_region    = "ap-northeast-2"
ami_id        = "ami-0f12345b6789cdea1"
instance_type = "t3.small"

 

 

4. terraform.tfstate

  • ์—ญํ•  : ์‹ค์ œ ์ธํ”„๋ผ ์ƒํƒœ๋ฅผ ๊ธฐ๋ก(state)ํ•˜๋Š” ํŒŒ์ผ์ž…๋‹ˆ๋‹ค.(terraform ๊ฐ€  ์ธํ”„๋ผ๋ฅผ ๊ด€๋ฆฌํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ์ž๋™์œผ๋กœ ์ƒ์„ฑโ€ข๊ฐฑ์‹ ๋ฉ๋‹ˆ๋‹ค.)
    • ๋กœ์ปฌ ํŒŒ์ผ ๋˜๋Š” ์›๊ฒฉ ๋ฐฑ์—”๋“œ(S3, Terraform Cloud ๋“ฑ)์— ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    • ํ˜„์žฌ ํด๋Ÿฌ์Šคํ„ฐ/ํ™˜๊ฒฝ์— ์–ด๋–ค ๋ฆฌ์†Œ์Šค๊ฐ€ ์กด์žฌํ•˜๋Š”์ง€, ์†์„ฑ๊ฐ’์ด ๋ฌด์—‡์ธ์ง€ ๋“ฑ์„ JSON ํ˜•์‹์œผ๋กœ ๋ณด๊ด€ํ•ฉ๋‹ˆ๋‹ค.
  • ์ฃผ์˜์  
    • ๋ฏผ๊ฐ ์ •๋ณด๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ, ๋ฒ„์ „ ๊ด€๋ฆฌ(Git)ํ•  ๋•Œ๋Š” ์ ˆ๋Œ€ ์ปค๋ฐ‹ํ•˜์ง€ ์•Š๊ณ  .gitignore์— ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
    • ์—ฌ๋Ÿฌ ์‚ฌ์šฉ์ž๊ฐ€ ๋™์‹œ์— ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š๋„๋ก ์›๊ฒฉ ์ƒํƒœ(Remote state) ๊ด€๋ฆฌ ๊ถŒ์žฅ
// terraform.tfstate (์ผ๋ถ€ ๋ฐœ์ทŒ)
{
  "version": 4,
  "terraform_version": "1.5.0",
  "resources": [
    {
      "type": "aws_instance",
      "name": "example",
      "instances": [
        {
          "attributes": {
            "ami": "ami-0f12345b6789cdea1",
            "instance_type": "t3.small",
            "tags": {
              "Name": "example-instance"
            },
            // ... ๊ธฐํƒ€ ์†์„ฑ ...
          }
        }
      ]
    }
  ]
}

 

 

ํ•ด๋‹น ํŒŒ์ผ๋“ค์„ ์—ญํ• ์— ๋งž๊ฒŒ ๋‚˜๋ˆ  ๊ด€๋ฆฌํ•˜๋ฉด, ์ฝ”๋“œ ์žฌ์‚ฌ์šฉ์„ฑ๊ณผ ํ˜‘์—… ์‹œ ๊ฐ€๋…์„ฑ์„ ํฌ๊ฒŒ ๋†’์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•„์š”์— ๋”ฐ๋ผ ๋” ์ž‘์€ ๋ชจ๋“ˆ ๋‹จ์œ„๋กœ ์ชผ๊ฐœ ์“ฐ๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.