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 |