1. Terraform 인프라 배포 동작 순서
•
테라폼은 선언적인 언어로 배포할 인프라 상태를 정의하고 인프라를 배포합니다. 이러한 테라폼의 인프라 배포를 위한 동작 순서에 대해 알아보겠습니다.
[Caption] Terraform 인프라 배포 순서
1.
프로젝트 범위를 식별하고 HCL 언어로 생성할 인프라를 선언합니다.
provider "aws" {
region = "ap-northeast-2"
}
resource "aws_instance" "example" {
ami = "ami-0c76973fbe0ee100c"
instance_type = "t2.micro"
}
...
Bash
복사
[Caption] tf 파일 예시
•
HCL 언어로 작성한 .tf 파일 생성
2.
terraform init 명령어로 테라폼을 시작하기 위한 준비를 진행 (backend 구성 초기화, 플러그인 설치 등)
terraform init
================= output =================
Initializing the backend...
Initializing provider plugins...
- Finding latest version of hashicorp/aws...
- Installing hashicorp/aws v4.38.0...
- Installed hashicorp/aws v4.38.0 (signed by HashiCorp)
Terraform has created a lock file .terraform.lock.hcl to record the provider
selections it made above. Include this file in your version control repository
so that Terraform can guarantee to make the same selections by default when
you run "terraform init" in the future.
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
Bash
복사
•
backend로 지정된 구성 설정을 초기화합니다.
•
.terraform 폴더가 생성되며 관련한 플러그인을 가져옵니다.
•
Provider를 기록하기 위해 암호화된 .terraform.lock.hcl 파일을 생성합니다.
3.
terraform plan 명령어로 변경될 인프라 내역을 확인
terraform plan
================= output =================
Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# aws_instance.example will be created
+ resource "aws_instance" "example" {
+ ami = "ami-0c76973fbe0ee100c"
+ arn = (known after apply)
+ associate_public_ip_address = (known after apply)
+ availability_zone = (known after apply)
+ cpu_core_count = (known after apply)
+ cpu_threads_per_core = (known after apply)
+ disable_api_stop = (known after apply)
+ disable_api_termination = (known after apply)
+ ebs_optimized = (known after apply)
+ get_password_data = false
+ host_id = (known after apply)
+ host_resource_group_arn = (known after apply)
+ id = (known after apply)
+ instance_initiated_shutdown_behavior = (known after apply)
+ instance_state = (known after apply)
+ instance_type = "t2.micro"
+ ipv6_address_count = (known after apply)
...
Bash
복사
•
선언된 언어가 어떠한 인프라를 생성할 지 예측된 결과를 확인합니다.
•
terraform plan -out [FILE_NAME] 형태로 저장이 가능하며, terraform apply [FILE_NAME] 형태로 지정하여 배포 가능합니다.
4.
terraform apply 명령어로 인프라를 배포
terraform apply
================= output =================
Terraform used the selected providers to generate the following execution plan.
Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# aws_instance.example will be created
+ resource "aws_instance" "example" {
+ ami = "ami-0c76973fbe0ee100c"
...
Plan: 1 to add, 0 to change, 0 to destroy.
aws_instance.example: Creating...
aws_instance.example: Still creating... [10s elapsed]
aws_instance.example: Still creating... [20s elapsed]
aws_instance.example: Still creating... [30s elapsed]
aws_instance.example: Still creating... [40s elapsed]
aws_instance.example: Creation complete after 41s [id=i-0932856b42695f556]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
Bash
복사
•
인프라를 배포하는 명령어로 terraform plan에서 계획된 행위를 수행합니다.
•
Provider와 API 연계하여 자원을 생성하며, 상태 정보를 백엔드 영역에 .tfstate 파일로 저장합니다.
2. tfstate 파일
•
테라폼은 인프라의 상태를 일정하게 유지하는 측면에서 .tfstate 파일은 중요합니다.
•
앞서 설명했듯이 .tfstate는 백엔드 영역에 저장이되는데 별도의 백엔드 영역을 지정하지 않으면 로컬 영역에 저장
•
테라폼을 통한 인프라 관리를 여러명이서 협업할 경우 로컬 영역에 저장하는 것은 바람직하지 않습니다.
•
기존에 인프라를 정의한 .tfstate 파일이 있다면, 해당 파일을 활용하여 terraform init 작업으로 local에서 동기화
terraform state list
================= output =================
aws_instance.test
Bash
복사
•
terraform state list 명령어로 .tfstate에서 관리하는 인프라 정보를 확인
terraform state show aws_instance.test
================= output =================
# aws_instance.test:
resource "aws_instance" "test" {
ami = "ami-0c76973fbe0ee100c"
arn = "arn:aws:ec2:ap-northeast-2:739027722
580:instance/i-0932856b42695f556"
associate_public_ip_address = true
availability_zone = "ap-northeast-2a"
cpu_core_count = 1
cpu_threads_per_core = 1
disable_api_stop = false
disable_api_termination = false
ebs_optimized = false
get_password_data = false
Bash
복사
•
terraform state show 명령어로 인프라의 상세 정보를 확인합니다.