[Daily morning study] Terraform์ ์ฌ์ฉํ IaC (Infrastructure as Code)
#daily morning study
Terraform์ ์ฌ์ฉํ IaC (Infrastructure as Code)
Terraform์ ์ธํ๋ผ๋ฅผ ์ฝ๋๋ก ๊ด๋ฆฌํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ์ ๋๋ค. Provider์ Resource๋ฅผ ํ์ฉํ์ฌ ํด๋ผ์ฐ๋ ์ธํ๋ผ๋ฅผ ์ ์ํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ตํ๋๋ค. ์ด ํ์ต ๊ฐ์ด๋์์๋ Terraform์ ๊ธฐ๋ณธ ๊ฐ๋ , ์ฃผ์ ๊ตฌ์ฑ ์์, ๊ทธ๋ฆฌ๊ณ ์ค์ ์์ ๋ฅผ ํตํด IaC์ ์๋ฆฌ๋ฅผ ์ค๋ช ํฉ๋๋ค.
1. Terraform์ ๊ธฐ๋ณธ ๊ฐ๋
Infrastructure as Code (IaC)
IaC๋ ์ธํ๋ผ๋ฅผ ์ฝ๋๋ก ์ ์ํ์ฌ ํ์ํ ํ๊ฒฝ์ ์๋์ผ๋ก ํ๋ก๋น์ ๋ํ๊ณ ๊ด๋ฆฌํ๋ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. ์ด๋ ์๋ ์ค์ ์์ ๋ฐ์ํ ์ ์๋ ์ค๋ฅ๋ฅผ ์ค์ด๊ณ , ์ค์ ์ ์ผ๊ด์ฑ์ ์ ์งํ๋ ๋ฐ ํฐ ๋์์ ์ค๋๋ค.
Terraform์ ์ฅ์
- ํ๋ซํผ ๋ ๋ฆฝ์ฑ: AWS, GCP, Azure ๋ฑ ๋ค์ํ ํด๋ผ์ฐ๋ ํ๋ซํผ์ ์ง์
- ๋ชจ๋ํ: ์ฌ์ฌ์ฉ ๊ฐ๋ฅํ ๋ชจ๋๋ก ๊ด๋ฆฌ ๊ฐ๋ฅ
- ๋ฒ์ ๊ด๋ฆฌ: ์ฝ๋๋ก ๊ด๋ฆฌ๋๋ฏ๋ก Git ๋ฑ์ผ๋ก ๋ฒ์ ๊ด๋ฆฌ ๊ฐ๋ฅ
- ๊ณํ ๋ฐ ์คํ:
terraform plan๊ณผterraform apply๋ช ๋ น์ด๋ก ๋ณํ๋ฅผ ๋ฏธ๋ฆฌ ์์ธกํ๊ณ ์ ์ฉ ๊ฐ๋ฅ
2. Terraform์ ์ฃผ์ ๊ตฌ์ฑ ์์
2.1 Provider
Provider๋ Terraform์ด ์ํตํ ํด๋ผ์ฐ๋ ์๋น์ค(๋๋ API)์ ๋ํ ์ธํฐํ์ด์ค์ ๋๋ค. AWS, Azure, Google Cloud ๋ฑ ์ฌ๋ฌ ํ๋ก๋ฐ์ด๋๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, AWS ํ๋ก๋ฐ์ด๋๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ๋ค์๊ณผ ๊ฐ์ด ์ค์ ํฉ๋๋ค.
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 3.0"
}
}
}
provider "aws" {
region = "us-west-1"
}
2.2 Resource
Resource๋ ํ๋ก๋ฐ์ด๋๋ฅผ ํตํด ๊ด๋ฆฌํ ์ค์ ์ธํ๋ผ์ ๊ตฌ์ฑ ์์์ ๋๋ค. ์๋ฅผ ๋ค์ด, EC2 ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด ์ ์ํฉ๋๋ค.
resource "aws_instance" "example" {
ami = "ami-0c55b159cbfafe1fe"
instance_type = "t2.micro"
tags = {
Name = "example-instance"
}
}
2.3 Variables
์ฌ์ฉ์๊ฐ ์
๋ ฅํ ๊ฐ์ ๋ณ์๋ก ์ ์ฅํ ์ ์์ต๋๋ค. ๋ณ์๋ฅผ ์ ์ํ๋ ค๋ฉด ๋ค์๊ณผ ๊ฐ์ด variables.tf ํ์ผ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
variable "instance_type" {
description = "The type of instance to create"
default = "t2.micro"
}
๋ณ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ์ต๋๋ค.
resource "aws_instance" "example" {
ami = "ami-0c55b159cbfafe1fe"
instance_type = var.instance_type
tags = {
Name = "example-instance"
}
}
3. Terraform ๊ธฐ๋ณธ Workflow
Terraform์ ์ฌ์ฉํ์ฌ ์ธํ๋ผ๋ฅผ ๊ด๋ฆฌํ๋ ค๋ฉด ๋๊ฐ ๋ค์๊ณผ ๊ฐ์ ์์๋ฅผ ๋ฐ๋ฆ ๋๋ค.
- ๊ตฌ์ฑ ํ์ผ ์์ฑ: ์ํ๋ ์ธํ๋ผ ๊ตฌ์ฑ์
.tfํ์ผ๋ก ์์ฑํฉ๋๋ค. - ์ด๊ธฐํ:
terraform init๋ช ๋ น์ด๋ก ํ์ํ ํ๋ก๋ฐ์ด๋์ ๋ชจ๋์ ์ด๊ธฐํํฉ๋๋ค. - ๊ณํ ์์ฑ:
terraform plan๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํด ์ค์ ๋ก ์ ์ฉ๋ ๋ณ๊ฒฝ์ฌํญ์ ํ์ธํฉ๋๋ค. - ์ ์ฉ:
terraform apply๋ช ๋ น์ด๋ก ์ธํ๋ผ๋ฅผ ์ค์ ๋ก ๊ตฌ์ฑํ๊ณ ์ ์ฉํฉ๋๋ค. - ์ํ ํ์ธ:
terraform state๋ช ๋ น์ด๋ก ํ์ฌ ์ธํ๋ผ์ ์ํ๋ฅผ ํ์ธํฉ๋๋ค.
4. ์ค์ต ์์
์๋์ ์์ ๋ AWS์์ EC2 ์ธ์คํด์ค๋ฅผ ์์ฑํ๋ ๊ฐ๋จํ Terraform ์ฝ๋์ ๋๋ค.
4.1 main.tf ํ์ผ ์์ฑ
provider "aws" {
region = "us-west-1"
}
resource "aws_instance" "example" {
ami = "ami-0c55b159cbfafe1fe"
instance_type = "t2.micro"
tags = {
Name = "example-instance"
}
}
4.2 Terraform ์ด๊ธฐํ ๋ฐ ์คํ
terraform init
terraform plan
terraform apply
5. ๊ธฐํ ์ ์ฉํ ๋ช ๋ น์ด
terraform destroy: Terraform์ผ๋ก ๋ง๋ ๋ฆฌ์์ค๋ฅผ ์ญ์ ํฉ๋๋ค.terraform output: ์ถ๋ ฅ๊ฐ์ ์กฐํํฉ๋๋ค.terraform fmt: ์ฝ๋ ํฌ๋งท์ ์ผ๊ด๋๊ฒ ์ ๋ฆฌํฉ๋๋ค.
6. ๋ง๋ฌด๋ฆฌ
Terraform์ ์ฌ์ฉํ IaC๋ ์ธํ๋ผ๋ฅผ ์ฝ๋๋ก ๊ด๋ฆฌํ๋ ํจ์จ์ ์ด๊ณ ์ ์ฉํ ๋ฐฉ๋ฒ์ ๋๋ค. ๊ธฐ๋ณธ ๊ฐ๋ ๊ณผ ์์ ๋ฅผ ํตํด Terraform์ ํ์ฉํด ์ํ๋ ์ธํ๋ผ๋ฅผ ์์ฝ๊ฒ ๊ตฌ์ถํ๊ณ ๊ด๋ฆฌํด๋ณด์ธ์. ์ด ๊ฐ์ด๋๋ Terraform์ ์์ํ๋ ๋ฐ ๋์์ด ๋๋ ๊ธฐ๋ณธ์ ์ธ ์ ๋ณด๋ฅผ ์ ๊ณตํฉ๋๋ค. ๋ ์ฌํ๋ ๋ด์ฉ์ ๊ณต์ ๋ฌธ์๋ ์ถ๊ฐ ์๋ฃ๋ฅผ ํตํด ํ์ตํ ์ ์์ต๋๋ค.