서론
Terraform을 사용하면서 CLI를 잘못 사용하여 .tfstate파일에 배포된 정보가 반영되지 않거나, AWS Management Console에서 생성한 리소스를 놓치고 배포하게 될 상황을 겪었을 것이다.
그럴때마다 마주하는 ‘already exist …’ 에러를 AWS Management Console에서 수동으로 삭제하는 것 대신, Terraform CLI를 이용해 이미 존재하는 AWS 리소스를 Terraform 파일에 정의된 속성에 맞게 수정하는 작업을 진행할 예정이다.
위와 같은 에러는 AWS 리소스가 계정 내에서 고유한 이름으로 존재하는 서비스에서 발생하는데, 주로 ECR 저장소, S3 버킷과 같은 서비스에서 많이 볼 수 있다. 그렇다면, 어떻게 작업해야 이런 문제 상황을 해결할 수 있는지 차근차근 확인해보도록 하겠다.
Terraform
아직까지 Terraform에 대한 내용을 한 번도 다루지 않아, 간략하게 Terraform에 대해 다뤄보고 다음으로 진행해보려고 한다.
Terraform은 IaC(Infrastructure as Code)로써 이름 그대로 인프라스트럭처를 코드로써 표현해주는 도구이다. 클라우드 서비스 상의 다수의 리소스들을 AWS Management Console에서 일일히 키보드와 마우스로 직접 생성하고 수정하는 수고를 줄이기 위해 개발된 기술이다.
Terraform을 사용하려면 주로 다음의 세 가지 CLI 명령어를 사용한다.
# terraform init 설정 파일을 생성
$ terraform init
# terraform plan을 확인
$ terraform plan
# terraform을 배포
$ terraform apply
terraform init
이 명령어는 프로젝트에서 Terraform을 초기화하는 데 사용된다. 해당 명령어를 실행하였을 때, .terraform 디렉터리와 terraform.lock.hcl 파일이 생성된다.
- .terraform 디렉터리: Terraform의 Provider, Plugin, Module 등의 정보를 관리한다.
- .terraform.lock.hcl : Terraform의 Provider 버전과 Hash 값을 관리한다. 개발자가 다양한 환경에서 동일한 코드를 실행할 때, 발생할 수 있는 문제를 해결하는데 도움을 주는 파일이다.
terraform plan
이 명령어는 .tf 파일에 정의된 인프라스트럭처 설정을 사용하여 예정된 인프라 구성을 보여준다. 해당 명령어를 실행하더라도, 실제 인프라에는 아무런 변화가 발생하지 않지만, .tf 파일의 결과를 미리 확인할 수 있다.
terraform apply
이 명령어는 .tf 파일에 정의된 인프라스트럭처 설정을 실제 Cloud Provider (AWS, GCP 등)에 배포하기 위해 사용한다. 해당 명령어를 실행하였을 때, terraform.tfstate 파일이 생성된다.
- terraform.tfstate: 해당 파일은 이름에 걸맡게 Terraform의 State를 관리하며, 현재 AWS 리소스의 배포 상태와 Terraform의 상태를 맞추는 데 사용된다.
이번 작업에서는 .tfstate 파일의 상태값을 실제 AWS에 배포된 리소스와 맵핑하는 작업을 진행할 예정이다.
Terraform 현재 상태
이제 특정 상황을 가정하여 테스트를 진행해 보고자 한다.
locals {
service_name = "tfstate-exam"
}
provider "aws" {
region = "ap-northeast-2"
}
resource "aws_s3_bucket" "this" {
bucket = local.service_name
}
resource "aws_ecr_repository" "this" {
name = local.service_name
}
현재 Terraform은 위와 같이 구성되어 있다. AWS Provider를 사용하여, S3 버킷과 ECR 저장소를 생성하는 코드를 작성했다. 이 코드를 이용해 인프라를 배포한다면, 이름이 “tfstate-exam”인 S3 버킷과 ECR 저장소가 생성된다.
already exists 에러
만약, “tfstate-exam” 이라는 이름을 가진 ECR 저장소가 이미 존재하는 상태에서 Terraform을 배포한다면 어떤 에러가 발생할까?
“already exists …” 에러가 발생하게 된다. 이는 Terraform이 처음 배포를 진행할 때 AWS 리소스가 존재하지 않은 상태를 가정하고 배포를 진행하기 때문이다. 따라서, 이미 존재하는 ECR 저장소 때문에, 새로운 ECR 저장소의 생성이 실패하게 된다.
Terraform 명령어 확인하기
그럼 어떻게 이미 존재하는 AWS 리소스를 현재 Terraform의 배포 상태에 추가할 수 있을까?
Terraform State의 Documentation에서 terraform state와 terraform import 명령어를 이용하여 .tfstate 파일에 정의된 속성값을 관리하거나, 외부에서 생성된 개체를 가져올 수 있다는 것을 확인할 수 있다.
terraform state
terraform state는 고급 상태 관리를 위해 사용되며, Terraform의 상태를 일부 수정하거나 삭제할 때, .tfstate 파일의 텍스트를 직접 수정하는 대신 해당 명령어를 이용할 수 있다.
terraform state <subcommand> [options] [args]
terraform state의 다양한 서브 커맨드는 terraform state --help
명령어를 이용하여 확인할 수 있다. 해당 명령어를 이용하여 .tfstate와 관련된 서브 커맨드를 확인해보자.
.tfstate를 관리하는 terraform state의 명령어는 아래와 같이 총 7개로 구성되어 있으며, 각 명령어의 역할은 다음과 같다.
- list: .tfstate에서 관리하고 있는 리소스들의 정보를 조회한다.
- mv: .tfstate에서 관리하고 있는 리소스의 의존성을 변경하거나 수정한다.
- pull: Remote State를 수동으로 다운로드 및 출력할 때 사용한다.
- push: Remote State를 수동으로 업로드할 때 사용한다. 하지만, 버전 차이 등의 문제로 사용하는 것을 권장하지 않는다.
- replace-provider: Provider를 변경하기 위해서 사용한다.
- rm: .tfstate에서 더이상 해당 리소스를 관리하지 않을 때 사용한다.
- show: .tfstate에서 관리하고 있는 특정 리소스의 상태를 상세하게 조회할 수 있다.
terraform import
terraform import는 기존 인프라 리소스를 현재 Terraform 프로젝트로 가져올 수 있다.
terraform [global options] import [options] ADDR ID
terraform import를 사용하면 외부에서 생성된 인프라 리소스를 현재 Terraform 프로젝트의 .tfstate파일로 가져올 수 있다. 이는 동일한 Cloud Provider에서 이미 생성된 리소스를 해당 Terraform 프로젝트가 관리하려할 때 유용하게 사용할 수 있다.
에러 디버깅
다양한 Terraform 명령어들을 확인해보았을 때, terraform import 명령어를 이용하면 AWS 에서 이미 존재하는 ECR 저장소의 정보를 가져올 수 있음을 확인하였다. 실제로 해당 예시를 바탕으로 ECR 저장소 정보를 가져오는 CLI 명령어를 작성해보자.
terraform import 'aws_ecr_repository.this' tfstate-exam
.tf 파일에서 ECR 저장소는 aws_ecr_repository.this 라는 이름으로 정의하였고, AWS 리소스는 tfstate-exam이라는 이름으로 지정했다. 이렇게 명령어를 구성하면, 해당 리소스의 정보를 가져오는 것을 예상할 수 있다. 그럼 실제 CLI에서 해당 명령어를 실행한다면, 어떻게 구성되는지 확인해보자.
위의 스크린샷은 terraform import 명령어를 실행한 후의 결과이다. 이로 인해, AWS에 배포되어 있던 ECR 저장소 정보를 성공적으로 가져올 수 있었다.
이제 .tfstate 파일에는 AWS 에 존재하던 ECR 저장소와 연동이 되었다는 것을 확인하였다. 이 상태에서 이미 구현되어 있던 코드에 추가적으로 Tags를 추가한다면, terraform plan은 어떤 결과를 도출할까? 확인해보자.
AWS의 존재하던 ECR 저장소의 정보가 반영된 상태에서 Tags를 추가한 결과, 수정된 Tags가 정상적으로 반영될 예정이라는 것을 확인할 수 있게 되었다. 이렇게 terraform import 를 통해 기존 AWS에 존재하는 리소스를 Terraform State로 가져올 수 있다는 것을 알게되었다.
'Infrastructure > Terraform' 카테고리의 다른 글
효율적인 인프라 관리를 위한 Terraform 모듈 입문하기 (0) | 2024.03.03 |
---|---|
지구를 Terraform으로 물들이다. (Terraform 입문하기) (1) | 2024.02.18 |
VPC Peering, 너는 누구니? (feat. terraform) (1) | 2024.01.07 |