IaC/Terraform

[Terraform] 용어

jih0ssang 2024. 4. 2. 14:50

Terraform 키워드

 

terraform provider
Terraform 자체에 대한 설정을 작성하는 블록 Terraform과 외부 서비스를 연결해주는 기능
resource data
인프라 구성요소 Terraform 외부에 정의되어 있는 정보를 가져와서 사용할 수 있게 해주는 기능
variable locals
개발자로부터 입력받는 변수재사용성 O 지역변수 선언 키워드현재 파일에서만 사용 가능
output module
인프라에 대한 정보를 명령줄에 노출(숨기기 가능)시킬 수 있으며 자식 모듈의 output 값에 접근하여 사용할 수 있게 해주는 기능 하나의 폴더 내에 있는 Terraform 구성 파일들의 집합

 

terraform

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

provider 중 사용할 aws의 버전을 구체적으로 명시한다는 내용 예시이다.

예를 들어 provider에 대한 버전, tfstate 파일의 원격저장소 설정 등을 이 블럭에 작성한다.

provider

provider "aws" {
  region                   = "ap-northeast-2"
  shared_config_files      = ["~/.aws/config"]
  shared_credentials_files = ["~/.aws/credentials"]
  profile                  = "thepool"
}

Terraform은 크로스플랫폼 IaC 도구이다. AWS, Azure, GCP 등 여러 클라우드 서비스와 연결하여 사용할 수 있다. 그에 따라 사용할 provider를 반드시 선언해야 한다. 다수의 클라우드 서비스 이용의 경우, 여러 개의 provider를 선언한다.

resource

resource “aws_vpc” “jry_vpc” {
cidr_block = "10.0.0.0/16"
  tags = {
    Name = "the-pool-vpc"
  }
}

ec2나 subnet, S3 등 하나의 resource로 표현된다.

aws_vpc는 terraform에 정의되어 있는 타입명이고, jry_vpc는 개발자가 붙이는 리소스명이다.

 

data

data "aws_iam_policy_document" "s3_policy" {
  statement {
    principals {
      type        = "*"
      identifiers = ["*"]
    }


    actions = [
      "s3:*",
    ]


    effect = "Allow"


    resources = [
      "${aws_s3_bucket.s3.arn}",
    ]
  }
}

aws_iam_policy_document는 Terraform에 정의된 타입 이름이고, s3_policy는 개발자가 붙이는 이름이다.

variable

# variable.tf
variable "subnet_id" {
  type        = string
}


variable "ami_id" {
  type        = string
}


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


variable "key_name" {
  type        = string
}


# terraform.tfvars
subnet_id     = "subnet-0bb1c79de3EXAMPLE"
ami_id        = "ami-12345678"
instance_type = "t2.micro"
key_name      = "my-key-pair"

vpc_name은 변수의 이름이다. 어디에서도 해당 변수에 접근 가능하다.

내부적으로 들어가는 type은 변수의 타입이며 default는 변수의 기본 value 이다.

여러 파일에서 같은 모듈을 공유할 수 있어 재사용성이 뛰어나고,

기본값을 설정할 수 있으면 개발자로부터 입력을 받을 수 있는 변수이다.

 

입력변수를 사용할 경우, var 키워드를 통해 접근할 수 있다.

variables를 입력하는 방법은 여러가지가 있다.

  • CLI상으로 입력할 경우

terraform apply -var="cidr_private_a=${cidr_private_a}" -var="cidr_private_b=${cidr_private_b}" \

    -var="cidr_public_a=${cidr_public_a}" -var="cidr_vpc=${cidr_vpc}"

  • .tfvars 파일 내에 값을 작성할 경우 (위와 같음)

 

type으로는 string, number, bool 뿐만아니라, list(TYPE), set, map, object, tuple 이 들어갈 수 있다.

 

locals

locals {
  # Common tags to be assigned to all resources
  common_tags = {
    Service = local.service_name
    Owner   = local.owner
  }
}


resource "aws_instance" "example" {
  # ...
  tags = local.common_tags
}

지역변수 선언 키워드이다. 현재 파일에서만 사용 가능하다.

특정 값들을 연산(merge, concat, max)하여 하나의 변수로 만들 때 주로 사용한다.

 

output

resource "aws_subnet" "public_subnet_a" {
  cidr_block = var.cidr_public_a
  vpc_id = aws_vpc.vpc.id
  availability_zone = var.az_a
}


output "public_subnet_a_id" {
  value = aws_subnet.public_subnet_a.id
}

생성된 public_subnet의 id를 출력하는 예시이다.

public_subnet_a_id는 개발자가 붙이는 이름이고, aws_subnet.public_subnet_a은 출력할 결과값이다.

 

인프라에 대한 정보를 명령줄에 노출(숨기기 가능)시킬 수 있고 (CLI 출력시 value 보임)

variable 구문에 추가하여 다른 경로에 있는 파일도 해당 값 재활용 가능하다.

module 내부에서 만들어진 리소스는 밖에서 접근하기 위해 output을 써야한다.

 

module

vpc-module/
  ├── variables.tf
  └── outputs.tf


# vpc_module/outputs.tf
output "public_subnet_a_id" {
  value = aws_subnet.public_subnet_a.id
}


module "network" {
  source = "./vpc_module"
  cidr_public_a = var.cidr_public_a
}


resource “aws_instance” “jry-ec2” {
cidr_block = "10.0.0.0/16"
  subnet_id    = module.network.public_subnet_a.id

source는 모듈로 사용할 파일들이 저장된 디렉터리 경로를 명시한다.

vpc_module 폴더 내 모든 구성이 포함된 모듈이 호출되는 예시이다

subnet_id는 module(network) 내 source(경로) 하위 모듈 중 public_subnet_a.id의 값을 호출해 가져온다.

 

 

 

 

 

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

[Terraform] 배포 및 플래그  (1) 2024.06.11
[Terraform] 디렉터리 구조  (0) 2024.06.11
[Terraform] 환경 구성  (1) 2024.04.02