
Terraform은 Infra Structure를 코드로 관리(Iac)하는 오픈 소스로 리소스와 서비스를 선언적 구성 파일로 정의하고 Provisioning한다.
Provisioning : 사용자가 요청한 IT 자원을 사용할 수 있는 상태로 준비하는 것

2014년 HashiCorp의 Mitchell Hashimoto와 Armon Dadgar에 의해 처음 개발되었다.
클라우드 Infra Structure의 복잡성이 증가하면서 수동 관리의 한계와 일관성 유지의 어려움이 대두되었고, Terraform은 이러한 문제를 해결하기 위해 등장했다.
결국 인프라를 코드로 정의하고 버전 관리할 수 있는 도구를 통해 이러한 요구를 충족하는 툴로 빠르게 채택되어 현재는 다양한 클라우드 제공업체를 지원하는 유연성과 선언적 구문의 간결함이 주요 장점이 되었다.
| 클라우드 서비스 모델 | 프로바이더 |
|---|---|
| IaaS | AWS, Azure, GCP, Alibaba, Oracle Cloud |
| PaaS | Kubernetes, Docker AWS Elastic Beanstalk |
| SaaS | Github, GitLab, Atlassian(Jira, Confluence) |
Iaas : Infrastructure as a Service
Paas : Platform as a Service
Saas : Software as a Service
- Write (작성) : 인프라를 코드로 정의
- Plan (계획) : 변경 사항 미리 확인
- Apply (적용) : 인프라에 변경 사항 적용
실제 코드로 작성하고 적용할 때 -> tf config 파일 작성 이후 init -> plan -> apply
이전 게시글에 했던 것들을 활용해 이어서 해보자.
우선 해야 할 것이 환경변수 설정을 해야 한다.
https://developer.hashicorp.com/terraform/install

눌러서 압축을 푼 뒤, C드라이브에 'terraform' 이름으로 폴더를 만든 뒤 라이센스와 실행 파일을 옮기자.

확인을 눌러준 뒤 cmd 창에서 terraform -version

잘 된 것을 볼 수 있다.
쿠버네티스했던 폴더로 가서 terra_prac 폴더 만들기

VSCode로 해당 폴더를 연 뒤 main.tf 파일 만들고 아래 코드 적용
# Kubernetes 프로바이더 설정
provider "kubernetes" {
config_path = "~/.kube/config" # 로컬 Kubernetes 설정 파일 경로
}
# Spring Boot Deployment
resource "kubernetes_deployment" "boot002dep" {
metadata {
name = "boot002dep"
}
spec {
replicas = 1
selector {
match_labels = {
app = "boot002kube"
}
}
template {
metadata {
labels = {
app = "boot002kube"
}
}
spec {
container {
image = "jojehuni/nine_b_proj:latest"
name = "boot-container"
image_pull_policy = "Always"
port {
container_port = 7777
}
}
}
}
}
}
# Spring Boot Service
resource "kubernetes_service" "boot002ser" {
metadata {
name = "boot002ser"
}
spec {
selector = {
app = "boot002kube"
}
port {
port = 8001
target_port = 7777
}
type = "ClusterIP"
}
}
# Vue.js Deployment
resource "kubernetes_deployment" "vue002dep" {
metadata {
name = "vue002dep"
}
spec {
replicas = 1
selector {
match_labels = {
app = "vue002kube"
}
}
template {
metadata {
labels = {
app = "vue002kube"
}
}
spec {
container {
image = "jojehuni/nine_v_proj:latest"
name = "vue-container"
image_pull_policy = "Always"
port {
container_port = 80
}
}
}
}
}
}
# Vue.js Service
resource "kubernetes_service" "vue002ser" {
metadata {
name = "vue002ser"
}
spec {
selector = {
app = "vue002kube"
}
port {
port = 8000
target_port = 80
}
type = "ClusterIP"
}
}
# Ingress
resource "kubernetes_ingress_v1" "sw_camp_ingress" {
metadata {
name = "sw-camp-ingress"
annotations = {
"nginx.ingress.kubernetes.io/ssl-redirect" = "false"
"nginx.ingress.kubernetes.io/rewrite-target" = "/$2"
}
}
spec {
ingress_class_name = "nginx"
rule {
http {
path {
path = "/()(.*)$"
path_type = "ImplementationSpecific"
backend {
service {
name = "vue002ser"
port {
number = 8000
}
}
}
}
path {
path = "/boot(/|$)(.*)$"
path_type = "ImplementationSpecific"
backend {
service {
name = "boot002ser"
port {
number = 8001
}
}
}
}
}
}
}
}
이제 git bash 터미널 창을 열고 아래 사진과 같이 명령어를 입력해 켜져 있는 deployment와 service, ingress 들을 삭제하자.

Terraform으로 한 번에 띄우는 것을 확인하기 위해 삭제한 것이다.
terra_prac 폴더 위치에서 terraform init 명령어 실행

주의할 점
계속 terrform command not found 라는 오류가 떠서 왜 그러나 찾아봐도 방법이 나오지 않았다..그럴 땐 VSCode 열린걸 다 끄고 다시 키면 된다.. main.tf도 꼭 저장을 하자. (이건 이미 돼 있었는데.. 안 꺼서 안 됐던 것)
terraform plan 명령어로 뷰를 확인할 수 있다.
terraform apply 를 하면 끝난다.

tf 파일 남기고 나머지를 지우는 방법은
rm -rf .terraform*rm terraform.tfstate* 2개 명령어를 순차적으로 사용해 지울 수 있다.