Terraform Study - w06

wdb·2023년 8월 12일

Terraform을 운용하고 있으면 리포지토리를 떠나 모듈을 사용하고 싶어지는 경우가 있을 것입니다.

조직 내에서 module을 사용하고자 하는 경우, 리포지토리를 Public 상태로 전환하는 것애 대해서는 쉽지 않은 결정일 수 있습니다.

Public에 module을 게시하는 것도 하나의 방법이 될 수 있지만, 조직내에서만 사용하는 리포지토리를 Public으로 전환하는 것에 대해서 신중히 고려해야 할 수 있습니다.

이런 경우에는 Terraform Cloud의 Private Registry가 대안이 될 수 있습니다.

Private Registry는 Terraform Cloud의 Free 플랜에서도 사용할 수 있습니다.

https://www.hashicorp.com/products/terraform/pricing

Terraform Cloud의 장점은 다음과 같습니다.

  • State파일 관리를 위해 별도의 리소스를 생성할 필요가 없음
  • 사용자별로 허용 권한을 관리 할 수 있음
  • Sentinel을 사용해 생성할 리소스를 제한 할 수 있음
  • VCS 연동을 통해 자동화가 가능

Terraform Cloud의 단점은 다음과 같습니다.

  • Agent의 수가 정해져 있기 때문에 실행 속도가 느림
  • TFC가 Cloud리소스 생성시 권한이 필요함
  • TFC의 Token을 관리해야 되기 때문에 관리 포인트가 늘 수 있음
  • free tier은 기능제한이 있기 때문에 추가 기능을 위해 라이센스 구매시 비용이 증가함

공개 Terraform Module

Terraform은 모듈을 게시하여 다른 리포지토리에서도 공개한 모듈을 사용하는 것이 가능합니다. 모듈을 공개하는 방식으로는 크게 두 가지가 있습니다.

  • Terraform Resistroy
  • Terrafrom Cloud Private Registry

Public Terrafrom Repository

모듈을 Public에 게시하는 경우 Terraform Registry를 사용할 수 있습니다. Terraform Registry에 공개된 모듈은 전 세계의 모든 사용자가 사용할 수 있습니다. Terraform Repository를 사용하기 위한 조건은 다음과 같습니다.

  • 리포지토리는 Github이며 공개 설정이 Public으로 설정되어 있습니다.
  • 리포지토리의 명명은 terraform-[PROVIDER]-[NAME] 형식으로 되어있어야 합니다.
    - 예) terraform-aws-ec2-instance
  • 리포지토리에 대한 설명이 설정되어 있어야 합니다.
  • 표준 모듈 구조를 준수해야 합니다.
  • 릴리스 태그 이름이 버전을 의미해야 합니다.

Terraform Registry에 가능한 기능은 다음과 같습니다.

  • 조직에 module/provider 게시
  • Public module/provider 등록

Private Registry 첫 번째 특징의 경우 리포지토리의 설정을 Private으로 유지하면서 조직에 모듈을 게시하는 방법이고, 두 번째 방법의 경우 Public 모듈을 이용할 수 있다는 것입니다. 사전에 팀 내에서 승인된 Public 모듈을 등록함으로써 모듈을 승인해야 하는 수고를 덜 수 있습니다.

Private Registry 설정

Registry → Public → Module
<terraform>-<provider>-<name>의 명명 규칙을 따르지 않을 경우, 이용에 제약이 있을 수 있습니다.

Token이 없으면 Terraform Cloud의 Private Registry에서 module을 가져올 수 없습니다. terraform login에서 Token을 이미 만든 경우 Private Registry에서 module을 가져오는 것이 가능합니다.

다른 리포지토리에서 등록한 모듈 사용

등록된 모듈을 사용해야 하는 경우, 등록된 모듈이 있는 샘플 리포지토리를 Fork하고 local 환경으로 Clone합니다.

provider "aws" {
  region = var.region
}

  
module "s3-webapp" {
  source  = "app.terraform.io/[Oragnization名]/s3-webapp/aws"
  name    = var.name
  region  = var.region
  prefix  = var.prefix
  version = "1.0.0"
}

1개의 댓글

comment-user-thumbnail
2023년 8월 12일

좋은 글 감사합니다. 자주 올게요 :)

답글 달기