Gitlab CI/CD는 Continuous Intergration, Delivery.. 등의 파이프라인을 Gitlab과 연동해 사용하게끔 해주는 소프트웨어 툴입니다.
Gitlab과 GItlab CI/CD의 연동을 통해서 GItlab repository에 저장된 코드를 바탕으로 다양한 Continuous 방법론을 사용할 수 있습니다.
Terraform은 기존에 GUI, 혹은 명령어로 생성해야 했던 클라우드 리소스를 코드로써 관리할 수 있게끔 해주는 툴입니다.
두 소프트웨어를 연동함으로써 Gitlab repository에 저장된 테라폼 코드를 수정 -> Commit -> Push 하는 것만으로 리소스가 실제로 배치될 수 있도록 할 수 있습니다.
이번 포스팅에서는 VS code에서 Terrafom을 GItlab CI/CD와 연동해 자동화된 GCP IaaC 파이프라인을 구축하는 방법에 대해서 알아보겠습니다.
1. 사전 준비 사항
본 포스팅에서는 이미 사용자가 Terraform과 GItlab을 사용할 수 있는 상태라고 가정합니다.
실제로 Pipeline을 구축하기 전에 필요한 요소를 준비합니다.
a. GCP Service account
b. Gitlab runner server
c. GItlab CI/CD varialbles 설정
a. GCP Service account
Gitlab의 CI/CD pipeline은 GItlab runner라는 어플리케이션을 통해 실행됩니다. 이 GItlab runner가 GCS에 존재하는 tfstate파일을 접근할 수 있으려면 Service account key가 필요합니다.
GCP web console의 IAM&Admin -> Service accounts에서 GItlab runner가 사용할 Service account를 생성합니다.
이후 IAM&Admin -> IAM에서 생성한 Service account에 Storage object admin 권한을 부여합니다.
b. Gitlab runner server
이제 실제 Pipeline을 실행하는 Gitlab runner 어플리케이션을 설치합니다.
GItlab server가 접근할 수 있는 네트워크 환경 위에 Gitlab runner를 위한 GCE를 하나 생성하고 그 위에 어플리케이션을 설치하도록 합니다.
Gitlab runner 인스턴스에서 다음 명령어를 실행해 어플리케이션을 설치하고 실행합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
|
# Download the binary for your system
sudo curl -L --output /usr/local/bin/gitlab-runner https://gitlab-runner-downloads.s3.amazonaws.com/latest/binaries/gitlab-runner-linux-amd64
# Give it permissions to execute
sudo chmod +x /usr/local/bin/gitlab-runner
# Create a GitLab CI user
sudo useradd --comment 'GitLab Runner' --create-home gitlab-runner --shell /bin/bash
# Install and run as service, Go to CI/CD runner page to get REGISTRATION TOKEN
sudo gitlab-runner install --user=gitlab-runner --working-directory=/home/gitlab-runner
sudo gitlab-runner start
|
cs |
GItlab runner 설치 과정에서 Registration token과 URL을 요구받게 됩니다. 여기에 필요한 정보는 Gitlab project -> settings -> CI/CD -> Runners에서 찾을 수 있습니다.
c. GItlab CI/CD varialbles 설정
이제 Pipeline을 실행하는데 필요한 변수들을 지정하겠습니다.
우선 Service account key 값을 등록하기 위해 GItlab runner에 Service account key를 생성합니다.
Gitlab runner에서 다음 명령어를 실행해 Key를 생성하고 base64 포맷으로 변경합니다.
1
2
|
gcloud iam service-accounts keys create
cat serviceaccount.json | base64 -w0 > serviceaccount.base64
|
cs |
위에서 얻은 값들을 Gitlab CI/CD 변수로 지정하기 위해 Gitlab project -> settings -> CI/CD -> variables로 진입합니다.
다음 "Add Variable"을 클릭한뒤 GOOGLE_APPLICATION_CREDENTIAL에 원본 Service account key의 값을,
SERVICEACCOUNT에 base64 Service account key의 값을 등록합니다.
2. Gitlab CI/CD Pipeline 구축
이제 사전 준비 사항이 모두 준비되었으니 본격적으로 Pipeline을 구축해보겠습니다.
Gitlab 프로젝트의 레포지토리에 미리 아래와 같은 파일들을 생성합니다.
backend.tf
1
2
3
4
5
6
|
terraform {
backend "gcs" { #remote backend
credentials = "./creds/serviceaccount.json" #Bucket access에 필요한 Service account key
bucket = "GITLAB_BUCKET_NAME" #State file을 저장할 bucket
}
}
|
cs |
provider.tf
1
2
3
4
5
|
provider "google" { #Provider
credentials = "${file("./creds/serviceaccount.json")}" #GCP resource 변경에 필요한 service account key
project = "GCP_PROJECT_ID" #GCP Project ID
region = "asia-northeast3" #Region
}
|
cs |
main.tf
1
2
3
4
5
6
7
8
|
resource "google_compute_disk" "NSdMJ" {
name = "NAME"
physical_block_size_bytes = 4096
project = "GCP_PROJECT_ID"
size = 30
type = "pd-balanced"
zone = "asia-northeast3-a"
}
# ... 생성,변경할 Terraform resource |
cs |
.gitlab-ci.yml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
image:
name: hashicorp/terraform:light
entrypoint:
- '/usr/bin/env'
- 'PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
before_script:
- rm -rf .terraform
- terraform --version
- mkdir -p ./creds
- sudo chmod 777 ./creds/serviceaccount.json
- echo $SERVICEACCOUNT | base64 -d > ./creds/serviceaccount.json
- terraform init
stages:
- validate
- plan
- apply
validate:
stage: validate
script:
- terraform validate
plan:
stage: plan
script:
- terraform plan -out "planfile"
dependencies:
- validate
artifacts:
paths:
- planfile
apply:
stage: apply
script:
- terraform apply -input=false "planfile"
dependencies:
- plan
when: manual
|
cs |
위의 .gitlab-ci.yml 파일이 Gitlab Runner가 실행할 pipeline에 대한 명세입니다.
레포지토리의 테라폼 Configuration 파일에 변경이 일어날 경우, pipeline은 자동으로 terraform validate -> terraform plan -> terraform apply를 차례로 실행합니다.
현재 apply 단계는 수동으로 실행해야 하도록 설정했습니다. 필요하면 완전 자동화로 실행할 수 있습니다.
3. Pipeline 테스트
이제 모든 준비가 끝났습니다. 이제 실제 테라폼 파일의 변경을 통해 Pipeline이 실행되는 과정을 살펴보겠습니다.
Terraform configuration 파일인 main.tf에 추가하고자 하는 리소스를 입력합니다.
변경사항을 GItlab 리포지토리에 Push합니다.
GItlab project -> CI/CD -> pipelines로 진입하면 현재 실행되고 있는 Pipeline의 목록을 볼 수 있습니다. git push와 동시에 Pipeline 하나가 자동으로 실행됩니다.
각 stage를 클릭하면 실제 작업이 진행되는 경과를 확인할 수 있습니다. 디버깅에 유용합니다. 현재는 validate와 plan stage만 "passed" 단계에 있는 것을 볼 수 있습니다.
모든 단계에서 이상이 없음을 확인했다면 이제 리소스를 실제로 생성하기 위한 apply stage를 수동으로 실행합니다.
apply 단계도 Pass되었다면 실제 리소스가 생성되었는지 확인합니다.
GCP 콘솔에서 생성하고자 했던 GCS 버켓이 실제로 생성된 것을 확인할 수 있습니다.
실제로 사용자가 했던 액션은 테라폼 configuration 변경 -> git commit -> git push 뿐이지만,
Gitlab CI/CD pipeline이 나머지 액션을 수행해 결과적으로 실제 리소스 생성까지 자동으로 실행할 수 있었습니다.
4. 마무리
이렇게 GItlab + Terraform을 연동해 IaaC 작업을 자동화하는 Pipeline을 구축했습니다.
요즘 CI/CD pipeline 구축은 리소스를 관리하는데 필수적인 요소로 자리잡고 있습니다.
기존에는 개발자 영역의 Code만을 자동화했었지만, 이렇게 인프라 엔지니어 영역의 Code도 자동화함으로써 운영에 대한 부담을 덜 수 있습니다.
본 포스팅을 읽는 분들이 많은 도움을 받으셨으면 합니다.
'Devops' 카테고리의 다른 글
Kubernetes에 존재하는 Metrics Server란 무엇일까? 그리고 어떻게 해야 잘 사용할 수 있을까? (1) | 2022.06.26 |
---|---|
Apache Kafka란? Apache Kafka를 Kubernetes에서 구성해보자 (1) | 2022.06.16 |
Mysql Operator로 Kubernetes 환경에서 Mysql DB 운영하기 (3) | 2022.05.31 |
오픈소스 컨테이너 레지스트리 Harbor로 컨테이너 레지스트리 간 복제 수행하기 (0) | 2022.05.15 |
Skaffold + buildpack 으로 쉽게 CI/CD Kubernetes pipeline 구성하기 (0) | 2021.07.30 |