[Terraform] Binary 및 Provider 번들링 (CentOS)

gweowe·2024년 12월 18일

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. 서버 준비

인터넷이 가능한 서버폐쇄망 서버를 1대씩 준비합니다. 굳이 폐쇄망 환경이 아니어도 테스트에는 지장이 없지만, 상황을 가정하기 위해 폐쇄망 환경을 준비하였습니다.

2. 방화벽 OFF

sudo systemctl disable --now firewalld
sudo sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config

원활한 테스트를 위해 각 환경의 방화벽을 꺼주세요.

Bundle 파일 생성 (인터넷이 가능한 서버)

1. 필수 패키지 설치

링크를 참고하여 Golang을 설치합니다.

링크를 참고하여 Github를 설치합니다.

환경은 각자 다르기 때문에 다른 방법으로 설치하셔도 괜찮습니다.

2. terraform-bundle 패키지 가져오기

git clone --single-branch --branch=v0.15 --depth=1 https://github.com/hashicorp/terraform.git
cd ./terraform

번들링을 위해 GitHub Repository를 가져옵니다.

3. terraform-bundle 빌드

go build -o ~/terraform-bundle ./tools/terraform-bundle
cd ~/

terraform-bundle Binary를 빌드합니다.

4. Bundle 명세서 작성

vi ~/terraform-bundle.hcl
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 파일에 작성될 내용은 아래를 참고하시면 이해하시기 편합니다.

스크린샷 2024-09-03 오후 4.42.56

5. 번들링 과정 수행

~/terraform-bundle package -os=linux -arch=amd64 ~/terraform-bundle.hcl

Terraform을 실행시키는 OS에 맞게 지정하여 번들링 과정을 수행하여 Bundle 파일을 생성합니다.

6. Bundle 파일 폐쇄망으로 전송

scp <Terraform Bundle File> <Target Server>:<Target Path>

생성한 Bundle 파일을 폐쇄망 환경으로 전달합니다.

Bundle 파일 업로드

Bundle은 Terraform Enterprise에 직접적으로 업로드할 수 없습니다. 따라서 GitHub Repository나 웹서버와 같이 업로드하여 URL을 생성할 수 있는 별도의 매개체가 필요합니다. 이번 가이드는 폐쇄망에서 구현해야하기 때문에 Nginx를 활용해보겠습니다.

1. 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 파일을 설치한 후, 폐쇄망으로 옮겨 설치합니다.

2. Bundle 업로드

sudo mv <Bundle File> /usr/share/nginx/html/

폐쇄망에 옮겨놓았던 Bundle 파일을 Nginx 경로로 옮겨서 URL로 접근할 수 있도록 합니다.

3. 테스트

wget http://127.0.0.1:80/<Bundle File>

URL을 통해 정상적으로 다운되는지 확인합니다.

4. sha256sum 확인

sha256sum <Bundle File>
Output:
a7c3f7dac1f25161a257146d359f30265d7262cf225f478fd69b3295ec3cdb0e  <Bundle File>

Terraform Enterprise에 URL을 입력할 때 Bundle 파일의 SHA256 값을 요구하기 때문에 해당 값이 필요합니다.

Bundle 적용

1. Bundle 등록

아래 사진 순서에 따라 Bundle을 등록합니다.

Admin 버튼 클릭

스크린샷 2024-12-17 오전 11.17.23

Terraform Versions 버튼 클릭

스크린샷 2024-12-17 오전 11.18.00

Add Terraform version 버튼 클릭

스크린샷 2024-12-17 오전 11.18.41

네모 안의 값을 입력한 후, Add Terraform version 버튼 클릭

스크린샷 2024-12-17 오전 11.24.32

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

2. Bundle 적용

아래 사진 순서에 따라 Bundle을 적용합니다.

Workspace 선택

스크린샷 2024-12-17 오전 11.32.13

Settings 버튼 클릭

스크린샷 2024-12-17 오전 11.32.44

생성한 Bundle Version 선택

스크린샷 2024-12-17 오전 11.33.16

Save settings 버튼 클릭하여 저장

스크린샷 2024-12-17 오전 11.33.37

Bundle은 Workspace 단위로 지정할 수 있습니다.

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

profile
정리하는 공간

0개의 댓글