테라폼 모듈

Telapom Modyul



인프라 프로비저닝 및 관리 세계에서 Terraform은 개발자와 운영 팀 사이에서 인기 있는 선택으로 부상했습니다. 선언적 구문(HCL – HashiCorp 구성 언어) 및 다양한 인프라 공급자에 대한 지원을 통해 Terraform은 코드형 인프라(IaC) 사례를 가능하게 합니다.

핵심 기능 중 하나는 모듈식 인프라 코드를 만들고 재사용할 수 있는 모듈을 사용하는 것입니다. 이 기사에서는 Terraform 모듈의 개념과 인프라 코드를 구성하고 단순화하는 데 도움이 되는 방법을 살펴봅니다.







Terraform 모듈 소개

Terraform 모듈은 정의된 입력 및 출력 변수가 있는 리소스 세트를 나타내는 자체 포함된 Terraform 구성 패키지입니다. 복잡한 인프라 배포를 보다 쉽게 ​​관리하고 유지 관리할 수 있도록 인프라 코드를 캡슐화하고 재사용하는 방법을 제공합니다.



모듈은 프로젝트 내에서 내부적으로 생성 및 사용하거나 여러 프로젝트 또는 팀에서 공유할 수 있습니다.



모듈 구성

Terraform 모듈을 구성할 때 루트 모듈과 자식 모듈로 구성된 계층 구조를 갖는 것이 일반적입니다. 이 조직이 어떻게 작동하는지 살펴보겠습니다.





루트 모듈



루트 모듈은 Terraform 구성에서 최상위 모듈을 나타냅니다. 전체 인프라를 정의하고 서로 다른 리소스 간의 관계를 관리하기 위한 진입점입니다.

루트 모듈에는 일반적으로 인프라의 기반을 형성하는 리소스 및 구성을 정의하는 'main.tf' 파일이 포함되어 있습니다. 선택적으로 'variables.tf' 및 'outputs.tf' 파일을 포함할 수 있습니다. 또한 하위 모듈에 쉽게 액세스할 수 있도록 루트 디렉토리 내에 'modules' 디렉토리를 정의할 수 있습니다.

하위 모듈

자식 모듈은 특정 리소스 또는 구성 집합을 캡슐화하는 모듈식 구성 요소입니다. 재사용이 가능하도록 설계되었으며 자체 포함된 인프라 기능 단위를 나타냅니다.

하위 모듈은 구성 및 복잡한 인프라 구축을 허용하는 루트 또는 기타 하위 모듈 내에서 사용할 수 있습니다. 각 하위 모듈에는 일반적으로 'main.tf', 'variables.tf' 및 'outputs.tf'와 같은 필수 구성 파일이 포함된 디렉토리가 있습니다.

이제 Terraform 모듈을 만드는 방법을 살펴보겠습니다.

Terraform 모듈 생성

Terraform 모듈을 만들 때 필요한 Terraform 구성 파일이 있는 모듈의 새 디렉터리를 만들어야 합니다. 일반적으로 해당 디렉토리의 이름은 'modules'입니다. 프로젝트의 루트 디렉터리 내에서 정의하는 것이 가장 좋습니다.

Docker를 사용하여 로컬 웹 서버를 프로비저닝하는 간단한 모듈의 쉬운 예를 들어 보겠습니다. 먼저 'modules' 디렉토리의 모듈을 'main.tf'로 정의합니다.

자원 'docker_container' '웹 서버' {
이름 = 변수 이름
이미지 = var.image
포트 {
내부 = var.internal_port
외부 = var.external_port
}
}

여기서는 컨테이너 이름, Docker 이미지, 내부 포트 및 외부 포트를 입력 변수로 사용하는 'docker_container'라는 모듈을 만듭니다. 이 모듈은 논리를 캡슐화하여 Docker 컨테이너 리소스를 만들고 호출자가 컨테이너의 속성을 사용자 지정할 수 있도록 합니다.

다음 이미지에서 볼 수 있듯이 'modules' 디렉토리에 'variables.tf'라는 별도의 파일을 생성하여 모듈을 사용할 때 사용자 정의할 수 있는 입력 변수를 정의합니다.

변하기 쉬운 '이름' {
설명 = 'Docker 컨테이너 이름'
유형 = 문자열
}

변하기 쉬운 '영상' {
설명 = '도커 이미지'
유형 = 문자열
}

변하기 쉬운 'internal_port' {
설명 = 'Docker 컨테이너의 내부 포트'
유형 = 숫자
}

변하기 쉬운 '외부_포트' {
설명 = '매핑할 외부 포트'
유형 = 숫자
}

여기에서 우리는 4개의 변수를 선언했습니다. 각각 'description'과 'type'을 속성으로 사용하고 관련 값을 지정했습니다.

