Search

Terraform

Date
2024/05/09
Category
Devops
Tag
IaC
목차

개념

리소스 (Resource)

리소스는 어느 한 프로바이더에 속하며 인수(arguments)를 수락하고 속성(attributes)을 출력(output)하며 수명 주기(life cycle)를 가진다. 리소스는 생성, 검색, 업데이트 및 삭제할 수 있다. 리소스의 예시로는 aws_vpc, aws_db_instance 가 있다.

리소스 모듈 (Resource Module)

리소스 모듈은 공통 작업(예: AWS VPC Terraform 모듈이 VPC, 서브넷, NAT 게이트웨이 등을 생성함)을 함께 수행하는 연결된 리소스의 집합입니다. 이는 프로바이더 구성에 따라 달라지며, 공급자 구성 안에서 정의하거나 상위 수준의 구조(예: 인프라 모듈)에서 정의할 수 있다.

인프라 모듈 (Infrastructure Module)

인프라 모듈은 논리적으로 연결되지는 않지만 현재 상황/프로젝트/셋업에서 동일한 목적을 수행하는 리소스 모듈의 집합이다. 프로바이더에 대한 구성을 정의하고 다운스트림 리소스 모듈 및 리소스로 전달된다. 일반적으로 논리적 구분자(예: AWS Region, Google Project)당 하나의 엔티티에서 작업하도록 제한된다.
예를 들어 terraform-aws-atlantis 모듈은 terraform-aws-vpcterraform-aws-security-group과 같은 리소스 모듈을 사용하여 AWS Fargate에서 Atlantis를 실행하는 데 필요한 인프라를 관리한다.
또 다른 예로 terraform-aws-modules 모듈을 여러 개 함께 사용하여 인프라를 관리하고 도커 리소스를 사용하여 도커 이미지를 구축, 푸시, 배포하는 terraform-aws-cloudquery 모듈이 있다. 이 모든 것이 한 세트로 이루어진다.

구성 (Composition)

구성은 논리적으로 분리된 여러 영역(예: 리전, 여러 계정)에 걸쳐 존재할 수 있는 인프라 모듈의 모음이다. 구성은 전체 조직이나 프로젝트에 필요한 전체 인프라를 설명하는데 사용된다.
구성은 개별 리소스를 구현하는 리소스 모듈들로 이뤄진 인프라 모듈이다.
간단한 인프라 구성
데이터 소스(Data Source)
데이터 소스는 읽기 전용 작업을 수행하며 프로바이더 구성에 따라 리소스 모듈 및 인프라 모듈에서 사용된다.
데이터 소스 terraform_remote_state는 상위 모듈 및 구성(compositions)에 접착제 역할을 한다.
외부 데이터 소스를 사용하면 외부 프로그램이 데이터 소스 역할을 하여 Terraform 구성(configuration)의 다른 곳에서 사용할 수 있도록 임의의 데이터를 노출시킨다. 예로 terraform-aws-lambda module이 있을 때, 여기서 파일 이름은 외부 파이썬 스크립트를 호출하여 계산된다.
데이터 소스 http는 주어진 URL로 HTTP GET 요청을 보내고 응답에 대한 정보를 내보낸다. 이는 네이티브 Terraform 프로바이더가 존재하지 않는 엔드포인트에서 정보를 얻는 데 유용한 경우가 많다.

원격 상태(Remote state)

인프라 모듈 및 구성(compositions)은 Terraform state를 다른 사용자가 제어가능한 방식(예: ACL 지정, 버전 관리, 로깅)으로 검색할 수 있는 원격 위치에 지속시켜야 한다.

코드 구조

Terraform Configurations을 어떻게 구성해야하는가?

프로젝트의 복잡성 파악

관련 리소스 수
Terraform 프로바이더 수
논리적 프로바이더는 전적으로 Terraform 논리 내에서 작동하며 다른 서비스와 상호 작용하지 않는 경우가 많아 O(1)의 복잡성을 가진다. 가장 일반적인 논리적 프로바이더는 random, local, terraform, null, time이 포함된다.

인프라 변화 주기

From 월/주/일에 1회
To 지속적 (새 커밋이 있을 때마다)

Code Change Initiator? (새 아티팩트가 빌드되면 CI 서버가 저장소를 업데이트하도록 할것인가?)

개발자만 인프라 저장소에 푸시할 수 있다.
누구나 PR을 열어 어떤 변경이든 제안 가능 (CI 서버에서 실행되는 자동화된 작업 포함)

배포 플랫폼 & 배포 서비스

AWS CodeDeploy, Kubernetes 또는 OpenShift에는 다른 접근 방식이 필요하다

환경 그룹화

환경, 지역, 프로젝트 별로

Terraform Configurations 구조화

main.tf - 모듈, 로컬 및 데이터 소스를 호출하여 모든 리소스 생성
variables.tf - main.tf에서 사용되는 변수 선언을 포함
outputs.tf - main.tf에서 생성된 리소스의 outputs를 포함
versions.tf - Terraform 및 프로바이더에 대한 버전 요구 사항을 포함