...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
...
설치, 설정
AWS 설정
사용하는 AWS key는 named profiles 를 이용하여 terraform 코드에 설정을 하도록 한다. 사용자가 실수로 terraform 코드를 잘못 실행하는 것을 방지하기 위한 목적이다.
terraform module 설정
module 을 사용을 하면 terraform init 명령을 실행한 경우 설정을 한 provider 프로그램을 다운로드 받는다.
그런데 각 module 마다 provider를 따로 다운로드 받기 때문에 시간이 많이 걸린다.
홈디렉토리의 .terraformrc 파일에 plugin cache 설정을 해서 사용을 한다. 이 디렉토리는 terraform이 자동생성하지 않기 때문에 수동으로 생성을 해준다.
https://www.terraform.io/docs/configuration/providers.html
Code Block |
---|
$ cat ~/.terraformrc plugin_cache_dir = "$HOME/.terraform.d/plugin-cache" $ mkdir -p $HOME/.terraform.d/plugin-cache |
terraform 사용하기
terraform을 사용할 때 처음부터 코드를 새로 짜는 것보다는 terraform module 을 참고한다.
외부 모듈을 쓰는 것이 확실하게 좋은 경우가 아니라면 가급적 직접 코드를 짜는 것이 좋을 수 있다. 일부 리소스는 직접 만들고 일부 리소스는 외부 모듈을 이용하는 경우 혼란스러울 수 있다.
- terraform module registry https://registry.terraform.io/browse?provider=aws : Verified 는 사용을 해도 좋지만 그 외의 것은 코드 수준이 다양하므로 코드를 보고 판단해야 한다.
- best practicces terraform : https://github.com/hashicorp/best-practices/tree/master/terraform : 현재 deprecated 이고 terraform module registry를 참고하라고 하지만 terrafrom 전체적인 코드를 보기에는 도움이 된다.
- terraform examples https://github.com/terraform-providers/terraform-provider-aws/tree/master/examples
- github 등에서 검색
엔터프라이즈 환경에서 terraform 사용하기
https://www.terraform.io/docs/enterprise/guides/recommended-practices/index.html (한글자료 https://blog.outsider.ne.kr/1333)
...
terraform workspace 활용 https://www.terraform.io/docs/state/workspaces.html
디렉토리 구조
....
환경구분 : prod , staging , ......
remote state 설정
https://www.terraform.io/docs/state/remote.html
...
consul의 경우에는 remote state + locking을 지원하고 s3를 이용하는 경우에는 locking도 사용하려면 DynamoDB 도 함께 써야 한다. s3에서 버저닝 기능을 이용하면 예전의 state 파일로 복구 가능한 장점이 있다.
코드 가이드라인
README 파일 만들기 : 코드를 보고 판단 가능한 경우는 생략해도 되지만 설명이 필요한 경우는 README 파일 필수
...
Strings are in double-quotes.
Spacing : Use 2 spaces
Resource Block Alignment
Terraform resource name : underscore(_) 사용
...
참고로 terraform 의 terraform fmt 명령을 이용하면 자동으로 코드 스타일을 맞출 수 있다. 이런 부분을 commit hook에 넣어서 사용할 수도 있겠다.
lifecycle
create_before_destroy : 새로운 리소스를 먼저 생성하고 기존의 리소스 삭제.
...
$ cat sample.tf resource "aws_instance" "service" { instance_type = "${var.instance_type}" ami = "${lookup(var.amis, var.os)}" key_name = "${var.aws_key_pair}" subnet_id = "${var.subnets}" vpc_security_group_ids = [ "${var.security_group_ids}" ] user_data = "${data.template_cloudinit_config.config.rendered}" tags { Owner = "${var.owner}" Environment = "${var.environment}" } lifecycle { ignore_changes = [ "ami" , "user_data" ] } } |
terraform module - AWS
terraform module - AWS
Verified 는 사용을 해도 좋지만 그 외의 것은 코드 수준이 다양하므로 코드를 보고 판단해야 한다.
...
EC2+ELB, autoscalinig group 등과 같이 여러 리소스 타입에 대해서 별도 설정이 필요한 경우
Terraform 디버깅
https://www.terraform.io/docs/internals/debugging.html
TF_LOG 환경변수로 설정할 수 있다. log level : TRACE
, DEBUG
, INFO
, WARN
or ERROR
$ export TF_LOG=DEBUG ; terraform plan |