Terraform은 terraform init 명령을 수행하여 Terraform Registry에서 Provider를 가져와 사용합니다. 하지만 폐쇄망 환경에서는 Terraform Registry에 접근할 수 없기 때문에 Provider를 원격으로 설치할 수 없습니다. 이러한 상황에서 Terraform Bundle을 사용하여 문제를 해결할 수 있습니다.
Terraform Bundle은 폐쇄망에서 Terraform Enterprise 혹은 Terraform Cloud를 운영하는 환경에서 Provider를 배포하기 위한 수단으로, 코드에서 사용하게 될 Provider를 미리 말아놓은 파일을 의미합니다. terraform-bundle 툴을 사용하여 Terraform Bundle 파일을 생성할 수 있습니다.
이 가이드는 Terraform Enterprise 폐쇄망에서 Terraform 작업을 수행하기 위해 Bundle 파일을 생성하고, 적용하는 방법을 설명합니다. (Terraform Cloud에서도 테스트 가능)
Terraform Provider : https://developer.hashicorp.com/terraform/language/providers
Terraform Registry : https://registry.terraform.io/
Terraform Bundle Github : https://github.com/hashicorp/terraform/blob/main/tools/terraform-bundle/README.md
인터넷이 가능한 서버와 폐쇄망 서버를 1대씩 준비합니다. 굳이 폐쇄망 환경이 아니어도 테스트에는 지장이 없지만, 상황을 가정하기 위해 폐쇄망 환경을 준비하였습니다.
sudo systemctl disable --now firewalld
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
원활한 테스트를 위해 각 환경의 방화벽을 꺼주세요.
링크를 참고하여 Golang을 설치합니다.
링크를 참고하여 Github를 설치합니다.
환경은 각자 다르기 때문에 다른 방법으로 설치하셔도 괜찮습니다.
terraform-bundle 패키지 가져오기git clone --single-branch --branch=v0.15 --depth=1 https://github.com/hashicorp/terraform.git
cd ./terraform
번들링을 위해 GitHub Repository를 가져옵니다.
terraform-bundle 빌드go build -o ~/terraform-bundle ./tools/terraform-bundle
cd ~/
terraform-bundle Binary를 빌드합니다.
vi ~/terraform-bundle.hcl
terraform {
version = "1.9.5" # Terraform Binary의 Version을 지정합니다.
}
providers {
tfe = { # Provider 명을 지정합니다.
versions = ["0.58.1"] # Provider의 Version을 지정합니다.
}
github = {
versions = ["6.2.3"]
source = "integrations/github" # Provider의 Source를 지정합니다. Source가 hashicorp로 시작하는 경우, 작성하지 않아도 됩니다.
}
aws = {
versions = ["5.64.0"]
}
}
Bundle 명세서는 기존 내용을 대체하는 방식으로 적용됩니다. 따라서 이미 Bundle 파일을 사용 중인 경우, 새로운 Bundle 명세서에 명시되지 않은 Provider는 삭제됩니다. 한번 작성한 명세서를 업데이트하는 방식으로 처리해야 문제가 발생하지 않습니다.
Bundle 파일에 작성될 내용은 아래를 참고하시면 이해하시기 편합니다.

~/terraform-bundle package -os=linux -arch=amd64 ~/terraform-bundle.hcl
Terraform을 실행시키는 OS에 맞게 지정하여 번들링 과정을 수행하여 Bundle 파일을 생성합니다.
scp <Terraform Bundle File> <Target Server>:<Target Path>
생성한 Bundle 파일을 폐쇄망 환경으로 전달합니다.
Bundle은 Terraform Enterprise에 직접적으로 업로드할 수 없습니다. 따라서 GitHub Repository나 웹서버와 같이 업로드하여 URL을 생성할 수 있는 별도의 매개체가 필요합니다. 이번 가이드는 폐쇄망에서 구현해야하기 때문에 Nginx를 활용해보겠습니다.
mkdir nginx-rpm
sudo yum install --downloadonly --downloaddir=./nginx-rpm nginx -y
scp -r ./nginx-rpm <Airgap Server>:<Target Path>
sudo rpm -ivh <Target Path>/nginx-rpm/*.rpm
인터넷 가능한 환경에서 Nginx rpm 파일을 설치한 후, 폐쇄망으로 옮겨 설치합니다.
sudo mv <Bundle File> /usr/share/nginx/html/
폐쇄망에 옮겨놓았던 Bundle 파일을 Nginx 경로로 옮겨서 URL로 접근할 수 있도록 합니다.
wget http://127.0.0.1:80/<Bundle File>
URL을 통해 정상적으로 다운되는지 확인합니다.
sha256sum <Bundle File>
a7c3f7dac1f25161a257146d359f30265d7262cf225f478fd69b3295ec3cdb0e <Bundle File>
Terraform Enterprise에 URL을 입력할 때 Bundle 파일의 SHA256 값을 요구하기 때문에 해당 값이 필요합니다.
아래 사진 순서에 따라 Bundle을 등록합니다.
Admin 버튼 클릭




Version : 해당 버전의 이름을 입력합니다.Enable this version : 해당 버전의 활성화 여부를 선택합니다.URL : Bundle 파일의 URL 경로를 입력합니다. 전에 테스트한 URL 경로를 입력하면 됩니다.SHA256 Checksum : Bundle 파일의 SHA256 값을 입력합니다. 전에 확인한 값을 입력하면 됩니다.아래 사진 순서에 따라 Bundle을 적용합니다.




Bundle은 Workspace 단위로 지정할 수 있습니다.
만약 생성한 Bundle을 모든 Workspace의 기본 값으로 지정하고 싶다면 Version 명을 제일 상단에 오도록 하거나(숫자가 높을수록 위에 노출), Bundle 위에 있는 Version의 Enabled를 체크해제 하시면 됩니다.