기존 리소스 가져오기
기존 리소스 가져오기 (Import Existing Resources)
terraform import 명령으로 기존 인프라스트럭처 리소스를 가져와 코드로 관리하는 방법을 설명해요. 하나의 리소스를 구성에 추가하고 명령을 실행하면 기존 객체가 Terraform 상태에 매핑돼요. 복잡한 가져오기(complex import) 시나리오도 함께 다루어요.
출처: 문서
본문
이 주제는 terraform import 명령을 사용해 기존 인프라스트럭처 리소스를 가져와 코드로 관리하는 방법을 설명해요.
직접 해보기: Import Terraform Configuration 튜토리얼을 시도해보세요.
개요
terraform import 명령을 사용해 기존 인프라스트럭처를 Terraform 상태로 가져오세요. terraform import 명령은 한 번에 하나의 리소스만 가져올 수 있어요. AWS VPC와 같은 리소스 전체 집합을 동시에 가져올 수는 없어요.
리소스를 가져오려면 다음 단계를 완료하세요:
- Terraform으로 관리하려는 리소스를 Terraform 구성에 추가하세요.
terraform import명령을 실행하세요.
경고: Terraform은 관리하는 각 원격 객체가 하나의 리소스 주소에만 바인딩될 것으로 기대해요. 이는 일반적으로 Terraform이 모든 객체를 직접 만들었기 때문에 보장돼요. 기존 객체를 Terraform으로 가져올 때 각 원격 객체를 하나의 Terraform 리소스 주소에만 가져오도록 주의하세요. 동일한 객체를 여러 번 가져오면 Terraform이 원치 않는 동작을 보일 수 있어요. 이 가정에 대한 자세한 내용은 상태 섹션을 참조하세요.
구성에 리소스 추가하기
가져오려는 리소스에 대한 리소스 블록을 구성에 작성하세요. 리소스 이름을 제공하세요. 이 이름은 구성의 다른 곳에서 리소스를 참조할 수 있는 고유 ID예요.
다음 예시에서 가져온 리소스는 example이라는 이름의 AWS 인스턴스예요:
resource "aws_instance" "example" {
# ...instance configuration...
}
리소스 블록의 본문을 반드시 완성할 필요는 없어요. 대신 인스턴스를 가져온 뒤에 인자 정의를 마무리할 수 있어요.
terraform import 명령 실행하기
terraform import를 실행해 기존 인스턴스를 리소스 구성에 연결하세요:
$ terraform import aws_instance.example i-abcd1234
이 명령은 ID가 i-abcd1234인 AWS EC2 인스턴스를 찾아요. 그런 다음 EC2 API가 설명하는 인스턴스의 기존 설정을 모듈의 aws_instance.example이라는 이름에 연결해요. 이 예시에서는 모듈 경로가 루트 모듈이 사용됨을 의미해요. 마지막으로 이 매핑이 Terraform 상태에 저장돼요.
자식 모듈의 리소스도 경로를 사용해 가져올 수 있으며, count 또는 for_each가 설정된 리소스의 단일 인스턴스도 가져올 수 있어요. 대상 리소스를 지정하는 방법에 대한 자세한 내용은 리소스 주소 지정 (Resource Addressing)을 참조하세요.
주어진 ID의 구문은 가져오는 리소스 유형에 따라 달라져요. 예를 들어 AWS 인스턴스는 EC2 API가 발급한 불투명 ID를 사용하지만, AWS Route53 Zone은 도메인 이름 자체를 사용해요. 필요한 ID 형식에 대한 자세한 내용은 각 가져올 수 있는 리소스의 문서를 참조하세요.
위 명령의 결과로 리소스가 상태 파일에 기록돼요. 이제 terraform plan을 실행해 구성이 가져온 리소스와 어떻게 비교되는지 확인하고, 가져온 객체의 현재(또는 원하는) 상태와 일치하도록 구성을 조정할 수 있어요.
복잡한 가져오기
위의 가져오기는 "단순 가져오기(simple import)"로 간주돼요. 하나의 리소스가 상태 파일로 가져와져요. 가져오기는 여러 리소스가 가져와지는 "복잡한 가져오기(complex import)"가 될 수도 있어요. 예를 들어 AWS 네트워크 ACL은 aws_network_acl을 가져오면서 각 규칙에 대해 하나씩 aws_network_acl_rule도 가져와요.
이 시나리오에서 보조 리소스는 구성에 아직 존재하지 않으므로, 가져오기 출력을 확인하고 각 보조 리소스에 대한 resource 블록을 구성에 만들어야 해요. 이렇게 하지 않으면 Terraform은 다음 실행 때 가져온 객체를 파괴하려고 계획해요.
가져온 리소스를 이름을 바꾸거나 이동하려면 상태 관리 명령을 사용할 수 있어요.