본문 바로가기
DevOps/IaC (Infrastructure as Code)

[T1012] Week 6. 테라폼으로 협업하기

by Hwan,. 2023. 8. 13.
728x90
반응형

Git과 PR(Pull Request)을 활용한 협업

 인프라의 규모가 확장되면서 여러 팀원들과 함께 작업하는 상황에서는 동일한 상태 파일을 공유하고 동기화하는 것이 중요해졌다.

 

https://kschoi728.tistory.com/139

 

유형 1은 직접 .tf 파일과 tfstate 파일을 공유하는 방식이다. 이런 방식으로 파일을 공유할 수는 있지만, 수동으로 관리하는 데에는 여러 번거로운 작업들이 포함된다. 이 과정에서 인간의 실수나 정보의 누락이 발생할 수 있기 때문에 이러한 문제점을 해결하고자 버전 관리 시스템(VCS)의 도입이 필요해졌다.

유형 2에서는 VCS(예: git, svn)를 사용하여 해당 파일들을 효율적으로 관리한다. 이를 통해 변경 이력을 체계적으로 추적할 수 있으며, 필요한 경우 이전 버전으로 쉽게 롤백할 수 있게 되었다.

유형 3은 git을 사용하여 .tf 파일을 관리하는 동시에, s3와 같은 백엔드 서비스를 활용하여 tfstate 파일을 안전하게 저장하고 관리하는 방식이다. 이 구조를 사용하면 각 파일의 특성에 맞는 최적화된 관리 방식을 선택할 수 있다.

 

 일반적으로는 유형 3의 구조에서 Git 저장소에 브랜치를 생성한 후 PR을 보내서 작업을 진행하게 된다.

PR은 git으로 코드를 관리할 때 주로 사용되는 브랜치 branch를 이용하는 방법으로 작업자가 코드 수정을 위해 새로운 브랜치를 생성하고 작업한 후 본인의 브랜치를 push하여 코드리뷰 후 Merge를 요청하는 방식이다.

Push와 Pull만으로도 코드 협업이 가능하긴 하지만 이렇게 할 경우, 다른 사람이 작성한 커밋을 확인하기가 쉽지 않고 리모트 저장소에 푸시할 때가 되어야 충돌 상황을 확인 할 수 있다.
PR을 사용하면 작업된 테라폼 코드에 대한 자연스러운 리뷰와 메인스트림 main branch의 병합을 관리하기 수월해진다.

 

이전에 만들었던 Terraform VPC Module에 PR을 보내기 위해 feature 브랜치를 생성했다.

브랜치 생성

작업 후에 PR을 생성하고 main 브랜치에 Merge 해보자.

commit 후 push
open a pull request
comment
merge

 

위 과정을 거치면 다른 브랜치를 통해서 작업한 내용을 main브랜치에 합칠 수 있다.

 


Hashcorp TFC (Terraform Cloud) 백엔드

  위에서 VCS와 PR을 활용하는 방법을 확인했다. 하지만 유형3에서 코드의 관리만큼 중요한 상태 파일의 관리를 해결하지 못했는데,

s3 등의 시스템들을 활용하면 백엔드로 관리하면 상태 파일을 안정적으로 공유할 수 있다. 

그 중 TFC 백엔드에 대해서 정리해보려고 한다.

 

하시코프에서 프로비저닝 대상과 별개로 State를 관리할 수 있도록 SaaS 환경인 TFC를 무상 제공한다.

TFC는 아래 링크로 접속할 수있다. 

https://app.terraform.io/session

 

Terraform Cloud by HashiCorp

 

app.terraform.io

 

먼저, email로 계정을 생성한 뒤 로그인하여 Organizations를 생성한다.

최초 화면

 

hwan001-test-org라는 이름으로 Organizations를 생성했다.

org 생성

 

이제 아래의 코드로 테라폼 파일을 만들어주자.

terraform{
  cloud{
    organization = "hwan001-test-org"      # 생성한 ORG 이름 지정
    hostname     = "app.terraform.io"      # default

    workspaces {
      name = "terraform-aws-collaboration"  # 없으면 생성됨
    }
  }
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = ">= 4.0"
    }
  }
}

provider "aws" {
  region  = "ap-northeast-2"
  # shared_config_files      = ["~/.aws/config"]
  # shared_credentials_files = ["~/.aws/credentials"]
}

module "vpc" {
  source = "git::https://github.com/aws-hwan-001/vpc.git"

  cidr_block             = "10.10.0.0/16"
  tags                   = { Name = "hwan001-vpc" }
  public_subnet_cidr    = "10.10.1.0/24"
  public_subnet_tags    = { Name = "hwan001-public-subnet" }
  private_subnet_cidr    = "10.10.2.0/24"
  private_subnet_tags    = { Name = "hwan001-private-subnet" }
}

 

terraform init을 실행하면 login이 필요하다는 경고가 나온다.

terraform login 명령어를 실행하고 yes를 입력하면 아래처럼 토큰을 생성하는 페이지가 생성(웹에 로그인되어 있을 경우)된다.

토큰생성 페이지

해당 페이지에서 토큰을 생성한 후 복사하고, shell에 입력해주면 아래와 같은 화면이 나오면서 login 된다.

terraform login

 

로그인 후 다시 terraform init을 진행하면 정상적으로 진행되면서 웹UI에서 새로운 프로젝트가 생긴걸 볼 수 있다.

 

배포를 원하는 AWS 계정의 Credential  정보를 아래 경로에 Variable Sets으로 설정해주자.

Settings > Variable Sets

 

이 상태에서 Terraform plan과 apply가 아래처럼 성공하면 아래처럼 state를 TFC에서 확인할 수 있다.

728x90
반응형

댓글