
테라폼(Terraform)
테라폼은 인프라스트럭처를 코드로 정의하고 관리하기 위한 오픈 소스 도구입니다. 다양한 클라우드 서비스 제공업체와 온프레미스 인프라를 관리할 수 있으며, 코드로 인프라를 정의함으로써 인프라 변경을 추적하고 관리하는 데 도움을 줍니다.
왜 사용하는가?
-
인프라스트럭처의 코드화: 테라폼은 인프라를 코드로 정의함으로써 반복 가능하고 관리하기 쉬운 인프라를 만들 수 있습니다. 코드로 작성된 정의는 버전 관리 시스템을 활용해 추적이 가능하며, 변경 내역을 관리할 수 있습니다.
-
다양한 클라우드 지원: AWS, Azure, Google Cloud Platform을 비롯한 다양한 클라우드 제공업체를 지원합니다. 이는 멀티클라우드 환경에서 유연한 인프라 관리를 가능하게 합니다.
-
자동화 및 일관성: 테라폼을 사용하면 인프라를 자동으로 프로비저닝하고 업데이트할 수 있습니다. 이는 일관된 환경을 유지하고, 인프라 변경을 자동화하여 실수를 방지할 수 있습니다.
장점
-
선언적 언어: 테라폼은 선언적 언어로, 어떤 상태를 원하는지 기술하는 방식으로 동작합니다. 이는 목표 상태에 대한 명확한 정의를 제공하며, 특정 단계나 순서를 걱정할 필요가 없게 합니다.
-
커뮤니티 및 생태계: 테라폼은 활발한 커뮤니티와 다양한 플러그인, 모듈 등을 통해 풍부한 생태계를 지원합니다. 이는 다양한 환경에 대응할 수 있도록 도움을 줍니다.
-
모듈화: 테라폼 코드를 모듈화하여 재사용성을 높일 수 있습니다. 모듈은 각각의 역할을 수행하며, 복잡한 인프라를 단순하게 관리할 수 있게 합니다.
단점
-
러닝 커브: 처음 사용자에게는 테라폼의 학습 곡선이 존재합니다. 특히 복잡한 인프라 구성에서는 어려움을 겪을 수 있습니다.
-
문서의 부족: 몇몇 클라우드 서비스나 특정 상황에 대한 문서가 부족할 수 있습니다. 이는 사용자가 어려움을 겪을 수 있는 요인이 될 수 있습니다.
-
삭제 작업의 어려움: 생성된 리소스를 삭제하는 것이 때로 어려울 수 있습니다. 실수로 리소스를 삭제하지 않도록 주의해야 합니다.
어떻게 사용하는가?
테라폼 코드는 확장자가 .tf 또는 .hcl인 파일에 작성됩니다. 기본적인 사용법은 다음과 같습니다:
# provider 설정
provider "aws" {
region = "us-west-2"
}
# 가상 머신 생성
resource "aws_instance" "example" {
ami = "ami-0c55b159cbfafe1f0"
instance_type = "t2.micro"
}
---
설치
MacOS & Linux
# MacOS
brew tap hashicorp/tapbrew install
hashicorp/tap/terraform
# Linux (Ubuntu)
curl -fsSL https://apt.releases.hashicorp.com/gpg | sudo apt-key add ‒
sudo apt-add-repository "deb [arch=amd64] https://apt.releases.hashicorp.com $(lsb_release -cs) main"
sudo apt-get update && sudo apt-get install terraform
윈도우 설치 방법
- 테라폼1.1.5 다운로드
- 압축해제
- terraform 파일 실행
기본 명령어
프로비저닝 적용 (EKS 생성)
# 초기화
terraform init
# 프로비저닝 코드 검증 (Dry Run)
terraform plan
# 프로비저닝 적용 (Run)
terraform apply
프로비저닝 삭제
# 프로비저닝 적용 삭제 코드 검증 (Dry Run)
terraform plan --destroy
# 프로비저닝 삭제 (Run)
terraform destroy
기본 리소스
리소스
프로비저닝할 Resource의 오브젝트를 기술
각 Resource는 오직 1개의 리소스 타입만 가짐
Resource내에 사용 가능한 변수를 설정
resource "aws_eks_cluster" "example" {
name = "example"
role_arn = aws_iam_role.example.arn
vpc_config {
subnet_ids = [aws_subnet.example1.id, aws_subnet.example2.id]
}
# Ensure that IAM Role permissions are created before and deleted after EKS Cluster handling.
# Otherwise, EKS will not be able to properly delete EKS managed EC2 infrastructure such as Security Groups.
depends_on = [
aws_iam_role_policy_attachment.example-AmazonEKSClusterPolicy,
aws_iam_role_policy_attachment.example-AmazonEKSVPCResourceController,
]
}
output "endpoint" {
value = aws_eks_cluster.example.endpoint
}
output "kubeconfig-certificate-authority-data" {
value = aws_eks_cluster.example.certificate_authority[0].data
}
데이터 소스
Provider에서 제공하는 Resource 정보를 가져옴
Terraform에서 사용 할 수 있는 형태로 연결
Filter를 통해 정보를 가져올 수도 있음
data "aws_eks_cluster" "example" {
name = "example"
}
output "endpoint" {
value = data.aws_eks_cluster.example.endpoint
}
output "kubeconfig-certificate-authority-data" {
value = data.aws_eks_cluster.example.certificate_authority[0].data
}
# Only available on Kubernetes version 1.13 and 1.14 clusters created or upgraded on or after September 3, 2019.
output "identity-oidc-issuer" {
value = data.aws_eks_cluster.example.identity[0].oidc[0].issuer
}
프로바이더
프로바이더를 선언해 해당 인프라에 프로비저닝 할 수 있도록 설정
입력변수
입력 변수를 사용하면 모듈의 자체 소스 코드를 변경하지 않고도 Terraform 모듈을 맞춤설정 가능
Terraform의 tf파일 내에서 사용가능한 변수를 지정
terraform 명령어가 실행되는 디렉토리 내에 있는 파일에서 사용가능
Resource, Data Source, Providers에서 모두 변수 지정해 사용가능
variable "image_id" {
type = string
}
variable "availability_zone_names" {
type = list(string)
default = ["us-west-1a"]
}
variable "docker_ports" {
type = list(object({
internal = number
external = number
protocol = string
}))
default = [
{
internal = 8300
external = 8300
protocol = "tcp"
}
]
}