IaC/Terraform

[Terraform] Provider, Resource, Data Source, Variable, Output, Locals, Module

dhyuck 2022. 8. 11. 00:26
반응형

Terraform

  • Terraform은 테라폼 자체를 구성하는 내용으로 backend, required_version 등을 지정할수 있습니다.
terraform {
  required_version = ">= 1.0.0"
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.0"
    }
  }
}

Provider

  • Provider는 테라폼이 동작하는 클라우드 제공자(cloud providers) 또는 API 제공자(API providers)에 대해 기술합니다.
  • provider들이 테라폼을 지원하지 않는다면 terraform은 어떤 종류의 인프라도 관리 할 수 없습니다.
provider "aws" {
  profile = "aws_hyuckang"
  region  = "ap-northeast-2"
}

Resource

  • resource는 AWS EC2, VPC, Subnet와 같은 인프라 객체(infrastructure object)를 의미합니다.
resource "aws_instance" "hyuckang_EC2" {
  ami           = "ami-0ecb2a61303230c9d"
  instance_type = "t2.micro"

  tags = merge({
    Name = var.hyuckang_EC2_NameTag
    }, local.common_tags
  )
}

Data Source

  • Data Source를 사용하면 다른 테라폼 작업공간(workspace)이나 API를 통해 가져온 정보를 사용할 수 있으며 테라폼 구성(configuration)을 유연하게 만들수 있습니다.
data "aws_vpc" "default_vpc" {
  default = true
}

data "aws_subnets" "default" {
  filter {
    name   = "vpc-id"
    values = [data.aws_vpc.default_vpc.id]
  }
}

Input Variable

  • Input Variable은 입력 변수로 테라폼의 모듈을 재사용하거나 테라폼을 좀 더 유연하게 사용할 수 있게 해줍니다.
variable "hyuckang_EC2_NameTag" {
  default = "hyuckang_EC2"
  type    = string
}

Output Values

  • Output은 인프라 구조에 대한 정보(Infra structured data)를 export 할 수 있습니다.

    이를 통해 다른 인프라를 구성하거나 다른 테라폼 작업 공간에서 data source로 사용 할 수 있습니다.

  • Output Value는 프로그래밍의 반환 값(return value)과 유사한 개념입니다.

output "default_vpc_cidr" {
  value       = data.aws_vpc.default_vpc.cidr_block
  description = "default vpc cidr_block"
}

Local Values

  • Local Value는 동일한 값이나 표현식을 여러번 반복해야 할 때 사용 할 수 있으며 선언된 모듈 내의 표현식에서만 액세스할 수 있습니다.
  • Local Value는 Input Variable과 달리 사용자가 직접 설정 할 수 없습니다.
locals {
  common_tags = {
    Using = "terraform_test"
    Owner = "hyuckang"
  }
}

Module

  • Module을 사용하면 리소스 구성을 캡슐화하고 구성 파일을 재사용 할 수 있습니다.
  • Module은 단일 디렉터리에 있는 하나 이상의 구성파일들로 이루어져 있습니다.
  • 현재 작업 디렉터리의 모듈을 루트 모듈(root module)이라 합니다.
  • A 모듈에서 B 모듈을 호출해서 사용하는 경우 B는 A의 하위모듈(child module)이라고 합니다.
module "servers" {
  source = "./app-cluster"
}

참고

Overview - Configuration Language | Terraform by HashiCorp

반응형