이번에는 Terraform에서 사용되는 기본 키워드를 몇 가지 알아보고, 직접 code를 작성해 인프라를 올려본다.
기본 키워드
Provider
Terraform 템플릿으로 구성될 인프라의 타입으로, AWS / GCP / Azure와 같은 퍼블릭 클라우드 서비스 부터 SaaS 타입의 서비스까지 다양한 외부 서비스들을 Terraform과 연결해주는 기능
프로바이더는 configuration 단계에서 반드시 설정해주어야한다.
아래 링크에서 Terraform이 지원하는 Provider 목록을 확인할 수 있다.
Terraform은 이러한 Provider들의 API를 호출하는 식으로 실행된다.
아래 코드는 Provider를 AWS로 지정하는 부분이다.
...
provider "aws" {
access_key = "my-access-key"
secret_key = "my-secret-key"
profile = "myprofile"
region = "ap-northeast-2"
}
...
API를 호출하기 위한 계정의 Credential(access key, secret key)을 제공해주어야한다.
Resource
Terraform을 구성하는 가장 중요한 요소로 생성할 리소스를 지정하는 선언문이다.
Resource 문은 아래와 같이 구성된다.
resource "[Resource Type]" "[Resource Name]" {
리소스의 argument들...
}
Provider에 따라서 생성할 수 있는 Resource Type이 다르다.
또한 Resource Type에 따라서 지정해야하는(할 수 있는) argument들이 정해져 있기 때문에 Resource를 생성할 때에는 Docs를 참고하자.
State
Terraform을 통해 생성된 리소스의 상태, Terraform을 실행(Apply)할 때마다 생성한 리소스에 대해서 tfstate라는 상태파일에 기록한다.
이 tfstate에는 실행으로 생성된 리소스와 구성파일의 리소스가 매핑된 내용이 포함되어있다.
Terraform은 이 파일을 가져와서 실행할 때마다 실제 배포된 리소스와 설정 파일에 적힌 리소스를 비교해서 어느 부분이 변경되는 지를 확인하고 결정한다.
즉, 이 상태파일은 Apply를 할 때마다 변경되는 구성요소로, 이를 직접 편집하는 등의 작업은 해서는 안된다.
팀 단위 등에서 이러한 Terraform 작업을 하는 경우 state 파일 관리가 이슈가 되는데, 이에 관한 내용은 따로 글을 작성하도록 한다.
Output
작성한 리소스의 정보를 CLI 상에 출력해주며, 이를 다른 module에서 사용할 수 있도록 설정해주는 문이다.
아래는 생성한 ec2 인스턴스의 id값을 출력해주는 부분이다.
resource "aws_instance" "tf_study_instance1" {
ami = "ami-02288bc8778f3166f"
instance_type = "t2.micro"
subnet_id = aws_subnet.tf_study_subnet-private1.id
key_name = aws_key_pair.tf_study_key.key_name
vpc_security_group_ids = [ aws_security_group.tf_study-instance-sg.id ]
}
...
output "instance_id" {
value = aws_instance.tf_study_instance1.id
description = "instance ID of tf_study_instance1"
}
Apply를 해줄 경우 CLI 상으로 instance_id 가 노출되는 것을 볼 수 있다.
이외에도 variable, module도 존재하나 각각 따로 글을 작성할 예정
기본 명령어
terraform init
Provider와 state, module 등의 설정을 위해 Apply 이전에 설정해주는 명령어, 이를 통해서 Provider를 읽고 필요한 plugin을 다운받는 등의 작업을 진행한다.
terraform plan
작성한 Terraform 코드가 어떻게 적용될 지 미리 예측되는 결과값을 보여주는 명령어, 필수는 아니나 Apply하기 전에 작성한 코드에 문제가 없는 지 볼 수 있는 코드 linting 기능 정도로 보면 좋을 듯하다.
terraform apply
작성한 Terraform 코드를 실제 인프라에 올리는 명령어
terraform destroy
실제 인프라에 올라간 리소스 중 작성된 Terraform 코드의 리소스를 삭제하는 명령어
이렇게 Terraform의 기본 키워드와 명령어를 알아보았다. 다음에는 직접 코드를 작성해 간단한 인프라 아키텍쳐를 올려보도록 한다.