본문 바로가기

IaC/Terraform

[Terraform]리소스 강제 교체하기: taint와 untaint 사용법

terraform taint

terraform taint는 특정 리소스를 "tainted" 상태로 표시하여, 다음 terraform apply 때 해당 리소스를 강제로 다시 만들게 합니다.

특정 리소스를 교체해서 테스트하거나 디버깅해보고 싶을때 taint를 이용하여 리소스를 교체해 볼 수 있습니다.

예제: ig에 장애가 있다 생각하고 해당 리소스를 교체해 본다.

현재 상태 확인하기: tf state list

➜ tf state list
module.route_table__private.aws_resourcegroups_group.this[0]
module.route_table__private.aws_route_table.this
module.route_table__private.aws_route_table_association.subnets[0]
module.route_table__private.aws_route_table_association.subnets[1]
module.route_table__public.aws_resourcegroups_group.this[0]
module.route_table__public.aws_route.ipv4["0.0.0.0/0"]
module.route_table__public.aws_route_table.this
module.route_table__public.aws_route_table_association.subnets[0]
module.route_table__public.aws_route_table_association.subnets[1]
module.subnet_group__private.aws_resourcegroups_group.this[0]
module.subnet_group__private.aws_subnet.this["default-private-001/az1"]
module.subnet_group__private.aws_subnet.this["default-private-002/az2"]
module.subnet_group__public.aws_resourcegroups_group.this[0]
module.subnet_group__public.aws_subnet.this["default-public-001/az1"]
module.subnet_group__public.aws_subnet.this["default-public-002/az2"]
module.vpc.data.aws_region.current
module.vpc.aws_internet_gateway.this[0]
module.vpc.aws_resourcegroups_group.this[0]
module.vpc.aws_vpc.this

위 명령을 통해 관리 중인 리소스의 상태를 확인할 수 있습니다.

인터넷 게이트웨이 리소스 taint하기: tf taint

➜ tf taint 'module.vpc.aws_internet_gateway.this[0]'
>>>
Resource instance module.vpc.aws_internet_gateway.this[0] has been marked as tainted.

변경 사항 적용하기: tf apply

➜ tf apply
>>>
# 중략
Terraform will perform the following actions:

  # module.route_table__public.aws_route.ipv4["0.0.0.0/0"] will be updated in-place
  ~ resource "aws_route" "ipv4" {
      ~ gateway_id             = "igw-09be7ce12b07438cf" -> (known after apply)
        id                     = "r-rtb-0314c188a357c38491080289494"
        # (4 unchanged attributes hidden)
    }

  # module.vpc.aws_internet_gateway.this[0] is tainted, so must be replaced
-/+ resource "aws_internet_gateway" "this" {
      ~ arn      = "arn:aws:ec2:ap-northeast-2:671393671211:internet-gateway/igw-09be7ce12b07438cf" -> (known after apply)
      ~ id       = "igw-09be7ce12b07438cf" -> (known after apply)
      ~ owner_id = "671393671211" -> (known after apply)
        tags     = {
            "Name"                          = "default"
            "Owner"                         = "posquit0"
            "Project"                       = "Network"
            "module.terraform.io/full-name" = "terraform-aws-network/vpc"
            "module.terraform.io/instance"  = "default"
            "module.terraform.io/name"      = "vpc"
            "module.terraform.io/package"   = "terraform-aws-network"
            "module.terraform.io/version"   = "0.24.0"
        }
        # (2 unchanged attributes hidden)
    }

Plan: 1 to add, 1 to change, 1 to destroy.

ig에 연결되어있던 라우팅 테이블 규칙이 update 됐습니다. → 의존성

terraform untaint

taint 상태를 제거하고 싶다면, terraform untaint 명령어를 사용하면 됩니다.

➜ tf untaint 'module.vpc.aws_internet_gateway.this[0]'

같은 기능을 하는 명령어

리소스를 갱신하고 싶을 때, taint 외에도 아래와 같은 방법을 사용할 수 있습니다:

  • terraform plan -replace=resource
  • terraform apply -replace=resource

이러한 방법은 하나의 리소스를 대체할 때 유용하며, 여러 리소스를 갱신하고 싶을 때는 **taint**를 사용하는 것이 좋습니다.