서론
아래에 글은 공식문서를 공부하며 정리한 내용입니다.
참고
이전 튜토리얼에서 Terraform을 사용하여 AWS의 단일 EC2 인스턴스인 첫 번째 인프라를 생성했었음. 이번에는 해당 리소스를 수정하고 Terraform 프로젝트에 변경 사항을 적용하는 방법을 알아보자.
인프라는 지속적으로 변경되는 특징이 있으며 Terraform은 이러한 변화를 관리하는 데 도움이 됨. Terraform conf를 변경하면 Terraform은 desired state에 도달하는 데 필요한 항목만 수정하는 execution plan을 작성함.
프로덕션에서 Terraform을 사용하는 경우, 버전 제어 시스템을 사용하여 구성 파일을 관리하고 Terraform Cloud 또는 Terraform Enterprise와 같은 원격 백엔드에 상태를 저장하는 것이 좋음.
learn-terraform-aws-instance
폴더 생성 및 main.tf
생성main.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.16"
}
}
required_version = ">= 1.2.0"
}
provider "aws" {
region = "ap-northeast-2"
profile = "learning-terraform"
}
resource "aws_instance" "app_server" {
ami = "ami-0c76973fbe0ee100c"
instance_type = "t2.micro"
tags = {
Name = "ExampleAppServerInstance"
}
}
learning-terraform
이라는 aws profile을 생성해뒀었음.terraform init
하고 terraform apply
하기.기존 terraform으로 배포한 인프라 ec2 인스턴스 aws_instance.app_server
에 대해 ami를 바꿔보자.
ami-035233c9da2fabf52
로 바꾸자.main.tf
terraform {
required_providers {
aws = {
source = "hashicorp/aws"
version = "~> 4.16"
}
}
required_version = ">= 1.2.0"
}
provider "aws" {
region = "ap-northeast-2"
profile = "learning-terraform"
}
resource "aws_instance" "app_server" {
**ami = "ami-035233c9da2fabf52"**
instance_type = "t2.micro"
tags = {
Name = "ExampleAppServerInstance"
}
}
이제 terraform apply
로 인프라를 바꿔주자.
$ terraform apply
aws_instance.app_server: Refreshing state... [id=i-0efc99a1991a2ee55]
Terraform used the selected providers to generate the following execution plan. Resource actions are indicated with the
following symbols:
-/+ destroy and then create replacement
Terraform will perform the following actions:
# aws_instance.app_server must be replaced
-/+ resource "aws_instance" "app_server" {
~ ami = "ami-0c76973fbe0ee100c" -> "ami-035233c9da2fabf52" # forces replacement
...
~ volume_size = 8 -> (known after apply)
~ volume_type = "gp2" -> (known after apply)
}
}
Plan: 1 to add, 0 to change, 1 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
aws_instance.app_server: Destroying... [id=i-0efc99a1991a2ee55]
aws_instance.app_server: Still destroying... [id=i-0efc99a1991a2ee55, 10s elapsed]
aws_instance.app_server: Still destroying... [id=i-0efc99a1991a2ee55, 20s elapsed]
aws_instance.app_server: Still destroying... [id=i-0efc99a1991a2ee55, 30s elapsed]
aws_instance.app_server: Destruction complete after 39s
aws_instance.app_server: Creating...
aws_instance.app_server: Still creating... [10s elapsed]
aws_instance.app_server: Still creating... [20s elapsed]
aws_instance.app_server: Still creating... [30s elapsed]
aws_instance.app_server: Creation complete after 32s [id=i-07ff472fe3fed27d9]
Apply complete! Resources: 1 added, 0 changed, 1 destroyed.
접두사 -/+는 Terraform이 리소스를 제자리에서 업데이트하는 대신 리소스를 삭제하고 다시 생성함을 의미함. Terraform은 일부 속성을 내부에서 업데이트할 수 있지만(~ 접두사로 표시됨) EC2 인스턴스에 대한 AMI를 변경하려면 다시 생성해야 함. Terraform은 이러한 세부 정보를 처리하고 execution plan은 Terraform이 수행할 작업을 표시함.
또한 execution plan은 AMI 변경으로 인해 Terraform이 인스턴스를 대체하도록 강제하는 것임을 보여줌. 이 정보를 사용하여 필요한 경우 파괴적인 업데이트를 방지하도록 변경 사항을 조정할 수 있음.
다시 한 번 Terraform은 진행하기 전에 실행 계획의 승인을 요청하고 yes
라고 대답하여 계획된 단계를 실행하자.
execution plan에서 알 수 있듯이 Terraform은 먼저 기존 인스턴스를 삭제한 다음 그 자리에 새 인스턴스를 생성했음. terraform show
를 다시 사용하여 Terraform이 이 인스턴스와 연결된 새 값을 출력하도록 할 수 있음.
$ terraform show
# aws_instance.app_server:
resource "aws_instance" "app_server" {
ami = "ami-035233c9da2fabf52"
...
volume_size = 8
volume_type = "gp2"
}
}
결과 확인