Terraform 모듈 사용

모듈을 만들었으므로 이제 해당 소스를 참조하여 기본 Terraform 구성에서 모듈을 사용할 수 있습니다. 루트 디렉토리에 'main.tf'라는 기본 구성 파일을 만들어 봅시다.

기준 치수 '웹서버_컨테이너' {
원천 = '../modules/docker_container'
이름 = '마이웹서버'
이미지 = 'nginx:최신'
내부_포트 = 80
외부_포트 = 8080
}

이전 코드에서 'module' 블록을 사용하여 Docker 컨테이너 모듈을 인스턴스화합니다. 컨테이너 이름, Docker 이미지, 포트 구성 등 모듈에 필요한 입력 값을 제공합니다. 'source' 매개변수는 'module' 디렉토리에 대한 상대 경로를 지정합니다.

다음으로 Terraform 출력을 사용하여 모듈과 함께 사용하는 방법을 살펴보겠습니다.

모듈 출력

Terraform의 모듈 출력은 모듈 내에서 특정 값을 노출하는 방법을 제공하여 기본 구성 또는 다른 모듈에서 사용할 수 있도록 합니다. 이들은 모듈과 추가 구성 또는 의사 결정에 유용하거나 필요할 수 있는 정보 또는 데이터를 모듈이 제공할 수 있도록 하는 호출자 간의 통신 채널 역할을 합니다.

산출 'container_id' {
설명 = '생성된 Docker 컨테이너의 ID'
값 = docker_container.webserver.id
}

여기에서 'modules' 디렉토리 안에 'outputs.tf' 파일을 만들었습니다. 이 출력 변수는 모듈 내에서 'webserver'라는 'docker_container' 리소스에 의해 생성된 Docker 컨테이너의 ID를 노출합니다.

이제 루트 구성 파일에서 컨테이너 ID에 액세스할 수 있습니다. 루트 디렉토리에 있는 'main.tf' 파일의 다음 업데이트된 코드를 참조하십시오.

기준 치수 '웹서버_컨테이너' {
원천 = '../modules/docker_container'
이름 = '마이웹서버'
이미지 = 'nginx:최신'
내부_포트 = 80
외부_포트 = 8080
}

자원 'docker_volume' '데이터' {
# 나머지 인수는 여기에 갑니다.
묶다 = module.webserver_container.container_id
}

'bind' 인수의 값으로 'module.webserver_container.container_id'를 사용하여 'web_container' 모듈의 컨테이너 ID로 지정된 위치에 Docker 볼륨을 바인딩하도록 Terraform에 지시합니다. 이렇게 하면 도커 볼륨 리소스와 'webserver_container' 모듈이 생성한 컨테이너 간의 관계가 설정되어 볼륨이 적절한 위치에 마운트되도록 합니다.

Terraform 모듈에 대한 모범 사례

재사용을 위한 모듈화

모듈을 설계할 때 재사용성을 고려해야 합니다. 또한 인프라의 논리적 구성 요소 또는 패턴을 식별하고 이를 별도의 모듈로 캡슐화해야 합니다. 이를 통해 코드 재사용, 표준화 및 팀 간 협업이 쉬워집니다.

명확하고 일관된 이름 지정

모듈, 변수 및 리소스에 대해 명확하고 일관된 명명 규칙을 사용하면 코드베이스에 대한 가독성과 이해가 향상되어 다른 사람들이 모듈을 더 쉽게 사용하고 유지 관리할 수 있습니다.

종속성 분리

모듈 간의 긴밀한 결합을 피해야 합니다. 각 모듈은 자체 리소스와 종속성을 캡슐화해야 합니다. 이렇게 하면 모듈을 독립적으로 재사용할 수 있고 더 나은 격리 및 캡슐화를 촉진할 수 있습니다.

버전 제어 및 모듈 레지스트리

버전 제어 저장소 또는 모듈 레지스트리에 모듈을 게시할 수 있습니다. 이는 모듈 공유 및 검색을 위한 중앙 집중식 위치를 제공하여 쉬운 액세스 및 버전 관리를 보장합니다.

결론

Terraform 모듈에 대해 간략하게 소개하고 간단한 예제를 통해 모듈을 생성하는 방법을 배웠습니다. 그런 다음 유연성, 재사용성 및 유지 관리성을 향상시키기 위해 모듈과 함께 변수 및 출력을 사용하는 방법을 살펴보았습니다. 결론적으로 Terraform 모듈은 인프라 코드를 구성하고 단순화하는 강력한 도구입니다. 이를 통해 일련의 리소스 또는 구성을 코드형 인프라 프로젝트 내에서 모듈성, 재사용성 및 협업을 촉진하는 재사용 가능한 구성 요소로 캡슐화할 수 있습니다.