연재 시리즈

테라폼 시리즈 26편. terraform pre-commit

악분 2022. 11. 12. 00:08
반응형

1. git pre-commit hook

1.1 개요

git hook pre commit은 커밋 메시지를 작성하기 전에 호출됩니다. 만약 종료(Exit)코드가 0이 아니면 사용자가 요청한 커밋은 취소됩니다. 민감정보 검사, lint검사 등 커밋을 하기 위한 필요조건을 검사할 때 사용할 수 있습니다.

 

git init 또는 git clone을 하면 .git폴더가 생성됩니다. 그리고 .git/hooks폴더에 hook예제가 있습니다. 확장자 .sample을 제거하면 git hook이 동작합니다.

cd .git/hooks
ls

 

1.2 예제

git commit이 항상 실행되지 못하도록 pre-commit파일을 수정하겠습니다. pre-commit.sample파일에서 .sample확장자를 제거합니다. 그리고 파일 내용은 종료코드가 1이 되도록 설정합니다. 종료코드 1은 git commit을 실패하도록 합니다.

 

예제 test.txt파일을 생성하고 git add, git commit명령어를 실행해봅시다. git commit이 실패하고 작성한 에러 메세지가 출력됩니다.

touch test.txt
git add test.txt
git commit -m "test"

 

2. python pre-commit

2.1 개요

git hook 관리의 불편한점은 사용자가 git hook파일을 수동으로 설정해야 합니다. git clone을 하더라도 hook파일은 clone하지 않아, 사용자가 수동으로 hook파일을 복붙해야합니다.

 

hook 수동설정 불편함을 개선하는 많은 도구가 있는데요. python pre-commit은 파이썬으로 pre-commit을 관리합니다.

 

2.2 설치방법

pip install pre-commit으로 쉽게 설치할 수 있습니다.

pip install pre-commit

 

pre-commit은 .pre-commit-config.yaml 설정파일을 읽어서 hook플러그인을 실행합니다. sample-config명령어로 예제 설정파일을 만들 수 있습니다.

pre-commit sample-config > .pre-commit-config.yaml

 

repos필드에 hook플러그인 목록을 설정할 수 있습니다. hook플러그인 실행을 통과하지 않으면 commit이 실패합니다.

# See https://pre-commit.com for more information
# See https://pre-commit.com/hooks.html for more hooks
repos:
-   repo: https://github.com/pre-commit/pre-commit-hooks
    rev: v3.2.0
    hooks:
    -   id: trailing-whitespace
    -   id: end-of-file-fixer
    -   id: check-yaml
    -   id: check-added-large-files

 

pre-commit install 명령어를 실행하면 .git/hooks/pre-commit파일이 생성됩니다.

pre-commit install

 

 pre-commit파일 내용을 확인하면 pre-commit 플러그인을 실행하는 내용이 있습니다.

 

2.3 예제

pre-commit 플러그인이 잘 실행되는지 실습해보겠습니다. pre-commit 예제설정파일에는 줄 끝에 공백을 허용하지 않는 “trailing-whitespace” 플러그인이 있습니다. 일부로 줄 끝에 공백이 있는 파일을 생성하면 git commit이 실패합니다.

echo "test " > test.txt
git add test.txt

 

git commit 명령어를 실행하면 “trailing-whitespace” 플러그인을 통과하지 못해 commit을 하지 못합니다. pre-commit의 장점은 통과하지 못한 플러그인이 다음 commit명령어를 수행할 때 성공할 수 있도록 내용을 수정합니다. 다시 git commit 명령어를 실행하면 commit이 성공합니다.

git commit -m "test"

 

3. terraform pre-commit

terraform pre-commit은 테라폼과 관련된 python pre-commit플러그인입니다. 테라폼 코드 보안, lint 등 검사를 commit전에 검사합니다. 검사를 통과하지 못하면 commit이 실패하지만 자동으로 통과하지 못한 코드를 수정합니다.

 

terraform pre-commit을 사용하려면 .pre-commit-config.yaml파일에 아래처럼 설정하면 됩니다. id필드에 사용할 hook목록을 설정합니다. hook목록은 공식문서(https://github.com/antonbabenko/pre-commit-terraform#available-hooks)에서 볼 수 있습니다.

repos:
- repo: https://github.com/antonbabenko/pre-commit-terraform
  rev: <VERSION> # Get the latest from: https://github.com/antonbabenko/pre-commit-terraform/releases
  hooks:
    - id: terraform_fmt
    - id: terraform_docs

 

3.1 terraform_fmt

테라폼 코드를 예쁘게 포맷팅합니다. .pre-commit-config.yaml설정은 아래와 같습니다.

repos:
- repo: https://github.com/antonbabenko/pre-commit-terraform
  rev: v1.76.0
  hooks:
    - id: terraform_fmt

 

indent가 정렬되지 않는 상태에서 git commit명령어를 실행하면 terraform_fmt hook이 자동으로 indent설정을 합니다.

 

3.2 terraform_tflint

사용하지 않는 코드 등을 검사하는 lint입니다. 바이너리 설치가 필요합니다.

# window
choco install tflint

# linux
curl -s https://raw.githubusercontent.com/terraform-linters/tflint/master/install_linux.sh | bash

# mac
brew install tflint

 

.pre-commit-config.yaml설정은 아래와 같습니다.

repos:
- repo: https://github.com/antonbabenko/pre-commit-terraform
  rev: v1.76.0
  hooks:   
    - id: terraform_tflint
      args:
        - --args=--module
        - --args=--enable-rule=terraform_documented_variables

 

예제로 사용하지 않은 variable가 있는 파일을 git commit했습니다. 사용하지 않는 variable이 있다고 commti을 실패합니다.

 

3.3 Terraform docs

테라폼 코드를 해석하여 문서를 작성하는 hook입니다. 바이너리 설치가 필요합니다.

# window
choco install terraform-docs

# linux
curl -Lo ./terraform-docs.tar.gz https://github.com/terraform-docs/terraform-docs/releases/download/v0.16.0/terraform-docs-v0.16.0-$(uname)-amd64.tar.gz
tar -xzf terraform-docs.tar.gz
chmod +x terraform-docs
mv terraform-docs /usr/local/terraform-docs

# mac
brew install terraform-docs

 

.pre-commit-config.yaml설정은 아래와 같습니다.

repos:
- repo: https://github.com/antonbabenko/pre-commit-terraform
  rev: v1.76.0
  hooks:
    - id: terraform_docs
      args:
        - --hook-config=--path-to-file=README.md        # Valid UNIX path. I.e. ../TFDOC.md or docs/README.md etc.
        - --hook-config=--add-to-existing-file=true     # Boolean. true or false
        - --hook-config=--create-file-if-not-exist=true # Boolean. true or false

 

테라폼 예제코드는 variable, aws_db_instance를 사용했습니다.

provider "aws" {
  region = "ap-northeast-2"
}

variable "db_username" {
  type        = string
  description = "사용자 이름"
}

variable "db_password" {
  type        = string
  description = "비밀번호"
}

resource "aws_db_instance" "myrds" {
  identifier_prefix   = "t101-sensitivedata"
  engine              = "mysql"
  allocated_storage   = 10
  instance_class      = "db.t2.micro"
  skip_final_snapshot = true

  db_name  = "sensitive_example"
  username = var.db_username
  password = var.db_password
}

 

git commit을 실행하면 README.md문서가 자동으로 생성됩니다.

반응형