Terraform 1.5 및 이후에서는 구성에서 직접 리소스 가져오기를 관리하기 위해 import
블록을 사용할 수 있습니다. 이 기능을 사용하면 기존 인프라를 Terraform 상태로 가져오는 프로세스가 간소화되어 별도의 CLI terraform import
명령이 필요하지 않습니다.
이 문서에서는 가져오기 블록을 설명하고 다양한 리소스를 가져오는 방법을 설명합니다.
Terraform Import 블록이란 무엇인가?
Terraform v1.5.0에서 소개된 Terraform import
블록은 기존 인프라 리소스를 Terraform 상태 파일로 가져오기 위한 선언적 접근 방식을 제공합니다. 이를 통해 리소스 가져오기가 직접 상태 작업으로 처리되는 것이 아니라 다른 관리되는 리소스와 유사하게 Terraform의 계획 프로세스의 필수 요소가 됩니다.
결과적으로, import
블록은 투명성을 향상시키고 리소스 가져오기를 인프라 구성 요소로 정렬하여 사용자가 인프라를 더 효과적이고 예측 가능하게 관리할 수 있도록 합니다.
Terraform에서 import
블록의 구문은 다음과 같습니다:
import {
to = <resource_address>
id = <resource_identifier>
}
to
: 가져온 리소스가 매핑될 구성에서의 리소스 주소를 지정합니다.id
: 기존 자원의 고유 식별자를 제공업체 API에서 정의합니다. Terraform 제공자가 가져올 자원에 액세스하도록 올바르게 구성되었는지 확인하십시오.
일부 자원 유형은 가져오기에 대한 추가 요구 사항이나 제약 사항을 가질 수 있음에 유의하십시오.
Import 블록 대 Terraform Import 명령어
import
블록은 Terraform에서 기존 인프라를 구성 파일에서 직접 정의할 수 있도록 해주어 기존 인프라의 관리를 단순화합니다.
반면, terraform import
명령어를 import
블록 없이 사용하면 기존 자원을 Terraform 상태에 연결하지만 해당 구성을 자동으로 코드에 생성하지는 않습니다. 이 구성을 수동으로 추가해야 합니다. 가져오기 명령어는 일회성 가져오기나 인프라를 Terraform 관리로 전환하는 데 특히 유용합니다.
두 방법 모두 Terraform 상태와 실제 인프라 간 일관성을 보장하기 위해 주의 깊게 처리해야 합니다. Import
블록은 주로 계속되는 자원 관리에 더 적합하며 독립형 명령어는 때때로 가져오기에 적합합니다.
예제 1: Terraform Import 블록을 사용하여 S3 버킷 가져오기
기존 AWS S3 버킷(my-existing-bucket
)을 Terraform으로 관리하려고 가정해봅시다.
resource
블록은 S3 버킷(aws_s3_bucket.example
)을 지정하고 bucket
속성은 기존 버킷의 이름을 정의합니다:
resource "aws_s3_bucket" "example" {
bucket = "my-existing-bucket"
}
import {
to = aws_s3_bucket.example
id = "my-existing-bucket"
}
import
블록은 기존 S3 버킷을 Terraform 리소스에 연결합니다.
to
: 가져온 리소스를resource
블록(aws_s3_bucket.example
)의 주소에 매핑합니다id
: 버킷의 고유 ID를 지정합니다(my-existing-bucket
).
terraform plan
을 실행하면, Terraform은 import
블록을 읽고 기존 S3 버킷의 상태를 확인하며 상태 파일에 대한 변경 사항 미리보기를 표시합니다. 그런 다음, terraform apply
를 실행하면, Terraform은 상태 파일을 업데이트하여 기존 버킷을 포함하고, 이를 aws_s3_bucket.example
리소스에 매핑합니다.
terraform apply
를 실행한 후 리소스를 성공적으로 가져온 후에는 import
블록을 제거하는 것이 가장 좋은 실천 방법입니다. 그대로 유지해도 문제가 발생하지는 않지만, 제거하면 구성을 깔끔하게 유지하고 미래 상태 관리 중 잠재적인 혼란을 최소화할 수 있습니다.
예제 2: Terraform Import 블록을 사용하여 EC2 인스턴스 가져오기
또 다른 예를 살펴보겠습니다: ID가 i-1234567890abcdef0
인 기존 EC2 인스턴스를 Terraform 관리하고자 합니다.
기존 인스턴스의 구성과 일치하는 속성(예: ami
, instance_type
)을 가진 aws_instance
리소스를 resource
블록에 정의합니다.
resource "aws_instance" "example" {
ami = "ami-0abcdef1234567890" # Replace with the actual AMI ID
instance_type = "t2.micro"
}
import {
to = aws_instance.example
id = "i-1234567890abcdef0"
}
import
블록에서:
to
: 구성에서 리소스(aws_instance.example
)를 기존 리소스에 매핑합니다.id
: 가져오려는 EC2 인스턴스의 고유 ID를 지정합니다.
리소스 블록과 import 문을 Terraform 구성 파일에 추가한 후 terraform plan
을 실행하여 변경 사항을 미리 보고, 다음으로 terraform apply
를 실행하여 리소스를 Terraform 상태 파일로 가져옵니다.
가져온 후에는 Terraform이 기존 EC2 인스턴스를 관리하여 구성이 선언적으로 유지되도록 합니다.
예제 3: Azure 리소스 그룹 가져오기를 위해 Terraform Import 블록 사용
다음 예제에서는 Azure 리소스 그룹을 가져올 것입니다.
우리는 East US
지역에 있는 기존의 Azure 리소스 그룹인 example-resource-group
을 Terraform으로 관리하고자 합니다.
먼저, resource
블록에서 Terraform이 관리할 azurerm_resource_group
리소스를 정의합니다:
resource "azurerm_resource_group" "example" {
name = "example-resource-group"
location = "East US"
}
import {
to = azurerm_resource_group.example
id = "/subscriptions/<subscription_id>/resourceGroups/example-resource-group"
}
가져오기 블록:
to
: 구성에서의 리소스(azurerm_resource_group.example
)를 기존의 Azure 리소스에 매핑합니다.id
: 리소스 그룹의 완전히 정규화된 Azure 리소스 ID를 지정합니다.<subscription_id>
를 실제 구독 ID로 교체해야 합니다.
리소스와 가져오기 블록을 Terraform 구성 파일에 추가합니다. 그 다음 terraform plan
명령을 실행하여 변경 사항을 미리 보고 terraform apply
를 실행하여 변경 사항을 적용하고 리소스를 Terraform 상태 파일로 가져옵니다.
Terraform Import 블록을 조건부로 사용할 수 있습니까?
Terraform 가져오기 블록은 선언적으로 설계되었으며 계획 시점에 알려진 특정 값을 요구합니다. 따라서 귀하의 Terraform 코드 내에서 조건부로 사용할 수 없습니다.
가져오기 블록은 조건에 따라 가져오기 ID를 결정하기 위한 동적 표현식이나 변수를 지원하지 않습니다. 가져오기 블록 내에서 count나 변수를 사용하려는 시도는 오류를 발생시키며, Terraform은 이 맥락에서 그러한 인수를 허용하지 않습니다.
주요 사항
Terraform 1.5+에서 가져오기 블록의 도입은 구성 파일 내에서 리소스를 직접 가져오고 정의할 수 있게 하여 리소스 관리를 단순화합니다. 이는 복잡성을 줄이고 기존 인프라를 Terraform 구성에 통합하는 것을 용이하게 하여 IaC 원칙에 부합합니다.
Source:
https://dzone.com/articles/how-to-use-terraform-import-block