Over the limit

[Terraform] 테라폼 기본 문법 본문

Devops/Terraform

[Terraform] 테라폼 기본 문법

ellapk 2024. 10. 7. 18:06

1. 기본 구조

테라폼의 기본 구성 요소는 주로 .tf 파일에 작성되며, 각 파일은 인프라를 정의하는 블록으로 구성됩니다. 주요 블록은 provider, resource, variable, output, data 등이 있습니다.

 

2. Provider 설정

프로바이더는 테라폼이 어떤 클라우드 서비스나 플랫폼에 적용되는지 정의합니다. 예를 들어, AWS에 대한 프로바이더를 설정하려면 다음과 같이 작성합니다:

provider "aws" {
  region  = "us-west-2"    # 사용할 AWS 리전 설정
  access_key = "YOUR_ACCESS_KEY"    # AWS 액세스 키 (환경 변수나 프로파일을 사용하는 것이 더 안전)
  secret_key = "YOUR_SECRET_KEY"    # AWS 시크릿 키
}
 
 

참고: 실제로는 보안상 access_key와 secret_key를 코드에 직접 쓰지 않고, 환경 변수나 프로파일을 사용하여 관리하는 것이 좋습니다.

 

3. Resource 생성

리소스는 프로비저닝하려는 인프라의 개별 구성 요소를 나타냅니다. 예를 들어, EC2 인스턴스를 생성하려면 다음과 같이 작성합니다:

resource "aws_instance" "example" {
  ami           = "ami-0c55b159cbfafe1f0"  # 인스턴스에 사용할 AMI ID
  instance_type = "t2.micro"               # 인스턴스 유형

  tags = {
    Name = "example-instance"              # 태그 설정
  }
}
 
 
  • resource : 테라폼 블록으로 리소스를 생성할 때 사용.
  • "aws_instance" : AWS에서 EC2 인스턴스를 생성한다는 의미.
  • "example" : 리소스의 로컬 이름으로, 다른 리소스와 구분할 때 사용.
  • ami : EC2 인스턴스에 사용할 AMI 이미지 ID.
  • instance_type : 인스턴스 유형 (예: t2.micro).

 

4. 변수 (Variable) 사용

코드에서 반복적으로 사용되는 값을 변수로 추출하여 관리할 수 있습니다. 변수는 variable 블록을 통해 선언하며, 다음과 같이 사용합니다:

# 변수 선언
variable "region" {
  description = "The AWS region to deploy in"    # 변수에 대한 설명
  default     = "us-west-2"                     # 기본값
}

# 변수 사용
provider "aws" {
  region = var.region    # 선언된 변수를 사용할 때 'var.'를 사용
}
 
  • variable 블록에서 default 키워드를 통해 기본값을 지정할 수 있습니다.
  • 변수를 사용할 때는 var.변수명 형식으로 참조합니다.

 

5. 출력 값 (Output) 설정

테라폼 실행 후 생성된 리소스의 정보를 출력하려면 output 블록을 사용합니다:

output "instance_id" {
  description = "The ID of the EC2 instance"
  value       = aws_instance.example.id
}
 
  • output 블록은 다른 모듈과의 데이터 공유 또는 최종 결과를 보기 위해 사용됩니다.
  • value에는 출력하고자 하는 값이나 리소스 속성을 넣습니다.

 

6. 데이터 소스 (Data Source) 사용

데이터 소스는 기존의 인프라를 참조할 때 사용합니다. 예를 들어, 특정 AMI를 찾아서 사용할 수 있습니다:

 
data "aws_ami" "latest_ami" {
  most_recent = true
  owners      = ["amazon"]

  filter {
    name   = "name"
    values = ["amzn2-ami-hvm-*-x86_64-gp2"]
  }
}

resource "aws_instance" "example" {
  ami           = data.aws_ami.latest_ami.id
  instance_type = "t2.micro"
}
  • data 블록은 기존에 있는 리소스 정보를 조회할 때 사용됩니다.
  • 예시에서는 최신 Amazon Linux 2 AMI ID를 찾고, 이를 사용하여 인스턴스를 생성합니다.

 

7. 모듈 (Module) 사용

모듈은 인프라 코드를 재사용할 수 있도록 하는 단위입니다. 예를 들어, S3 버킷을 생성하는 모듈을 사용할 수 있습니다:

module "s3_bucket" {
  source = "./modules/s3-bucket"    # 모듈 경로 (로컬 또는 원격)

  bucket_name = "my-unique-bucket-name"
  versioning  = true
}
  • module 블록은 모듈을 호출하고, source는 모듈이 위치한 경로를 나타냅니다.
  • 모듈의 변수들은 module "모듈명" 블록 내부에서 설정합니다.

 

8. 상태 파일 (State File)

테라폼은 현재 인프라 상태를 .tfstate 파일에 저장합니다. 이 파일을 통해 테라폼은 이전에 적용된 상태와 현재 코드를 비교하여 필요한 변경 사항을 결정합니다.

주의: .tfstate 파일은 인프라의 현재 상태를 기록하기 때문에 민감한 정보를 포함할 수 있습니다. 적절한 보안 관리가 필요합니다.

 

9. 실행 명령어

테라폼의 주요 명령어는 다음과 같습니다:

  • terraform init : 작업 디렉토리 초기화 및 플러그인 다운로드.
  • terraform plan : 변경 사항을 미리 확인.
  • terraform apply : 실제 인프라에 변경 사항을 적용.
  • terraform destroy : 인프라 리소스를 제거.

 

10. 조건문과 반복문

1) 조건문 (Conditional Expressions)

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

resource "aws_instance" "example" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = var.instance_type == "t2.micro" ? "t2.micro" : "t2.small"
}
  • 조건문은 condition ? true_value : false_value 형태로 작성됩니다.

2) 반복문 (For Expressions)

variable "availability_zones" {
  type    = list(string)
  default = ["us-west-1a", "us-west-1b"]
}

resource "aws_subnet" "example" {
  count = length(var.availability_zones)

  vpc_id     = aws_vpc.main.id
  cidr_block = cidrsubnet(aws_vpc.main.cidr_block, 8, count.index)

  availability_zone = var.availability_zones[count.index]
}
  • count와 for 표현식을 통해 반복적으로 리소스를 생성할 수 있습니다.

'Devops > Terraform' 카테고리의 다른 글

[Terraform] 테라폼 Provider  (0) 2024.10.07
[Terraform] 테라폼 기본 사용  (0) 2024.10.07