본문 바로가기
Cloud

[AWS] Terraform과 github action연동하기

by C곰군 2025. 2. 13.

안녕하세요?

곰군 입니다.


본 글에서는 Terraform과 github action을 연동하여 테라폼 코드의 변경사항을 자동으로 하는 AWS 계정에 반영하는 시간을 가져보겠습니다.

관련 아키텍처 및 동작 방식

동작방식

  • Github Repository에 소스가 Push되면 GIthub Action이 자동으로 변경 내용 인식
  • 인식 후 GIthub Action에 설정된 workflow 실행
  • 실제 계정에 Terraform 코드 내용 반영
    * 실행 과정 로그 확인 가능

 

Github 설정 내용

Github Action을 활용하기 위해서는 하기 내용을 설정해야 합니다.

  • Github Repository
  • workflows yml파일
  • AWS 액세스키

    위 내용을 하기 작업 순서 항목에서 좀 더 자세히 설명하겠습니다.

작업 순서

  1. Github Repository 생성

  2. Terraform code 업로드

    테라폼 코드는 각자 작성하시면 됩니다.
    저는 멀티 계정에서 테라폼을 사용하는 것을 테스트하기 위해서 s3를 backend 저장소로 사용하고 계정에는 간단하게 vpc를 생성하는 코드를 작성해서 테스트 하였습니다.
  3. workflows yml 파일 작성
    하이 예시 코드 처럼 내용을 작성합니다.
name: "Terraform CI"

on:
  push:
    branches:
      - main
    paths:
      - 'terraform_test/src/modules/**'

jobs:
  terraform:
    name: "Terraform"
    runs-on: ubuntu-latest
    environment: production # 환경 이름을 지정하거나 제거할 수 있습니다.
    steps:
      - name: Checkout
        uses: actions/checkout@v2
        with:
          fetch-depth: 0

      - name: Setup Terraform
        uses: hashicorp/setup-terraform@v1
        with:
          terraform_version: 1.0.1

      - name: Configure AWS Credentials
        run: |
          aws configure set aws_access_key_id ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws configure set aws_secret_access_key ${{ secrets.AWS_SECRET_ACCESS_KEY }}
          aws configure set default.region ca-central-1

      - name: Get Changed Directories
        id: get_changed_dirs
        run: |
          git fetch --all
          CHANGED_DIRS=$(git diff --name-only ${{ github.event.before }} ${{ github.sha }} | grep 'terraform_test/src/modules/' | xargs -I {} dirname {} | uniq)
          echo "CHANGED_DIRS=$CHANGED_DIRS" >> $GITHUB_ENV

      - name: Terraform Init and Apply for Each Changed Directory
        if: env.CHANGED_DIRS
        run: |
          for DIR in $CHANGED_DIRS; do
            if [ -d "$DIR" ]; then
              echo "Initializing and applying Terraform in $DIR..."
              cd "$DIR"
              terraform init
              terraform apply -auto-approve
            else
              echo "$DIR is not a directory. Skipping..."
            fi
          done

워크플로우 트리거:
push 이벤트가 발생할 때, main 브랜치에서만 작동합니다.
paths에 정의된 대로, terraform_test/src/modules/ 하위의 파일들이 변경될 때만 이 워크플로우가 트리거됩니다. 이 경로에서만 파일이 변경되었을 때 Terraform 작업이 실행됩니다.

Jobs:
terraform이라는 이름의 job이 실행됩니다.
이 job은 ubuntu-latest 환경에서 실행되며, production 환경을 사용합니다.

Steps:
Checkout: 현재 브랜치의 코드를 체크아웃합니다.
Setup Terraform: Terraform 1.0.1 버전을 설정합니다.
AWS Credentials 설정: AWS 자격 증명을 설정하는 명령어를 실행합니다.
Get Changed Directories: git diff 명령어로 terraform_test/src/modules/ 경로의 변경된 디렉터리들을 확인합니다. 변경된 디렉터리 목록은 $CHANGED_DIRS라는 환경 변수로 저장됩니다.
Terraform Init 및 Apply: 변경된 디렉터리들에 대해 순차적으로 terraform init 및 terraform apply -auto-approve를 실행합니다.-> 자동으로 apply 적용하기 위한 설정으로 실제 적용 시는 변경하시는게 안전합니다.

4. AWS 키정보 설정
설정 -Secrets and variables에 키 내용을 넣습니다.
실제 액션 수행 시에 위에 설정한 yml 파일에서 secrets.AWS_ACCESS_KEY_ID 이렇게 키 내용을 가져옵니다.

Github Action 실제 실행하기

Gitgub Action을 실제 실행하는 방법은 간단합니다.
path에 등록된 리파지토리에 변경이 일어나면 자동으로 트리거 됩니다.
작업이 시작되면 하기 이미지와 같이 큐에 작업 내용이 들어갑니다.

위 코드의 terraform apply 내용을 plan으로 바꿔서 간단하게 테스트 해봤습니다.
vpc와 관련된 네트워크 내용으로 리소스 15개가 add가 된다는 내용입니다.

완료가 되면 하기와 같이 완료 내용을 정리하고 로그로 남겨줍니다.

여기까지 Github Actions을 활용하여 테라폼 CI/CD를 자동화하는 방법에 대한 내용을 간단하게 알아보는 시간을 가졌습니다. 테라폼은 편리하지만 또 위험한 도구로 검토없이 apply를 할 경우 운영중인 리소스에 큰 영향을 줄 수 있습니다. 깃허브 액션에서도 plan 내용을 검증하고 apply를 하는 스탭을 만들 수 있으니 실제 활용에는 꼭 적용해서 진행하시길 바랍니다.

댓글