이번 포스팅에서는 terraform workflow에 대해 알아보겠다. (본 포스팅은 Cloud@Net의 T101 스터디를 통해 작성된 것임을 밝힌다.)
Workflow라고 하면 보통 Git Workflow에 대해 많이 들어본 적이 있다. Terraform도 마찬가지로, Write -> Plan -> Apply 의 단계로 Workflow 설계가 필요하다.
소규모인 환경에서는 개인이 그냥 Write, Plan, Apply를 할 수 도 있지만, VCS를 통하여, 동료들에게 검증을 받고 배포하는 안전한 방법을 택할 수 있을 것이다.
규모가 커짐에따라 한 Team의 여러 동료들이 Terrform을 협업해서 관리할 수도 있고, 더 큰 규모에서는 Team 별로 각각의 Terraform을 관리하는 방법이 있다.
출처: https://itnext.io/pains-in-terraform-collaboration-249a56b4534e?gi=9611473679eb
Terraform 관련 포스팅에서 항상 강조되어 왔던 것 중 하나가 바로 state 파일이다. 이것도 규모에 따라 설계가 필요한데,
실제로 소규모 인프라 환경의 경우 문제가 없지만, 규모가 커질수록 state 파일에 저장되는 크기도 커지고, plan, apply 시 시간이 많이 소요될 수 있다.
따라서 모듈 별로 state 파일을 관리한다던지, 각 조직의 상황에 맞게 state 파일을 Monolithic이 아닌 MSA 방식으로 사용하는 방법이 있을 수 있다.
아래 디렉토리를 통해 실습이 가능한데, 각자의 github에 forking 해서 사용하도록 하자.
TFC 관련 세팅이 필요한데 이전 포스팅 을 참조하자.
git clone https://github.com/terraform101/terraform-aws-github-action
git repo clone 후 .github/workflow/action.yml 파일을 수정해주자.(숨김파일이므로 디렉토리를 찾아 들어가면 보인다.)
env:
MY_PREFIX: DEV
TF_VERSION: 1.5.6 # 1.2.5에서 변경
main.tf 수정
terraform {
cloud {
organization = "<MY_ORG_NAME>" # 생성한 ORG 이름 지정
hostname = "app.terraform.io" # default
workspaces {
name = "terraform-aws-github-action"
}
}
github에 push 하기 (token 필요)
git add .
git commit -m "update main.tf & action.yml
git push origin main
terraform init
terraform init 후 TFC에서 확인해보면,
github action 관련 workspace가 생겼다. Execution 세팅은 Local로 바꿔준다.
참고: https://developer.hashicorp.com/terraform/tutorials/automation/github-actions#prerequisites
참조: https://github.com/Azure-Samples/terraform-github-actions
전체적인 Workflow는 위 그림과 비슷하다.
민감변수 세팅
해당 저장소의 [Setting] → [Secrets and variables - Actions] 선택 ⇒ 새로운 민감 변수 등록 [New repository secret]
- TF_API_TOKEN : TFC의 기존 사용 토큰(credentials.tfrc.json 에 저장됨) 또는 신규 토큰을 생성해 입력
- AWS_ACCESS_KEY_ID : AWS Access Key 입력
- AWS_SECRET_ACCESS_KEY : AWS Secret Access Key 입력
해당 저장소에 [Actions] - [Workflow permissions] 수정
# 확인 (빠져나오기 q)
git branch
git branch -M add-env-variable
# 확인 (빠져나오기 q)
git branch
main.tf 수정
resource "aws_vpc" "hashicat" {
cidr_block = var.address_space
enable_dns_hostnames = true
tags = {
name = "${var.prefix}-vpc-${var.region}"
environment = var.environment # 원래 값 Production
}
}
variable.tf 내용 추가
variable "environment" {
type = string
description = "Define infrastructure’s environment"
default = "dev"
validation {
condition = contains(["dev", "qa", "prod"], var.environment)
error_message = "The environment value must be dev, qa, or prod."
}
}
github push
terraform fmt
git add .
git commit -m "add env variable"
git push origin HEAD
PR 날리기
PR이 완료가 되면 Github Action을 통해 terraform scan 및 plan, apply 가 되어 리소스가 생성된다.
(실습 중 제대로 세팅을 해서 PR을 날렸는데, Github Action이 실행되지 않는 이슈가 있었다. 다시 variable.tf description을 수정하고 PR 날리고 승인하니 되었는데 좀 이상하다..)
Destory
gitaction.yml 파일을 아래와 같이 수정 후 PR 날리고 승인하면 destory 된다.
name: Terraform DEV Destroy
on:
workflow_dispatch:
env:
MY_PREFIX: DEV
TF_VERSION: 1.5.6
jobs:
Terraform:
name: Terraform
runs-on: ubuntu-latest
steps:
- name: Check out code
uses: actions/checkout@v3
- uses: hashicorp/setup-terraform@v2
with:
terraform_version: $TF_VERSION
cli_config_credentials_token: ${{ secrets.TF_API_TOKEN }}
- name: Terraform init
id: init
run: terraform init -upgrade
# working-directory: ${{ env.working-directory }}
- name: Terraform validate
id: validate
run: terraform validate -no-color
- name: Terraform destroy
id: Destory
run: terraform destroy -auto-approve -var=prefix="$MY_PREFIX"
env:
AWS_ACCESS_KEY_ID: ${{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
단, 아래 세팅은 수동방식이므로 Action 페이지에서 수동으로 run 시켜주면 된다.
on:
workflow_dispatch:
삭제화면