Dev./Terraform

Terraform: IaC

Ivan'show 2023. 9. 1.
728x90
반응형

IaC 의 개념 및 필요성

Infrastructure as Code - 인프라를 코드로 관리한다.

일정 수준의 규모를 넘으면 아래와 같은 이유들로 IaC 도입의 필요성이 충족된다.

  • 자동화
  • 일관성
  • 버전관리
  • 테스트
  • 비용절감
  • 협업

IaC Tools

Terrraform 의 장점

테라폼, Terraform 이 가지고 있는 장점은 다음과 같다.

  • 모듈화
  • 상태관리
  • 강력한 생태계
  • 자체 언어

Terraform 의 구성요소

테라폼은 HasiCorp 사에서 Go 를 사용해서 만든 오픈소스이며, 구성요소는 아래와 같다.

  • provider
  • 테라폼으로 생성할 인프라의 종류를 의미
  • resource
  • 테라폼으로 실제로 생성할 인프라 자원을 의미
  • state
  • 테라폼을 통해 생성한 자원의 상태를 의미
  • output
  • 테라폼으로 만든 자원을 변수 형태로 state 에 저장하는 것을 의미
  • module
  • 공통적으로 활용할 수 있는 코드를 문자 그대로 모듈 형태로 정의하는 것을 의미
  • remote
  • 다른 경로의 state 를 참조하는 것을 말하며, output 변수를 불러올 때 주로 사용

provider

# Configure the AWS Provider
provider "aws" {
  region = "ap-northeast-2"
	verson = "~> 3.0"
}

다양한 Arguments 를 가지며 resource 를 다루기 위한 파일들을 다운로드 하는 역할을 한다.

resource

# main.tf, vpc.tf 등 원하는 형태로 파일이름을 사용한다.
# Create a VPC
resource "aws_vpc" "example" {
	cidr_block = "10.0.0.0/16"
	# cidr_block 이외에도 수많은 인자가 존재
}

테라폼으로 VPC 를 생성하는 코드이다. VPC 역시 다양한 Arguement 와 다른 구성요소가 존재한다.

state

# terraform.tfstate 라는 파일명을 가지게 된다.
{
	"version": 4,
  "terraform_version": "1.5.5",
  "serial": 70,
  "lineage": "af16b971-e436-f9f3-1892-ff458979e286",
	...
	...

}

테라폼 state 로 현재 인프라의 상태를 의미하는 것은 아니고 실행해서 얻은 결과값이니 최대한 똑같이 유지할 수 있게 해야한다.

output

# 공인 아이피 설정 및 부여
resource "ncloud_public_ip" "test" { # 빈 깡통으로 넣어주기만 해도 공인 IP는 생성
    server_instance_no = ncloud_server.server.instance_no
}

# 공인 IP 를 서버에서 가져오기
output "server_ip" {
  value = ncloud_server.server.public_ip
}
# 공인 IP 를 생성하면서 가져오기
output "public_ip" {
  value = ncloud_public_ip.test.public_ip
}

테라폼 output 은 resource 파일을 실행하고 값이 생기는 것들을 참조해서 변수를 state 파일에 저장하여 remote 를 사용해서 재사용할 수 있게 한다.

module

module "VPC" {
	source = "../_modules/vpc"
	cidr_block = "10.0.0.0/16"
}

테라폼 module 은 한번 만들어진 테라폼 코드로 같은 형태를 반복적으로 만들어낼 때 주로 사용된다.

remote

# remote 는 원격 참조 개념으로 이해하면 좋다.
data "terraform_remote_state" "vpc" {
	backend = "remote"
	config = {
		bucket = "terraform-s3-bucket"
		region = "ap-northeast-2"
		key = "terraform/vpc/terraform.tfsate"
	}
}

remote state 는 ket 값에 명시한 state 에서 변수를 가져온다.

Provision vs Configuration

Provision 은 필요한 리소스를 할당하고 준비하는 과정이며 Configuration 은 그 리소스를 특정 상태나 요구 사항에 맞게 설정하는 과정이다.

절차적 언어 vs 선언적 언어

프로그래밍 패러다임의 주요 유형들이다. 절차적 언어는 어떻게 문제를 해결할 것인지 순차적으로 절차를 정의하고 선언적 언어는 무엇을 원하는지 명시하면 어떻게는 시스템이 자동으로 처리하게 한다.

절차차적 언어 예시

def calculate_average(numbers):
    total = sum(numbers)
    count = len(numbers)
    return total / count

numbers = [1, 2, 3, 4, 5]
average = calculate_average(numbers)
print(f"The average is {average}")

선언적 언어 예시

SELECT AVG(age) FROM users WHERE country = 'USA';

위 예시들은 둘다 평균을 구하는 과정을 언어로 표현하지만 절차적 언어는 과정을 순차적으로 정의했고 선언적 언어는 무엇을 할지 정해주었다.

Terraform은 Infrastructure as Code (IaC) 도구로, 주로 Provisioning 작업에 사용되며 이 작업은 **선언적 언어**로 수행된다.

728x90
반응형

'Dev. > Terraform' 카테고리의 다른 글

Terraform: Modules  (0) 2023.09.05
Terraform: LoadBalancer  (0) 2023.09.05
Terraform: AWS - VPC 생성  (0) 2023.09.04
Terrform: NCP 서버 생성  (0) 2023.09.02
Terraform: 설치와 기본정보  (0) 2023.09.01

댓글