Terraform Workflow

kimchigood·2023년 10월 7일
0
post-thumbnail
post-custom-banner

이번 포스팅에서는 terraform workflow에 대해 알아보겠다. (본 포스팅은 Cloud@Net의 T101 스터디를 통해 작성된 것임을 밝힌다.)

Workflow

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

state 파일 관리

Terraform 관련 포스팅에서 항상 강조되어 왔던 것 중 하나가 바로 state 파일이다. 이것도 규모에 따라 설계가 필요한데,

실제로 소규모 인프라 환경의 경우 문제가 없지만, 규모가 커질수록 state 파일에 저장되는 크기도 커지고, plan, apply 시 시간이 많이 소요될 수 있다.

따라서 모듈 별로 state 파일을 관리한다던지, 각 조직의 상황에 맞게 state 파일을 Monolithic이 아닌 MSA 방식으로 사용하는 방법이 있을 수 있다.

출처: https://www.weekly.tf/p/issue-110-splitting-a-monolithic-terraform-state-azure-storage-with-let-s-encrypt-terraform-for-unsu

프로비저닝 파이프라인 설계

기본세팅

아래 디렉토리를 통해 실습이 가능한데, 각자의 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로 바꿔준다.

Github Action

참고: 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:

삭제화면

profile
Shout out to Kubernetes⎈
post-custom-banner

0개의 댓글