다음 문서를 참고하였습니다.
https://www.redhat.com/ko/topics/automation/what-is-infrastructure-as-code-iac
http://www.itdaily.kr/news/articleView.html?idxno=201814
https://www.44bits.io/ko/keyword/terraform
https://docmoa.github.io/04-HashiCorp/03-Terraform/01-Information/02-hcl.html
https://bangu4.tistory.com/143
인프라를 프로그래밍한다는 개념을 들어본적 있는가? IaC는 Infrastructure as Code 는 말그대로 코드를 통해 인프라를 관리하고 프로비저닝하는 것을 말한다. IaC를 활용하면 인프라 사양을 담은 구성파일이 생성되므로 항상 동일한 구성을 프로비저닝할 수 있다. 작성한 코드 기반으로 인프라를 설계하면 같은 구성의 인프라를 동시에 1000가지도 만들 수 있다. 또한 생성된 인프라는 같은 코드 베이스로 되어 있기 때문에 동일하고, 추가적으로 변경되는 것또한 막을 수 있다.
기존의 인프라가 데이터 센터의 물리적 하드웨어 방식에서 가상화, 컨테이너, 클라우드 컴퓨팅을 통해 인프라를 관리하게 되었다. 따라서 인프라 구성요소의 수가 늘어났고, 변경 빈도 또한 많아졌다. 이에 따라 인프라를 더 효율적으로 관라히기 위해서 IaC라는 개념이 등장하게 되었다.
IaC에 대한 접근 방식은 선언적 방식과 명령형 방식 2가지가 있다.
선언적 접근 방식은 최종 결과물을 코드로 구성하여 반영하는 방식이다.
명령적 접근 방식은 순차적으로 명령을 주어서 인프라를 구성한다. 따라서 인프라를 구성할 수 있는 코드가 적힌 스크립트를 IaC 툴로 생성하는데, 이 스크립트에는 인프라를 구성할 수 있는 코드가 포함되어 있다.
DevOps 는 기존에 분리 되었던 운영 조직과 개발조직을 하나로 묶어 개발자가 자기가 개발한 소스에 대해서 운영도 한다는 하나의 방법론이다. 따라서 개발자가 운영 환경에 대한 설정을 진행 할 수 있게 되었다는 것이다.
IaC는 기존 데이터 센터에서 벗어나서 인프라 프로비저닝을 개발자가 코드로 할 수 있게 해주는 개념이다
이 중 테라폼에 대해서 알아보자!
테라폼이란 클라우드 인프라스트럭처 자동화 도구
테라폼은 하시코프에서 오픈소스로 개발중인 클라우드 인프라 스트럭처 자동화를 지양하는 IaC 도구이다.
테라폼은 go 프로그램언어로 개발되고 있고 HCL(HashiCorp Configuration Language) 와 Json 이 코드의 영역을 담당하고 있다. HCL은 Json 과 서로 잘 호환된다. 초창기에는 HashiCorp 사가 인간 친화적이며 기계 친화적인 언어를 원했고, 그 조건에 해당되는 것은 Json 이었지만 코드가 너무 길어진다는 단점이 있기 때문에 Json과 호환되는 자체 언어를 만들기로 하였다. 따라서 이 HCL언어를 통해 인프라가 코드로 표현되고 곧 코드가 인프라이기 때문에 선언적인 특징을 가지고 있다.
이렇게 코드화된 인프라는 주 목적인 자동화와 더불어 쉽게 프로비저닝하여 히스토리를 관하고 함께 작업할 수 있는 계기를 얻는다.
테라폼 프로젝트를 초기화 한다.
테라폼은 테라폼 프로젝트를 초기화 할 때 프로바이더 설정을 보고 필요한 플러그인을 설치한다.
코드로 작성한 테라폼 설정을 적용하여 aws 리소스 등을 생성
테라폼으로 생성된 infrastructure 삭제
이 파일을 저장하고 infrastructure 실제로 적용하기 전에 변경 사항 체크
provider.tf
provider "aws" {
access_key = var.AWS_ACCESS_KEY
secret_key = var.AWS_SECRET_KEY
region = var.AWS_REGION
}
vars.tf
variable "AWS_ACCESS_KEY" {
}
variable "AWS_SECRET_KEY" {
}
variable "AWS_REGION" {
default = "eu-west-1"
}
variable "AMIS" {
type = map(string)
default = {
us-east-1 = "ami-13be557e"
us-west-2 = "ami-06b94666"
eu-west-1 = "ami-0d729a60"
}
}
terraform.tfvar
AWS_ACCESS_KEY = ""
AWS_SECRET_KEY = ""
AWS_RESION = ""
instance.tf
resource "aws_instance" "example" {
ami = lookup(var.AMIS, var.AWS_REGION, "") # last parameter is the default value
instance_type = "t3.micro"
}