Terraform 개발 가이드 (draft)

문서소개

Terraform 개발 작업을 할때의 가이드

일단 내용은 나중에 채우고 이렇게는 하지 말자부터 조심하자.

문서이력

To do list

협업작업시 주의사항

이렇게는 하지 말자!

  • terraform resource name에 dev, prd 등은 넣지 말자. terraform 코드는 dev, prd 등 여러 환경에서 재사용할 수 있는 것을 고려해야 한다. 

resource "aws_key_pair" "dev_site_key" # bad resource "aws_key_pair" "site_key" # good

환경설정

로컬 개발 pc에 세팅시 참고 사항

direnv 이용하여 디렉토리별 환경설정

direnv 설치 및 설정 : 각 디렉토리별 환경변수 설정을 다르게 할 수 있어 편리함.

direnv를 사용한 디렉토리(프로젝트) 별 개발환경 구축: 루비, 파이썬, 노드 개발 환경 구축

$ brew install direnv # sudo apt-get install direnv $ touch ~/.gitignore_global $ git config --global core.excludesfile ~/.gitignore_global $ echo '.envrc' > ~/.gitignore_global $ echo '.direnv' >> ~/.gitignore_global

vscode등이 아니라 쉘상에서 코드를 수정할 경우 branch 명이 헷갈리다. 그래서 bash prompt를 수정해서 branch 명을 나오도록 하면 편리하다. 아래 내용 반영하여 쓰면 된다.

How do I show the git branch with colours in Bash prompt?

taejoon@taejoon-PC:~/project/iac(main)$ git branch

로컬 개발 pc에 AWS account 설정

aws key를 AWS_PROFILE 형태로 관리를 하면 한곳에서 AWS key를 관리할 수 있는 이점이 있고 사용시에도 편리하다. direnv 에서도 간단하게 사용할 AWS_PROFILE을 설정할 수 있다.  .envrc 를 git에 올라가지 않도록 설정할 수 있기는 하지만  실수하면 올라갈 수 있는 위험이 있는데 AWS_PROFILE 형태로 하면 key가 노출될 위험이 줄어든다.

$ cat ~/.aws/config [default] region=ap-northeast-2 output=text ….. [profile gw-dev] region=ap-northeast-2 $ cat ~/.aws/credentials ….. [gw-dev] aws_access_key_id = xxxxxxxxxxxxxxx aws_secret_access_key = xxxxxxxxxxxxxxxxxx $ cat gw-dev/.envrc export AWS_PROFILE=gw-dev

참고로 aws cli 설치시 명령완성 기능을 사용하면 편리하다. 에서 명령 완료 구성 AWS CLI - AWS Command Line Interface

terraform 용 AWS iam 계정

전체 권한을 가진 terraform 용 AWS iam 계정을 사용한다. iam user는 terraform 이다.

terraform iam 계정은 보안에 신경을 써야 함.

terraform 설치 및 버전 관리

1.1.7 에 맞춤.

local terraform 버전은 작업자가 같은 버전을 사용하고 업데이트를 할 경우에도 모두 함께 업데이트를 함. 버전별로 실행이 안되는 경우가 있을 수 있음.

terraform 설치는 버전관리를 위해서 tfenv 이용을 함. (terraform 설치Install Terraform | Terraform | HashiCorp Developer )

 

  • tfenv 이용한 terraform 버전 관리

terraform 여러개의 버전을 쓸 경우에는 tfenv를 활용할 수 있다. tfenv use 를 이용하여 기본 버전을 지정하고 다른 버전을 사용하려고 하면 해당 디렉토리에 .terraform-version  파일을 두면 된다. (하위폴더까지 적용이 됨)

https://github.com/tfutils/tfenv

terraform plugin_cache_dir 설정

각 terraform 코드에서 중복해서 플러그인을 받지 않고 캐쉬 이용하도록 설정

git 설정

gitignore 설정 https://github.com/github/gitignore/blob/main/Terraform.gitignore

git workflow

git에서 commit을 할 때는 Jira 이슈 번호를 넣어줌.

pre-commit 설정

Github Action 과 Terraform 사전 커밋 후크의 지속적인 통합

문서 참고하여 terraform_fmt, terraform_validate, terraform_docs, terraform_tflint 설치. commit 하기 전에

terraform 보안체크

terraform 보안코드 분석

tfsec, terrascan 설치하여 코드 commit 하기 전에 체크. 초반에는 보안 관련한 정책을 모두 이해하는 것은 아니기에 참고만 할 수 있음.

클라우드에 리소스 배포를 한 경우에는 AWS Compliance Scanning Tool 이용하여 보안 체크를 함.

코드 가이드라인

README 파일 만들기 : README 파일 필수

main.tf : variables, data, module 호출. 

output.  작업 성격에 따라서 main.tf 의 내용을 특정 AWS resource에 따라 여러 개의 파일로 구분할 수 있다.

provider.tf : region, profile 지정

terraform.tfvars : 변수

backend.tf : remote state 설정

https://github.com/jonbrouse/terraform-style-guide 등 참고.

Strings are in double-quotes.

Spacing : Use 2 spaces 

Resource Block Alignment

Terraform resource name :  underscore(_) 사용

resource 의  name 에는  hyphen(-)  사용. 

 

tflint 에서는 snake_case standard snake_case format - all characters must be lower-case, and underscores are allowed. (모든 문자는 소문자 사용하며 _ 허용을 함)
https://github.com/terraform-linters/tflint/blob/master/docs/rules/terraform_naming_convention.md

 

tag 규칙

AWS Provider 설정에서 default_tags 를 이용하면 편리하게 태그 달 수 있음. Terraform AWS Provider v3.38.0 이상부터 지원되는 기능임. Default Tags in the Terraform AWS Provider

 

terraform에서 관리하는 리소스에 대해서 tag 표시.  

Environment

IAC = “Terraform"

Owner

Team

commit 하기전

terraform fmt 로 코드 깔끔하게 만들자.

네이밍 가이드

 

디렉토리 구조

모듈

재사용 가능한 코드는 모듈로 작성을 함.

외부 모듈 사용시에는 내부 repo로 fork 한 다음 사용. 외부 모듈 사용시 버전을 지정해서 사용해야 함

 

실행 순서

terraform init -> terraform fmt ->  terraform validate -> terraform plan


명령어를 alias 하기

GitHub - zer0beat/terraform-aliases: Programmatically generated handy terraform aliases.