의존성 그래프의 핵심 역할
Terraform은 의존성 그래프를 구성하고 이를 사용하여 플랜 생성, 상태 새로고침 등의 작업을 수행한다. 모든 작업(플랜, 적용, 검증, 임포트)이 방향성 비순환 그래프(DAG) 위의 순회로 모델링되는 것이 Terraform의 가장 distinctive한 아키텍처 결정이다. 이러한 설계는 단일 실행에서 수천 개의 인프라 리소스를 안전하게 관리할 수 있게 한다.
그래프 구성 요소와 구조
그래프 내에는 여러 노드 타입이 존재한다: 리소스 노드(단일 리소스를 나타내며, count 메타파라미터 설정 시 각 count마다 하나씩 생성), 프로바이더 설정 노드(프로바이더 완전 구성 시간을 나타냄). 리소스 메타노드는 리소스 그룹을 나타내지만 자체 작업을 수행하지 않으며, count 파라미터가 1보다 클 때만 존재한다.
그래프 구축 프로세스
그래프 구축은 여러 단계로 진행된다: 리소스 노드가 설정에 따라 추가되고, 플랜이나 상태가 있으면 각 리소스 노드에 메타데이터가 붙으며, depends_on 메타파라미터에서 명시적 의존성이 리소스 간 엣지를 생성한다. 리소스 및 프로바이더 설정 내의 보간(interpolation)을 파싱하여 의존성을 결정하고, 리소스 속성 참조는 참조하는 리소스에서 참조되는 리소스로의 의존성으로 변환된다.
암묵적 대 명시적 의존성
Terraform은 암묵적 의존성과 명시적 의존성 두 가지 타입을 지원하는데, 암묵적 의존성은 자동으로 감지되며, 명시적 의존성은 depends_on 메타인자로 수동으로 선언해야 한다. 리소스가 다른 리소스의 속성을 참조할 때 Terraform은 자동으로 관계를 암묵적 의존성으로 추론한다. 명시적 depends_on은 마지막 수단이어야 하는데, 속성 참조를 통한 암묵적 의존성이 더 명확하고 유지 관리하기 쉽기 때문이다.
그래프 순회와 병렬화
그래프를 순회할 때는 표준 깊이 우선 탐색(DFS)을 수행한다. 서로 의존하지 않는 리소스는 병렬로 실행되고, 서로 의존하는 리소스는 위상 정렬 순서로 실행된다. 병렬화 정도는 세마포어를 사용하여 제한되며, 기본적으로 최대 10개 노드가 동시에 처리되고, -parallelism 플래그로 조정할 수 있다.