Terraform 개발 가이드 (draft)
- 1 문서소개
- 2 문서이력
- 3 To do list
- 4 이렇게는 하지 말자!
- 5 환경설정
- 6 코드 가이드라인
- 6.1 tag 규칙
- 6.2 commit 하기전
- 6.3 네이밍 가이드
- 6.4 디렉토리 구조
- 7 모듈
- 7.1 실행 순서
- 7.2 명령어를 alias 하기
문서소개
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 보안체크
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.