GitLab에서 Terraform template 사용하기

강재민·2023년 10월 15일
0
post-custom-banner

인프라 관리

데브옵스와 SRE의 요구사항이 많아지면서 인프라를 코드로, 자동화하여 관리하게 되었다. 인프라가 코드로 관리가 가능해지면서, 데브옵스 라이프사이클 전체를 완성시키게 된다. GitLab은 다양한 기능을 통해 인프라 관리를 단순화하고 속도를 높여줄 수 있다.


IaC

GitLab은 다양한 절차를 지원하고 IaC를 실행시킬 수 있는 테라폼과의 연동을 지원한다. 테라폼은 클라우드 인프라를 기준으로 구성된다. 다양한 GitLab 통합기능은 다음과 같은 도움을 준다.

  • 기본 설정 없이 빠르게 시작할 수 있다.
  • merge request와 같은 코드변화를 활용해서 인프라를 변화시키는 협업을 진행할 수 있다.
  • 모듈 저장기능을 활용해서 확장시킬 수 있다.

Terraform과 GitLab을 활용한 IaC

GitLab으로 인프라를 관리하기 위해, 테라폼과 통합하여 버저닝하고, 재사용하고, 공유하며 리소스를 정의할 수 있다.

  • 인프라 단계인 compute, storage, networking resource들을 관리할 수 있다.
  • 배포 단계인 DNS, SaaS 기능 들을 관리할 수 있다.
  • GitOps 배포와 IaC를 조합해서 워크플로우를 만들 수 있다.
  • GitLab을 Terraform state storage로 사용할 수 있다.
  • 복잡한 인프라 유형들을 모듈화해서 저장하고 사용할 수 있다.

테라폼으로 프로젝트 통합하기

GitLab CI/CD를 통해 GitLab과 Terraform을 통합한다. include를 사용해서 템플릿을 사용할 수 있다.

시작하기위해, 가장 적합한 템플릿을 선택해보자.

  • 최신 Terrafrom 템플릿
  • 안정적인 그리고 고도화된 템플릿

모든 템플릿:

  • Terraform state storage backend로서 GitLab-managed Terraform state를 사용할 수 있다.
  • test, validate, build, deploy를 파이프라인 스테이지에서 트리거할 수 있다.
  • test, validate, plan, plan-json같은 명령어를 실행시킬 수 있고 default 브랜치에 대해서만 apply도 실행시킬 수 있다.
  • IaC Scanning을 활용해서 보안 문제도 체크할 수 있다.

최신 Terraform 템플릿

최신 Terraform 템플릿은 가장 최신의 GitLab 버전과 호환됩니다. 이 템플릿은 가장 최근의 GitLab 기능을 제공합니다. 하지만 잠재적으로 해당 기능은 바뀔 수 있습니다.

다음과 같은 상황에서 사용할 수 있습니다.

  • GitLab.com을 사용하는 경우
  • 매 번 최신 GitLab relaese로 업그레이드 해서 self-managed instance를 사용하는 경우

https://gitlab.com/gitlab-org/gitlab/-/blob/master/lib/gitlab/ci/templates/Terraform.latest.gitlab-ci.yml


안정적인 그리고 고도화된 템플릿

만약 당신이 GitLab을 이전버전으로 사용하고 있다면, GitLab version과 template version간에 호환선 문제가 발생할 수 있습니다. 이럴 때는 아래 템플릿들을 사용할 수 있습니다.


Terraform 템플릿 사용하기

  1. .gitlab-ci.yml파일을 수정합니다.
  2. inclue를 사용해서 테라폼 템플릿을 추가합니다.
include:
 # To fetch the latest template, use:
  - template: Terraform.latest.gitlab-ci.yml
 # To fetch the advanced latest template, use:
  - template: Terraform/Base.latest.gitlab-ci.yml
 # To fetch the stable template, use:
  - template: Terraform.gitlab-ci.yml
 # To fetch the advanced stable template, use:
  - template: Terraform/Base.gitlab-ci.yml
  1. 변수와 설명을 추가합니다.
variables:
 TF_STATE_NAME: default
 TF_CACHE_KEY: default
 # If your terraform files are in a subdirectory, set TF_ROOT accordingly. For example:
 # TF_ROOT: terraform/production

GitLab으로 Terraform state 관리하기

테라폼은 인프라 구성의 디테일한 내용들을 저장하기 위해 state file을 사용합니다. Terraform의 remote backends를 사용하면, 원격에 그리고 공유된 저장소에 state file을 저장할 수 있습니다.

GitLab은 안전하게 최소한의 구성으로 state file을 저장하기 위해 Terraform HTTP backend 기능을 제공합니다.

GitLab에서 다음과 같은 기능을 사용할 수 있습니다.

  • Terraform state file 버전관리
  • state file을 보내고 저장할 때 암호화
  • state 파일을 Lock 하고 unlock
  • 원격으로 terraform plan 또는 terraform apply 명령어 실행하기

Disaster reconvery planning
GitLab을 활용해 Terraform state file을 구성했을 경우 GitLab이 단일 실패지점이 되면 안됩니다. GitLab에서 암, 복호화가 이루어 지기 때문에 GitLab의 가용성을 꼭 고려하시기 바랍니다.


사전 요구사항

self-managed GitLab에서, Terraform state file을 구성하기 전에 다음과 같은 사항을 확인하세요.

  • admin에서 Terraform state storage가 반드시 구성되어 있어야합니다.
  • 프로젝트에 Infrastructure 메뉴가 활성화 되어있어야합니다.
    • Settings > General > expand Visibility, project features, permissions, Infrastructure 토글을 켜주세요.

GitLab CI/CD를 활용해서 backend로서 Terraform state 초기화하기

terraform init 명령어를 실행하고, GitLab CI/CD를 사용해서 terraform 명령어를 사용할 수 있습니다.

사전 요구사항:

  • terraform apply에 의해 lock하고, unlock하고 state를 수정하기 위해서, 최소 Maintainer role이 필요합니다.
  • terraform plan -lock=false를 사용하여 state를 읽기 위해서, 최소 Developer role 이상이 필요합니다.

    GitLab에서는 Terraform plan data 결과가 job artifact로 떨어지게 됩니다. 이때 다른 사용자들이 해당 아티팩트에 있는 민감한 정보를 열람할 수 있기 때문에, setting the artifact’s public flag to false (public: false) 를 통해서 볼 수 없게 막아놓는 것이 중요합니다.

GitLab CI/CD로 backend를 구성하기
1. Terraform project에서 아래와같이 backend.tf 파일을 구성합니다.

terraform {
  backend "http" {
  }
}
  1. 루트 디렉토리에서 .gitlab-ci.yml파일을 생성하여 Terraform.gitlab-ci.yml 템플릿의 내용을 입력합니다.
  2. project에 코드를 push하고 gitlab-terraform init, gitlab-terraform validate, gitlab-terraform plan 명령어 등등을 실행합니다.
  3. 수동으로 deply job을 실행합니다.

끝으로.. 이밖에도 GitLab을 활용해 Kubernetes와 연동하여 인프라를 관리할 수도 있습니다.

post-custom-banner

0개의 댓글