우선 공부하는데 앞서 Terraform시험을 실제 Command별 사용법을 굉장히 많이 물어본다. 여기서 핵심적인것만 찝어 보겠다.
명령어 부분
Usage: terraform [global options] <subcommand> [args]
The available commands for execution are listed below.
The primary workflow commands are given first, followed by
less common or more advanced commands.
Main commands:
init Prepare your working directory for other commands
validate Check whether the configuration is valid
plan Show changes required by the current configuration
apply Create or update infrastructure
destroy Destroy previously-created infrastructure
All other commands:
console Try Terraform expressions at an interactive command prompt
fmt Reformat your configuration in the standard style
force-unlock Release a stuck lock on the current workspace
get Install or upgrade remote Terraform modules
graph Generate a Graphviz graph of the steps in an operation
import Associate existing infrastructure with a Terraform resource
login Obtain and save credentials for a remote host
logout Remove locally-stored credentials for a remote host
output Show output values from your root module
providers Show the providers required for this configuration
refresh Update the state to match remote systems
show Show the current state or a saved plan
state Advanced state management
taint Mark a resource instance as not fully functional
untaint Remove the 'tainted' state from a resource instance
version Show the current Terraform version
workspace Workspace management
Global options (use these before the subcommand, if any):
-chdir=DIR Switch to a different working directory before executing the
given subcommand.
-help Show this help output, or the help for a specified subcommand.
-version An alias for the "version" subcommand.
Terraform init
- 이 명령어는 Backend 접속 또는 Registry에서 module을 받아 로컬에 저장하는 절차를 수행한다. 여기선 module의 전체 파일을 스캔하며 Terraform 코드를 수행하기위해 맨처음 꼭 실행되야 하는 명령어이다. 또한, 모듈이 변경되거나 이름이 변경되는 경우 재 수행 되야 하며 Backend가 바뀌는 경우 -migrate-state를 통해 마이그레이션 해주거나 새롭게 생성해줘야한다.
Terraform validate
- 이 명령어는 Terraform의 포멧이 정상인지 확인한다. 하지만 yaml과 다르게 Terraform은 인덴트에 제약을 받지 않는다.
Terraform plan
- 실제 생성될 예정인 리소스를 보여준다. 참고로 -destory옵션을 준다면 제거될 대상을 보여준다. (-destory 옵션 시험에 나왔었다)
Terraform apply
- 이 명령어는 사전에 plan은 수행했다면, 해당 정보를 활용하지만 plan을 수행하지 않았다면 apply에서 plan을 수행한다. 또한 배포전 --auto-approve 옵션을 주지 않으면 prompt가 나오며 승인을 받는다.
- -target옵션으로 특정 모듈만 실행할 수 있다.
- terraform으로 생성한 리소스를 콘솔에서 삭제한뒤 apply를 다시 수행하면 다시 리소스가 생성된다.
Terraform destory
- 리소스를 작제하며 -target옵션으로 해당 모듈만 삭제가 가능하다. 이것또한 실행전 prompt가 뜨며 사용자의 승인을 요청한다. 여기서 삭제될 대상의 리스트를 볼 수 있다.
Terraform fmt
- 이것은 코드 커머리지와 같다. Terraform은 Spaces:2로 인덴트 규칙을 가진다. fmt를 사용하면 ci/cd수행에 중간 과정으로 넣을수도 있고 또는 다양한 사람들과 함께 개발시 포멧을 맞출 수 있다.
Terraform workspace
- 상태를 별도로 관리할 수 있는 명령어 이다. Terraform Cloud와 결합되면 별도의 워크스페이스로 관리가 가능하다. 워크스페이스 별로 변수나 보안 규칙등을 다양하게 지정할 수 있다.
Terraform taint
- 이제 사용 안되는데 시험에 나온다. 해당 리소스를 taint시켜 다음 명령어 실행때 제거하고 다시 생성한다.(지금은 apply -replace 옵션으로 변경되었다)
Terraform refresh
- 이 명령어는 Terraform으로 생성된 리소스가 Console 상에서 변경되었을때 Terraform의 상태를 업데이트하기 위하여 쓰인다. 이것 또안 시험에 상당히 많이 출제되었다.
Terraform import
- Console에서 생성된 리소스를 Terraform의 상태파일로 만들어준다. 참고로 이 명령어를 실행할때 Terraform 파일과 리소스 코드 그리고 Target이 되는 Resource ID가 필요하다. 즉, Terraform 코드가 미리 작성되어있어야 한다.
tfstate 파일 관리관련
tfstate는 기본적으로 local에 저장된다. 이는 다양한 사람들과 협업시 큰 문제로 발전할 수 있다. 그래서 Terraform은 remote backend를 지원한다.
다만 remote backend또한 완벽하진 않다. 다양한 backend resource가 있지만 Terraform Cloud를 제외하고는 실제 수행이 local에서 되기 때문에 동시 작업이 발생할 수 있다. 이때 적용되는게 lock기능이다
apply, destroy, plan을 실행할때 locking된다. 이때 다른 사용자는 해당 명령어 수행이 불가능하다.
모든 Backend가 Locking 기능을 지원하지 않으니 참고하자!
- force-unlock를 사용해야 하는 경우가 간혹있다. 이건 automatic unlocking이 정상적으로 수행되지 않았을때 사용한다.( 수행도중 강제 취소 하는 경우 이런 일이 발생한다)
필요에 따라 CI/CD를 이용하는 방법또한 가능하다. Github과 같은 저장소에 권한을 분리하여 pull request를 받아 처리하는 형태로 수행한다면 협업에 더큰 도움이 될것이다.
Terraform Cloud
- 무료로 사용할 수 있는 영역이 있다.
- 거버넌스 관련한 영역은 무료 플렌에 없다. 이건 엔터프라이즈를 사용해야한다.
- Terraform Cloud를 사용하면 보안성이 뛰어난 저장소를 옵션 설정으로 사용할 수 있다.(Sensitive 옵션을 켜면 된다)
보안
- 프로바이더 인증이나 Backend Connection을 위한 값을 코드에 절대 저장해서는 안된다.
- -var같은 옵션을 쓰거나 환경변수로 사용하여 외부에서 주입하는 형태로 사용이 가능하다
- var file에 sensitive 옵션을 주어도 state파일에 평문으로 노출된다.(절대 안전하지 않다)
- aws의 secret와 같은 외부 안전한 저장소를 사용하자
Version
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 3.0"
}
}
Terraform Code를 작성하다 보면 위와 같이 버전을 명시해 줘야 하는 경우가 있다. 굉장히 중요하다.
version = "2.0"은 2.0버전을 쓰겠다는 의미이다
version = "~> 3.0"은 3.0부터 4.0사이의 버전중 가장 높은 버전을 사용한다는 의미이다
이렇든 Terraform. Provider의 버전에 대한 규칙또 단골로 시험에 출제된다.
Dynamic
이 명령문은 중첩구성된 블록을 구성하는데 사용한다.
resource "aws_security_group" "common_allow_tls" {
name = "common_allow_tls"
description = "Allow TLS inbound traffic"
vpc_id = var.vpc_id
dynamic "ingress" {
for_each = var.sg_rule["ingress"]
iterator = ingress
content {
cidr_blocks = ingress.value.ranges_ipv4
protocol = ingress.value.protocol
from_port = ingress.value.from_ports
to_port = ingress.value.to_ports
description = ingress.value.desc
}
}
위와 같이 Security Group을 생성할때 내부에 ingress와 egress라는 블럭을 추가할 수 있다.(외부의 별도 resource로 뺄 수도 있다)
만약 Security Rule이 많은경우 count로 외부에서 Roule을 만들어 적용할 수 있지만 위처럼 Dynamic 블럭으로 처리할 수 있다.
다만 Dynamic 블럭이 많아지면 코드를 해석하는데 상당히 난감하고 복잡해진다.
- 장담하건데 나중에 저 블럭에 있는 변수가 어떤 룰을 가지고 있는지 기억 안나게 될것이다.
반복문
Terraform에서 반복문을 사용하는 방법은 3가지가 있다
- count
- for
- for_each
각자 다른 성향을 가지고 있는데 참고로 for_each는 : 구문을 사용할 수 없다.
'Programming > Iac' 카테고리의 다른 글
EKS Cluster 생성하기 (0) | 2022.11.12 |
---|---|
Terraform Associate (002) 취득 후기 (0) | 2022.11.06 |