본문 바로가기

카테고리 없음

T101(CloudNet@) - 4주차(중간 과제)

CloudNet@ Gasida(가시다)님과 함께 4번째 온라인 스터디를 진행하고 있습니다. T101은 Terraform 스터디이며, Terraform Up & Running 책을 기반으로 진행하고 있습니다. 

4주차에서 김진웅님 발표 세션을 듣고 Terraform Pipeline에 관심이 생겨 해당 내용을 중간 과제로 설정한 후 적용해보고 싶었다. Pipeline이라는 단어를 떠올리면 CI/CD가 생각나는데, Terraform Pipeline은 Terraform 코드를 배포할 때 일련의 과정을 거치면서 코드를 검증한 후 배포하는 프로세스를 의미한다.(일련의 과정이란, hook을 통해 설정 가능하다.) 이 프로세스의 각 단계 마다 정확히 어떤 검증을 할 수 있는지, 어떻게 동작하고, 적용해야 하는 지 정리해보려고 한다.

 

아래 링크인 pre-commit-terraform이라는 오픈소스를 통해서 Hook 형태의 Pipeline을 구성할 수 있다.

https://github.com/antonbabenko/pre-commit-terraform

 

GitHub - antonbabenko/pre-commit-terraform: pre-commit git hooks to take care of Terraform configurations 🇺🇦

pre-commit git hooks to take care of Terraform configurations 🇺🇦 - GitHub - antonbabenko/pre-commit-terraform: pre-commit git hooks to take care of Terraform configurations 🇺🇦

github.com

.pre-commit-config.yaml 내 hook을 단계별로 정의할 수 있고, 설정 가능한 hook은 위 링크를 참조하면 된다. 모든 hook을 사용하는 것도 방법이겠지만, 그럴 경우 Pipeline이 오래 돌아가기 때문에 필요한 hook만 올려서 사용 하는 게 좋을 것 같다. (테스트를 완료한 이후 작성하고 있는데, 적용하는 게 꽤 쉽다.)

 

가장 먼저, hook에서 사용할 수 있는 서비스들을 설치한다. (테스트는 Mac 환경에서 진행했으며, 아래 명렁어들도 Mac OS를 기준으로 한다.)

brew install pre-commit terraform-docs tflint tfsec checkov terrascan infracost tfupdate minamijoyo/hcledit/hcledit jq

pre-commit hook 설치 진행

이제 Pipeline을 구성하는 YAML 파일을 작성해야 한다. (.pre-commit-config.yaml) 아래 코드는 GitHub에서 가져온 샘플 코드다.

git init
cat <<EOF > .pre-commit-config.yaml
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
EOF

위 코드에서 rev 값을 tags로 업데이트 해줘야 한다. 이 글을 작성하는 2022-11-09(수)을 기준으로 가장 최신 태그는 1.76.0이다.

작성한 .pre-commit-config.yaml은 아래와 같다.

repos:
  - repo: https://github.com/antonbabenko/pre-commit-terraform
    rev: v1.76.0 # Ref :: https://pre-commit.com/#adding-pre-commit-plugins-to-your-project
    hooks:
      - id: terraform_fmt

      - id: terraform_providers_lock
        args:
          - --args=-platform=windows_amd64
          - --args=-platform=darwin_amd64

      - id: terraform_docs
        args:
          - --hook-config=--path-to-file=README.md
          - --hook-config=--add-to-existing-file=true
          - --hook-config=--create-file-if-not-exist=true

tfsec

tfsec을 hook에 추가하고 싶었는데, 스터디에서 진행한 코드가 스터디 목적으로 작성한 코드라서 보안을 고려하지 않은 코드라서 취약점에 잔뜩 걸릴 것 같았다. 테스트를 위해 임시로 추가(- id: terraform_tfsec)한 후 commit을 진행해봤다. 그 결과, 아래 이미지와 같이 0.0.0.0/0 Any로 오픈되어 있는 보안그룹들이 tfsec에 의해 발견됐다. 

4주차 코드까지 총 24개의 .tf 파일에서 보안 취약점이 발견됐다. 재밌다고 생각한 건, Impact도 명시되고, More information 부분에 참고할 수 있는 링크까지 제공한다. 

tf fmt

commit을 처음 진행하게 되면, fmt(format)에 걸리는 .tf 설정 파일들이 있기 때문에 fmt 부분에서 Failed 결과를 받게 된다. 

이후 commit을 다시 하면 Passed로 바뀌는 것을 알 수 있다. 

infracost

infracost는 작성한 코드의 요금을 추정할 수 있는 서비스이며, 인스턴스 유형과 같은 비용이 변경되는 부분을 수정하고 commit하게 되면 비용의 증감을 확인할 수 있다. tfsec과 마찬가지로 테스트를 위해 임시로 설정 파일에 infracost를 추가했다. 

 

- id: infracost_breakdown
  args:
    - --args=--path=./env/dev
  verbose: true # Always show costs

 

infracost는 API Key를 필요로 하는데, 해당 설정없이 commit할 경우, 아래 이미지와 같이 에러가 발생한다.

infracost 인증을 위해 로그인을 하면 웹 페이지가 하나 열린다.

GitHub을 통해 로그인하게 되면, 아래 이미지와 같이 인증에 성공한다. 

infracost 명령어를 통해 현재 디렉터리에 있는 전체 workspace의 비용을 확인해봤다. 

pre-commit 명령어를 실행하면 디렉터리 내 하위 전체 workspace에 infracost가 생성되는 것을 알 수 있다. 

terraform_docs

김진웅님 발표를 보면서(들으면서) 제일 신기했던 서비스였는데, Terraform 코드를 읽고 READ.md에 input과 output에 대한 문서를 자동으로 작성해준다. 설정 파일을 수정하고 commit을 하면 하위 디렉터리 내 README.md 파일이 모두 생성된 것을 알 수 있다. 

GitHub에 들어가봐도 확인 가능하다. 

pre-commit-config GitHub 링크를 참고해서 필요한 hook을 가져다가 써보는 재미가 있다. 테스트를 거친 후에 필요한 hook만 가져다가 운영에 반영해도 좋을 것 같다.

 

끝으로 T101 스터디를 진행한지 딱 한 달이 되었다. 현업에서 Terraform을 도입하는 중이기도 하고, 오랜만에 Gasida님과 함께 하는 스터디라서 재밌게 참여하고 있다. 잘하시는 분들도 많아서 동기부여도 되고, 여러 좋은 정보들을 공유해주셔서 감사할 따름이다 :)