DevOps BootCamp/Iac

Git Action + Terraform을 통한 자동화

cloudmaster 2023. 8. 15. 12:03

Summary

  • 테라폼을 이용하여 인프라를 관리할 수 있다.
  • aws의 s3, dynamodb를 이용하여 테라폼 백엔드를 구축하여 비용 효율적으로 tfstate를 관리한다.
  • GitOps를 활용하여 인프라 프로비저닝을 자동화 할 수 있다.

 

GitOps란?

 

GitOps는 클라우드 네이티브 애플리케이션을 위한 지속적인 배포를 구현하는 방법입니다.

 

GitOps의 핵심 아이디어는 현재 프로덕션 환경에서 원하는 인프라에 대한 선언적 설명을 항상 포함하는 Git 저장소와 프로덕션 환경이 저장소의 설명된 상태와 일치하도록 하는 자동화된 프로세스를 갖는 것 입니다. 

 

새 응용 프로그램을 배포하거나 기존 응용 프로그램을 업데이트하려는 경우 저장소만 업데이트하면 됩니다.


출처 - https://s-core.co.kr/insight/view/데브옵스의-확장-모델-깃옵스gitops-이해하기-2/

 

에스코어

에스코어는 디지털 혁신을 위한 고급 프로페셔널 서비스를 제공합니다. 매니지먼트 컨설팅과 소프트웨어 테크놀로지 서비스 오퍼링을 살펴보세요.

s-core.co.kr

 

GitOps 진행 과정

  1. Github Action
    a. [branch] main - push
    b. pull_request
  2. Github Action이 트리거 되며 인프라 관리 시작
  3. AWS credentials를 이용하여 액세스 키에 접속하여 필요한 서비스를 구축
  4. terraform init이 실행
    a. 등록된 S3 버킷의 tfstate 파일을 참조
    b. 등록된 DynamoDB의 Table의 lock 파일을 참조
    c. 인프라 생성에 필요한 리소스를 참조
  5. terraform plan이 실행되며 푸쉬된 테라폼 파일을 이용하여 정상적으로 인프라가 구축될 것인지 확인
  6. 이상이 없다면, terraform apply -auto-approve -input=false가 실행되어 인프라를 구축
# terraform.yaml
name: 'Terraform'

on:
  push:
    branches:
    - "main"
  pull_request:

env:
  AWS_REGION: ap-northeast-2   # set this to your preferred AWS region, e.g. us-west-1

permissions:
  contents: read

jobs:
  terraform:
    name: 'Terraform'
    runs-on: ubuntu-latest
    environment: production

    # Use the Bash shell regardless whether the GitHub Actions runner is ubuntu-latest, macos-latest, or windows-latest
    defaults:
      run:
        shell: bash

    steps:
    # Checkout the repository to the GitHub Actions runner
    - name: Checkout
      uses: actions/checkout@v3

    # AWS 리소스를 이용하기 위해서 추가
    - name: Configure AWS credentials
      uses: aws-actions/configure-aws-credentials@v1
      with:
        aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
        aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
        aws-region: ${{ env.AWS_REGION }}

    # Initialize a new or existing Terraform working directory by creating initial files, loading any remote state, downloading modules, etc.
    - name: Terraform Init
      run: terraform init

    # Checks that all Terraform configuration files adhere to a canonical format
    - name: Terraform Format
      run: terraform fmt -check

    # Generates an execution plan for Terraform
    - name: Terraform Plan
      run: terraform plan -input=false

      # On push to "main", build or change infrastructure according to Terraform configuration files
      # Note: It is recommended to set up a required "strict" status check in your repository for "Terraform Cloud". See the documentation on "strict" required status checks for more information: https://help.github.com/en/github/administering-a-repository/types-of-required-status-checks
    - name: Terraform Apply
#      if: github.ref == 'refs/heads/"main"' && github.event_name == 'push'
	  if: github.ref == 'refs/heads/main' && github.event_name == 'push'
      run: terraform apply -auto-approve -input=false

 

Terraform Backend 란?

Backend는 Terraform이 state 데이터 파일을 저장하는 위치를 정의한다.

 

테라폼은 tfstate를 이용하여 현재 선언한 리소스를 추적한다.

 

tfstate에는 중요한 정보도 포함되기 때문에, Github 또는 외부로 노출되어있는 코드 저장소에 올라가지 않도록 주의하여야 한다.

 

S3 및 DynamoDB로 백엔드를 관리할때의 장점

  • 완전 관리형 서비스이므로 운영 부담이 발생하지 않는다.
  • 현재 GitOps로 관리하고자 하는 인프라 역시 AWS 리소스를 주로 사용하므로 별도의 관리 포인트가 추가 되지 않는다.

 

Backend

# backend.tf

provider "aws" {
  region = "ap-northeast-2" # Please use the default region ID
}

# S3 버킷을 생성한다
resource "aws_s3_bucket" "for_tfstate" {
  bucket = "xgro-tfstate"
}

# S3 버킷의 버저닝 기능 활성화 선언한다.
resource "aws_s3_bucket_versioning" "tfstate" {
  bucket = aws_s3_bucket.for_tfstate.bucket

  versioning_configuration {
    status = "Enabled"
  }
}

# DynamoDB for terraform state lock
resource "aws_dynamodb_table" "terraform_state_lock" {
  name         = "terraform-lock"
  hash_key     = "LockID"
  billing_mode = "PAY_PER_REQUEST"

  attribute {
    name = "LockID"
    type = "S"
  }
}

 

Workspace

# main.tf

# Required providers configuration
terraform {
  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = "~> 4.6.0"
    }
  }

  backend "s3" {
    bucket         = "missionlink-tfstate"
    key            = "terraform.tfstate"
    region         = "ap-northeast-2"
    dynamodb_table = "terraform-lock"
    encrypt        = true
  }

  required_version = ">= 1.0.11"
}

data "aws_region" "current" {}
data "aws_caller_identity" "current" {}

 

✅ 참조 레퍼런스

'DevOps BootCamp > Iac' 카테고리의 다른 글

Terraform module 사용 방법  (0) 2023.07.04
Terraform x AWS - Iac를 이용한 인프라 구축  (0) 2023.05.17
Terraform x AWS  (0) 2023.05.16
Terraform 기본 명령어  (0) 2023.05.12
Infrastructure as Code (코드형 인프라)  (0) 2023.05.12