기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.
코드 기반 구조 및 조직에 대한 모범 사례
대규모 팀과 엔터프라이즈에서 Terraform 사용량이 증가함에 따라 적절한 코드 기반 구조와 조직이 중요합니다. 잘 설계된 코드 베이스를 사용하면 대규모로 협업하는 동시에 유지 관리를 강화할 수 있습니다.
이 섹션에서는 품질과 일관성을 지원하는 Terraform 모듈성, 명명 규칙, 설명서 및 코딩 표준에 대한 권장 사항을 제공합니다.
지침에는 환경 및 구성 요소별로 구성을 재사용 가능한 모듈로 나누고, 접두사 및 접미사를 사용하여 이름 지정 규칙을 설정하고, 모듈을 문서화하고, 입력 및 출력을 명확하게 설명하고, 자동 스타일 검사를 사용하여 일관된 형식 지정 규칙을 적용하는 것이 포함됩니다.
추가 모범 사례에서는 구조화된 계층 구조에서 모듈과 리소스를 논리적으로 구성하고, 문서에서 퍼블릭 및 프라이빗 모듈을 카탈로그화하고, 모듈에서 불필요한 구현 세부 정보를 추상화하여 사용을 간소화하는 방법을 다룹니다.
모듈성, 설명서, 표준 및 논리적 조직에 대한 코드 기반 구조 지침을 구현하면 팀 간의 광범위한 협업을 지원하는 동시에 Terraform을 조직 전체의 사용량 분산에 따라 유지 관리할 수 있습니다. 규칙과 표준을 적용하면 조각화된 코드 베이스의 복잡성을 피할 수 있습니다.
모범 사례:
표준 리포지토리 구조 구현
다음 리포지토리 레이아웃을 구현하는 것이 좋습니다. 모듈 간에 이러한 일관성 사례를 표준화하면 검색 가능성, 투명성, 조직 및 신뢰성을 개선하는 동시에 여러 Terraform 구성에서 재사용할 수 있습니다.
-
루트 모듈 또는 디렉터리: Terraform 루트
모듈과 재사용 가능한 모듈의 기본 진입점이어야 하며 고유할 것으로 예상됩니다. 아키텍처가 더 복잡한 경우 중첩 모듈을 사용하여 간단한 추상화를 만들 수 있습니다. 이렇게 하면 물리적 객체가 아닌 아키텍처 측면에서 인프라를 설명할 수 있습니다. -
README: 루트 모듈과 중첩된 모듈에는 README 파일이 있어야 합니다. 이 파일의 이름은 이어야 합니다
README.md. 여기에는 모듈에 대한 설명과 모듈의 용도가 포함되어야 합니다. 이 모듈을 다른 리소스와 함께 사용하는 예를 포함하려면examples디렉터리에 배치합니다. 모듈이 생성할 수 있는 인프라 리소스와 그 관계를 보여주는 다이어그램을 포함하는 것이 좋습니다. terraform-docs를 사용하여 모듈의 입력 또는 출력을 자동으로 생성합니다. -
main.tf: 기본 진입점입니다. 간단한 모듈의 경우이 파일에 모든 리소스가 생성될 수 있습니다. 복잡한 모듈의 경우 리소스 생성이 여러 파일에 분산될 수 있지만 중첩된 모듈 호출은
main.tf파일에 있어야 합니다. -
variables.tf 및 outputs.tf: 이러한 파일에는 변수 및 출력에 대한 선언이 포함되어 있습니다. 모든 변수와 출력에는 목적을 설명하는 한 문장 또는 두 문장 설명이 있어야 합니다. 이러한 설명은 설명서에 사용됩니다. 자세한 내용은 변수 구성
및 출력 구성 에 대한 HashiCorp 설명서를 참조하세요. -
모든 변수에는 정의된 유형이 있어야 합니다.
-
변수 선언에는 기본 인수도 포함될 수 있습니다. 선언에 기본 인수가 포함된 경우 변수는 선택 사항으로 간주되며, 모듈을 호출하거나 Terraform을 실행할 때 값을 설정하지 않으면 기본값이 사용됩니다. 기본 인수에는 리터럴 값이 필요하며 구성의 다른 객체를 참조할 수 없습니다. 변수를 필수로 만들려면 변수 선언에서 기본값을 생략하고 설정이
nullable = false적절한지 고려합니다. -
환경과 무관한 값(예:
disk_size)이 있는 변수의 경우 기본값을 제공합니다. -
환경별 값(예:
project_id)이 있는 변수의 경우 기본값을 제공하지 마십시오. 이 경우 호출 모듈은 의미 있는 값을 제공해야 합니다. -
변수를 비워 두는 것이 기본 APIs가 거부하지 않는 유효한 기본 설정인 경우에만 빈 문자열 또는 목록과 같은 변수에 대해 빈 기본값을 사용합니다.
-
변수를 사용할 때는 신중해야 합니다. 각 인스턴스 또는 환경에 따라 변경해야 하는 경우에만 값을 파라미터화합니다. 변수를 노출할지 여부를 결정할 때 해당 변수를 변경하는 구체적인 사용 사례가 있는지 확인합니다. 변수가 필요할 가능성이 작으면 노출하지 마십시오.
-
기본값으로 변수를 추가하는 것은 이전 버전과 호환됩니다.
-
변수 제거는 이전 버전과 호환되지 않습니다.
-
리터럴이 여러 위치에서 재사용되는 경우 변수로 노출하지 않고 로컬 값을 사용해야 합니다.
-
-
출력을 입력 변수를 통해 직접 전달하지 마십시오. 이렇게 하면 종속성 그래프에 제대로 추가되지 않습니다. 암시적 종속성이
생성되도록 하려면가 리소스의 속성을 참조하도록 해야 합니다. 인스턴스의 입력 변수를 직접 참조하는 대신 속성을 전달합니다.
-
-
locals.tf:이 파일에는 표현식에 이름을 할당하는 로컬 값이 포함되어 있으므로 표현식을 반복하는 대신 모듈 내에서 이름을 여러 번 사용할 수 있습니다. 로컬 값은 함수의 임시 로컬 변수와 같습니다. 로컬 값의 표현식은 리터럴 상수로 제한되지 않으며 변수, 리소스 속성 또는 기타 로컬 값을 포함하여 모듈의 다른 값을 참조하여 결합할 수도 있습니다.
-
providers.tf:이 파일에는 terraform 블록
과 공급자 블록 이 포함되어 있습니다. provider블록은 모듈 소비자가 루트 모듈에서만 선언해야 합니다.HCP Terraform을 사용하는 경우 빈 클라우드 블록
도 추가합니다. cloud블록은 CI/CD 파이프라인의 일부로 환경 변수및 환경 변수 자격 증명을 통해 완전히 구성되어야 합니다. -
versions.tf:이 파일에는 required_providers
블록이 포함되어 있습니다. 모든 Terraform 모듈은 Terraform이 이러한 공급자를 설치하고 사용할 수 있도록 필요한 공급자를 선언해야 합니다. -
data.tf: 간단한 구성을 위해 데이터 소스를 참조하는 리소스 옆에 데이터
소스를 배치합니다. 예를 들어 인스턴스를 시작하는 데 사용할 이미지를 가져오는 경우 자체 파일에 데이터 리소스를 수집하는 대신 인스턴스와 함께 배치합니다. 데이터 소스 수가 너무 많아지면 전용 data.tf파일로 이동하는 것이 좋습니다. -
.tfvars 파일: 루트 모듈의 경우
.tfvars파일을 사용하여 민감하지 않은 변수를 제공할 수 있습니다. 일관성을 위해 변수 파일의 이름을 로 지정합니다terraform.tfvars. 리포지토리의 루트에 공통 값을 배치하고envs/폴더 내에 환경별 값을 배치합니다. -
중첩 모듈: 중첩 모듈은
modules/하위 디렉터리 아래에 있어야 합니다. 가 있는 중첩 모듈은 외부 사용자가 사용할 수 있는README.md것으로 간주됩니다.README.md가 없는 경우 모듈은 내부 전용으로 간주됩니다. 중첩 모듈을 사용하여 복잡한 동작을 사용자가 신중하게 선택하고 선택할 수 있는 여러 개의 작은 모듈로 분할해야 합니다.루트 모듈에 중첩 모듈에 대한 호출이 포함된 경우 이러한 호출은 Terraform이 해당 호출을 다시 다운로드하는 대신 동일한 리포지토리 또는 패키지의 일부로 간주
./modules/sample-module하도록와 같은 상대 경로를 사용해야 합니다.리포지토리 또는 패키지에 여러 중첩 모듈이 포함된 경우 직접 서로를 호출하고 깊이 중첩된 모듈 트리를 생성하는 대신 호출자가 구성 가능한 것이 이상적입니다.
-
예: 재사용 가능한 모듈을 사용하는 예는 리포지토리 루트의
examples/하위 디렉터리 아래에 있어야 합니다. 각 예제에 대해 README를 추가하여 예제의 목표와 사용량을 설명할 수 있습니다. 하위 모듈의 예제도 루트examples/디렉터리에 배치해야 합니다.예제는 사용자 지정을 위해 다른 리포지토리로 복사되는 경우가 많으므로 모듈 블록의 소스는 상대 경로가 아니라 외부 호출자가 사용할 주소로 설정되어야 합니다.
-
서비스 명명된 파일: 사용자는 종종 여러 파일의 서비스별로 Terraform 리소스를 분리하려고 합니다. 이 방법은 최대한 사용하지 않는 것이 좋으며 대신에 리소스를 정의해야 합니다
main.tf. 그러나 리소스 모음(예: IAM 역할 및 정책)이 150줄을 초과하는 경우와 같은 자체 파일로 나누는 것이 좋습니다iam.tf. 그렇지 않으면 모든 리소스 코드를에 정의해야 합니다main.tf. -
사용자 지정 스크립트: 필요한 경우에만 스크립트를 사용합니다. Terraform은 스크립트를 통해 생성된 리소스의 상태를 설명하거나 관리하지 않습니다. Terraform 리소스가 원하는 동작을 지원하지 않는 경우에만 사용자 지정 스크립트를 사용합니다. Terraform에서 호출한 사용자 지정 스크립트를
scripts/디렉터리에 배치합니다. -
헬퍼 스크립트:
helpers/디렉터리에서 Terraform에서 호출하지 않는 헬퍼 스크립트를 구성합니다. 설명 및 예제 호출과 함께README.md파일에 헬퍼 스크립트를 문서화합니다. 헬퍼 스크립트가 인수를 수락하는 경우 인수 확인 및--help출력을 제공합니다. -
정적 파일: Terraform이 참조하지만 실행되지 않는 정적 파일(예: EC2 인스턴스에 로드된 시작 스크립트)은
files/디렉터리로 구성되어야 합니다. HCL과 별도로 길이가 긴 문서를 외부 파일에 배치합니다. file() 함수를 사용하여 참조합니다. -
템플릿: Terraform templatefile 함수
가 읽는 파일의 경우 파일 확장명를 사용합니다 .tftpl. 템플릿은templates/디렉터리에 배치해야 합니다.
루트 모듈 구조
Terraform은 항상 단일 루트 모듈의 컨텍스트에서 실행됩니다. 전체 Terraform 구성은 루트 모듈과 하위 모듈 트리(루트 모듈에서 호출하는 모듈, 해당 모듈에서 호출하는 모듈 등 포함)로 구성됩니다.
Terraform 루트 모듈 레이아웃 기본 예제:
. ├── data.tf ├── envs │ ├── dev │ │ └── terraform.tfvars │ ├── prod │ │ └── terraform.tfvars │ └── test │ └── terraform.tfvars ├── locals.tf ├── main.tf ├── outputs.tf ├── providers.tf ├── README.md ├── terraform.tfvars ├── variables.tf └── versions.tf
재사용 가능한 모듈 구조
재사용 가능한 모듈은 루트 모듈과 동일한 개념을 따릅니다. 모듈을 정의하려면 루트 모듈을 정의하는 것처럼 새 디렉터리를 생성하고 내부에 .tf 파일을 배치합니다. Terraform은 로컬 상대 경로 또는 원격 리포지토리에서 모듈을 로드할 수 있습니다. 여러 구성에서 모듈을 재사용할 것으로 예상되는 경우 해당 모듈을 자체 버전 관리 리포지토리에 배치합니다. 모듈을 서로 다른 조합으로 더 쉽게 재사용할 수 있도록 모듈 트리를 비교적 평평하게 유지하는 것이 중요합니다.
Terraform 재사용 가능 모듈 레이아웃 기본 예제:
. ├── data.tf ├── examples │ ├── multi-az-new-vpc │ │ ├── data.tf │ │ ├── locals.tf │ │ ├── main.tf │ │ ├── outputs.tf │ │ ├── providers.tf │ │ ├── README.md │ │ ├── terraform.tfvars │ │ ├── variables.tf │ │ ├── versions.tf │ │ └── vpc.tf │ └── single-az-existing-vpc │ │ ├── data.tf │ │ ├── locals.tf │ │ ├── main.tf │ │ ├── outputs.tf │ │ ├── providers.tf │ │ ├── README.md │ │ ├── terraform.tfvars │ │ ├── variables.tf │ │ └── versions.tf ├── iam.tf ├── locals.tf ├── main.tf ├── outputs.tf ├── README.md ├── variables.tf └── versions.tf
모듈화를 위한 구조
원칙적으로 모든 리소스와 기타 구문을 모듈로 결합할 수 있지만 중첩된 모듈과 재사용 가능한 모듈을 과도하게 사용하면 전체 Terraform 구성을 이해하고 유지 관리하기가 더 어려워질 수 있으므로 이러한 모듈을 조정에 사용하세요.
적절한 경우 구성을 재사용 가능한 모듈로 나누면 리소스 유형으로 구성된 아키텍처의 새로운 개념을 설명하여 추상화 수준을 높일 수 있습니다.
인프라를 재사용 가능한 정의로 모듈화할 때는 개별 구성 요소나 지나치게 복잡한 컬렉션 대신 논리적 리소스 세트를 목표로 하세요.
단일 리소스를 래핑하지 마십시오.
다른 단일 리소스 유형 주위에 얇은 래퍼인 모듈을 생성해서는 안 됩니다. 모듈 내부에 있는 기본 리소스 유형의 이름과 다른 모듈의 이름을 찾는 데 문제가 있는 경우 모듈이 새로운 추상화를 생성하지 않을 수 있습니다. 불필요한 복잡성이 추가됩니다. 대신 호출 모듈에서 직접 리소스 유형을 사용합니다.
논리적 관계 캡슐화
네트워킹 기반, 데이터 계층, 보안 제어 및 애플리케이션과 같은 관련 리소스 세트를 그룹화합니다. 재사용 가능한 모듈은 기능을 활성화하기 위해 함께 작동하는 인프라 부분을 캡슐화해야 합니다.
상속을 평평하게 유지
하위 디렉터리에 모듈을 중첩할 때는 하나 또는 두 개 이상의 레벨을 깊이 이동하지 마십시오. 깊이 중첩된 상속 구조는 구성과 문제 해결을 복잡하게 만듭니다. 모듈은 다른 모듈을 기반으로 빌드해야 합니다. 모듈을 통해 터널을 빌드해서는 안 됩니다.
팀은 아키텍처 패턴을 나타내는 논리적 리소스 그룹에 모듈을 집중하여 신뢰할 수 있는 인프라 기반을 빠르게 구성할 수 있습니다. 과다 엔지니어링 또는 과다 단순화 없이 추상화의 균형을 맞춥니다.
출력의 참조 리소스
재사용 가능한 모듈에 정의된 모든 리소스에 대해 리소스를 참조하는 출력을 하나 이상 포함합니다. 변수와 출력을 사용하면 모듈과 리소스 간의 종속성을 추론할 수 있습니다. 출력이 없으면 사용자는 Terraform 구성과 관련하여 모듈을 올바르게 정렬할 수 없습니다.
환경 일관성, 목적 기반 그룹화 및 내보낸 리소스 참조를 제공하는 잘 구성된 모듈을 사용하면 조직 전체의 Terraform 공동 작업을 대규모로 수행할 수 있습니다. 팀은 재사용 가능한 빌딩 블록에서 인프라를 조합할 수 있습니다.
공급자 구성 안 함
공유 모듈은 공급자를 호출 모듈로부터 상속하지만 모듈은 공급자 설정 자체를 구성해서는 안 됩니다. 모듈에서 공급자 구성 블록을 지정하지 마십시오. 이 구성은 전역적으로 한 번만 선언해야 합니다.
필수 공급자 선언
공급자 구성은 모듈 간에 공유되지만 공유 모듈은 자체 공급자 요구
모듈은 버전 요구 사항을 선언하고 하드 코딩된 공급자 구성을 방지함으로써 공유 공급자를 사용하여 Terraform 구성 전반에서 이식성과 재사용성을 제공합니다.
공유 모듈의 경우의 required_providers 블록versions.tf.
모듈에 특정 버전의 AWS 공급자가 필요하다고 선언하려면 required_providers 블록 내에서 terraform 블록을 사용합니다.
terraform { required_version = ">= 1.0.0" required_providers { aws = { source = "hashicorp/aws" version = ">= 4.0.0" } } }
공유 모듈이 특정 버전의 AWS 공급자만 지원하는 경우 가장 오른쪽 버전 구성 요소만 증분할 수 있는 비관적 제약 연산자(~>)를 사용합니다.
terraform { required_version = ">= 1.0.0" required_providers { aws = { source = "hashicorp/aws" version = "~> 4.0" } } }
이 예제에서는 4.57.1 및의 설치를 ~> 4.0 허용4.67.0하지만의 설치는 허용하지 않습니다5.0.0. 자세한 내용은 HashiCorp 설명서의 버전 제약 조건 구문
이름 지정 규칙 준수
설명이 포함된 명확한 이름은 모듈의 리소스와 구성 값의 목적 간의 관계를 이해하는 데 도움이 됩니다. 스타일 지침과의 일관성은 모듈 사용자와 유지 관리자 모두의 가독성을 향상시킵니다.
리소스 이름 지정 지침을 따릅니다.
-
모든 리소스 이름이 Terraform 스타일 표준과 일치하도록 snake_case(소문자 용어는 밑줄로 구분됨)를 사용합니다. 이 방법은 리소스 유형, 데이터 소스 유형 및 기타 사전 정의된 값에 대한 명명 규칙과의 일관성을 보장합니다. 이 규칙은 이름 인수
에는 적용되지 않습니다. -
유형 중 유일한 리소스(예: 전체 모듈에 대한 단일 로드 밸런서)에 대한 참조를 단순화하려면 리소스의 이름을 지정
main하거나 명확성을this위해를 지정합니다. -
리소스의 목적과 컨텍스트를 설명하고 유사한 리소스(예: 기본 데이터베이스의 경우 , 데이터베이스의 읽기 전용 복제본
primary의read_replica경우 )를 구분하는 데 도움이 되는 의미 있는 이름을 사용합니다. -
복수 이름이 아닌 단수를 사용합니다.
-
리소스 이름에 리소스 유형을 반복하지 마십시오.
변수 이름 지정 지침을 따릅니다.
-
디스크 크기 또는 RAM 크기(예: 기가바이트 단위의
ram_size_gbRAM 크기)와 같은 숫자 값을 나타내는 입력, 로컬 변수 및 출력의 이름에 단위를 추가합니다. 이 방법을 사용하면 구성 유지 관리에 대한 예상 입력 단위가 명확해집니다. -
스토리지 크기에는 MiB 및 GiB와 같은 이진 단위를 사용하고 다른 지표에는 MB 또는 GB와 같은 십진 단위를 사용합니다.
-
와 같은 부울 변수의 양수 이름을 지정합니다
enable_external_access.
첨부 파일 리소스 사용
일부 리소스에는 가상 리소스가 속성으로 포함되어 있습니다. 가능하면 이러한 임베디드 리소스 속성을 사용하지 말고 고유한 리소스를 사용하여 대신 해당 의사 리소스를 연결해야 합니다. 이러한 리소스 관계는 각 리소스에 고유한 cause-and-effect 문제를 일으킬 수 있습니다.
임베디드 속성 사용(이 패턴은 피함):
resource "aws_security_group" "allow_tls" { ... ingress { description = "TLS from VPC" from_port = 443 to_port = 443 protocol = "tcp" cidr_blocks = [aws_vpc.main.cidr_block] ipv6_cidr_blocks = [aws_vpc.main.ipv6_cidr_block] } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] ipv6_cidr_blocks = ["::/0"] } }
첨부 파일 리소스 사용(선호):
resource "aws_security_group" "allow_tls" { ... } resource "aws_security_group_rule" "example" { type = "ingress" description = "TLS from VPC" from_port = 443 to_port = 443 protocol = "tcp" cidr_blocks = [aws_vpc.main.cidr_block] ipv6_cidr_blocks = [aws_vpc.main.ipv6_cidr_block] security_group_id = aws_security_group.allow_tls.id }
기본 태그 사용
태그를 수락할 수 있는 모든 리소스에 태그를 할당합니다. Terraform AWS Provider에는 루트 모듈 내에서 사용해야 하는 aws_default_tags
Terraform 모듈에서 생성한 모든 리소스에 필요한 태그를 추가하는 것이 좋습니다. 다음은 연결할 수 있는 태그 목록입니다.
-
이름: 사람이 읽을 수 있는 리소스 이름
-
AppId: 리소스를 사용하는 애플리케이션의 ID입니다.
-
AppRole: 리소스의 기술 함수. 예: "webserver" 또는 "database"
-
AppPurpose: 리소스의 비즈니스 목적. 예: “frontend ui” 또는 “결제 프로세서”
-
환경: 개발, 테스트 또는 생산과 같은 소프트웨어 환경
-
프로젝트: 리소스를 사용하는 프로젝트
-
CostCenter: 리소스 사용에 대한 청구 대상
Terraform 레지스트리 요구 사항 충족
모듈 리포지토리는 Terraform 레지스트리에 게시할 수 있도록 다음 요구 사항을 모두 충족해야 합니다.
모듈을 단기적으로 레지스트리에 게시할 계획이 없더라도 항상 이러한 요구 사항을 따라야 합니다. 이렇게 하면 리포지토리의 구성 및 구조를 변경할 필요 없이 나중에 모듈을 레지스트리에 게시할 수 있습니다.
-
리포지토리 이름: 모듈 리포지토리의 경우 세 부분으로 구성된 이름을 사용합니다.
terraform-aws-<NAME>여기서는 모듈이 관리하는 인프라 유형을<NAME>반영합니다.<NAME>세그먼트에는 추가 하이픈(예:terraform-aws-iam-terraform-roles)이 포함될 수 있습니다. -
표준 모듈 구조: 모듈은 표준 리포지토리 구조를 준수해야 합니다. 이렇게 하면 레지스트리가 모듈을 검사하고 설명서를 생성하고 리소스 사용량을 추적하는 등의 작업을 수행할 수 있습니다.
-
Git 리포지토리를 생성한 후 모듈 파일을 리포지토리의 루트에 복사합니다. 재사용 가능한 각 모듈을 자체 리포지토리의 루트에 배치하는 것이 좋지만 하위 디렉터리의 모듈을 참조할 수도 있습니다.
-
HCP Terraform을 사용하는 경우 조직 레지스트리에 공유하려는 모듈을 게시합니다. 레지스트리는 HCP Terraform API 토큰을 사용한 다운로드를 처리하고 액세스를 제어하므로 소비자는 명령줄에서 Terraform을 실행하는 경우에도 모듈의 소스 리포지토리에 액세스할 필요가 없습니다.
-
-
위치 및 권한: 리포지토리는 구성된 버전 관리 시스템(VCS) 공급자
중 하나에 있어야 하며, HCP Terraform VCS 사용자 계정에는 리포지토리에 대한 관리자 액세스 권한이 있어야 합니다. 레지스트리는 새 모듈 버전을 가져오기 위해 웹후크를 생성하려면 관리자 액세스 권한이 필요합니다. -
릴리스용 x.y.z 태그: 모듈을 게시하려면 릴리스 태그가 하나 이상 있어야 합니다. 레지스트리는 릴리스 태그를 사용하여 모듈 버전을 식별합니다. 릴리스 태그 이름은 시맨틱 버전 관리를
사용해야 하며, 선택적으로 접두사 v(예:v1.1.0및 )를 사용할 수 있습니다1.1.0. 레지스트리는 버전 번호처럼 보이지 않는 태그를 무시합니다. 모듈 게시에 대한 자세한 내용은 Terraform 설명서를참조하세요.
자세한 내용은 Terraform 설명서의 모듈 리포지토리 준비를
권장 모듈 소스 사용
Terraform은 모듈 블록의 source 인수를 사용하여 하위 모듈의 소스 코드를 찾아 다운로드합니다.
반복되는 코드 요소를 고려하고 기본 Terraform 모듈 레지스트리 또는 여러 구성에서 공유하도록 의도된 모듈에 대한 VCS 공급자를 사용하는 것을 기본 목적으로 하는 밀접하게 관련된 모듈에는 로컬 경로를 사용하는 것이 좋습니다.
다음 예제에서는 모듈 공유를 위한 가장 일반적이고 권장되는 소스 유형을
레지스트리
Terraform 레지스트리:
module "lambda" { source = "github.com/terraform-aws-modules/terraform-aws-lambda.git?ref=e78cdf1f82944897ca6e30d6489f43cf24539374" #--> v4.18.0 ... }
커밋 해시를 고정하면 공급망 공격에 취약한 퍼블릭 레지스트리의 드리프트를 방지할 수 있습니다.
HCP Terraform:
module "eks_karpenter" { source = "app.terraform.io/my-org/eks/aws" version = "1.1.0" ... enable_karpenter = true }
Terraform Enterprise:
module "eks_karpenter" { source = "terraform.mydomain.com/my-org/eks/aws" version = "1.1.0" ... enable_karpenter = true }
VCS 공급자
VCS 공급자는 다음 예제와 같이 특정 개정을 선택하기 위한 ref 인수를 지원합니다.
GitHub(HTTPS):
module "eks_karpenter" { source = "github.com/my-org/terraform-aws-eks.git?ref=v1.1.0" ... enable_karpenter = true }
일반 Git 리포지토리(HTTPS):
module "eks_karpenter" { source = "git::https://example.com/terraform-aws-eks.git?ref=v1.1.0" ... enable_karpenter = true }
일반 Git 리포지토리(SSH):
주의
프라이빗 리포지토리에 액세스하려면 자격 증명을 구성해야 합니다.
module "eks_karpenter" { source = "git::ssh://username@example.com/terraform-aws-eks.git?ref=v1.1.0" ... enable_karpenter = true }
코딩 표준 준수
모든 구성 파일에 일관된 Terraform 형식 지정 규칙 및 스타일을 적용합니다. CI/CD 파이프라인에서 자동 스타일 검사를 사용하여 표준을 적용합니다. 코딩 모범 사례를 팀 워크플로에 포함하면 사용량이 조직 전체에 광범위하게 분산됨에 따라 구성이 읽기 쉽고 유지 관리 가능하며 협업적으로 유지됩니다.
스타일 지침 준수
-
HashiCorp 스타일 표준에 맞게 모든 Terraform 파일(
.tf파일)을 terraform fmt명령으로 포맷합니다. -
terraform validate
명령을 사용하여 구성의 구문과 구조를 확인합니다. -
TFLint
를 사용하여 코드 품질을 통계적으로 분석합니다. 이 린터는 형식을 지정하는 것 이상의 Terraform 모범 사례를 확인하고 오류가 발생하면 빌드에 실패합니다.
커밋 전 후크 구성
커밋을 허용하기 전에 terraform fmt, tflintcheckov, 및 기타 코드 스캔 및 스타일 검사를 실행하는 클라이언트 측 커밋 전 후크를 구성합니다. 이 방법은 개발자 워크플로 초기에 표준 적합성을 검증하는 데 도움이 됩니다.
사전 커밋과 같은 사전 커밋
스타일 및 품질 검사를 로컬 커밋 전 후크로 이동하면 변경 사항이 도입되기 전에 개발자에게 신속한 피드백을 제공할 수 있습니다. 표준은 코딩 워크플로의 일부가 됩니다.