모든 클라우드에서 인프라 자동화
모든 환경에서 리소스를 프로비저닝, 변경 및 버전 관리합니다.
출처 : https://www.terraform.io (공식홈페이지 소개글)
Infrastructure as Code, 코드로써의 인프라
즉 코드로써의 인프라는 인프라를 이루는 서버, 미들웨어 그리고 서비스 등 인프라 구성요소들을 코드를 통해 구축하는 것이다.
terraform은 이 IaC의 하나로 인프라를 코드로 구축하기 때문에 작성하기 편리하고, 재사용과 유지보수가 쉽다는 장점을 가진다.
테라폼은 다음 5가지의
required_providers {
aws = { #사용할 프로바이더 aws 설정.
source = "hashicorp/aws" #저장 경로.
version = "~> 3.0" #버전 설정
}
#create a vpc
resource "aws_vpc" "example" {
#"aws_vpc"는 사용하는 자원, "example"은 내가 사용할 이름을 뜻한다.
#여기서 "example"이란 이름은 내가 테라폼에서 사용하는 이름으로, aws 콘솔에서 표시되는 이름이 아니다.
tags = {
Name = "example" #aws 콘솔에 표시되는 이름은 이렇게 tags안의 Name으로 설정한다.
}
cidr_block = "10.0.0.0/16"
#이외에도 수많은 인자 존재.
}
{
"version": 4,
"terraform_version": "1.2.9",
"serial": 222,
"lineage": "9xxxxxxx-fxxx-e80b-2c13-a1bf59bd6bb2",
"outputs": {},
"resources": [
{...},
{...},
]
}
단, state는 현재 인프라의 상태가 아닌 테라폼으로 생성한 결과다. (만약 콘솔이나 다른작업으로 상태가 바뀌어도 state는 업데이트 되지 않는다.)
resource "aws_vpc" "default" {
cidr_block = "10.0.0.0/16"
# cidr_block 이외에도 수많은 인자가 존재합니다.
}
output "vpc_id"{
value = aws_vpc.default.id
}
output "cidr_block"{
value = aws_vpc.default.cidr_block
}
module "vpc" {
source = "../_modules/vpc" ##리소스 코드 경로
cidr_block = "10.0.0.0/16"
}
data "terraform_remote_state" "vpc" {
backend = "remote"
config = {
bucket = "terraform-s3-bucket"
region = "ap-northeast-2"
key = "terraform/vpc/terraform.tfstate"
}
}
terraform init
테라폼 명령어 사용을 위해 각종 설정을 진행 (git init과 비슷한 역할)
terraform plan
테라폼으로 작성한 코드가 실제로 어떻게 만들어질지에 대한 예측 결과를 보여줌
terraform apply
테라폼 코드로 실제 인프라를 생성하는 명령어.
terrafrom import
이미 만들어진 자원을 테라폼 state 파일로 옮겨주는 명령어.
terraform state
테라폼 state를 다루는 명령어. 하위 명령어로 mv, push 등이 있음
terraform destroy
생성된 자원들 state 파일 모두 삭제하는 명령어. (백업 등의 설정을 안해놨으면 한번에 지워지니 조심해서 사용할 것.)