상세 컨텐츠

본문 제목

Terraformer로 기존에 사용 중인 AWS 인프라를 Terraform 코드로 가져오기

📃 Terraform

by chnh 2023. 5. 12. 16:14

본문

반응형

들어가며

기존에 생성되어있던 리소스들을 terraform으로 관리하려면 설정(Configuration)과 상태(State)를 다 가져와야한다.

terraform코드를 생성할 때 vpc.tf, ec2.tf 처럼 각 리소스에 대한 설정 파일을 작성한다. 그리고 이 설정 파일들을 plan하고 apply하면 코드가 생성되고 terraform.tfstate 파일에 기록된다.

 

terraform import를 사용하면 리소스의 상태 파일은 업데이트 되지만 설정 파일을 만들어주지는 않는다. 때문에 설정파일이 없는 상태에서 import를 진행하면 terraform.tfstate파일만 생기게 되고, plan을 했을 때 리소스가 지워지게 된다.

 

이미 생성된 많은 리소스들의 구성파일을 일일히 작성하는 데는 한계가 있어 콘솔이나 cli로 생성되어있는 리소스들을 코드로 가져올 수 있는 툴들을 찾아봤다. Terraformer외에도 Former2, aws2tf 등이 있었지만 제공되는 Provider의 수나 커뮤니티의 규모, 사용의 편리성 등을 고려했을 때 Terraformer가 가장 적합하다고 판단했다.

 

Terraformer와 Terraforming
Terraformer와 Terraforming 모두 기존 클라우드 인프라에서 Terraform 파일을 생성하는 오픈소스이다. Terraformer가 비교적 최근에 만들어진 프로젝트이기 때문에 Terraforming은 들어봤어도 Terraformer는 초면일 수 있다. 두 프로젝트의 차이는 여기서 확인할 수 있다.

 

Terraformer란?

Terraformer는 오픈소스 도구로 이미 존재하는 클라우드 리소스를 Terraform 코드로 변환하는 데 사용된다. 이 변환 프로세스를 Terraform import라고도 부른다. Terraformer는 다음 기능들을 제공하고 있다.

  • 리소스별로 지원되는 모든 개체에 대해 기존 인프라에서 tf/json + tfstate 파일 생성
  • terraform_remote_state(로컬 및 버킷)로 리소스 간에 연결
  • 사용자 정의 폴더 트리 패턴을 사용하여 tf/json 파일을 저장
  • 리소스 이름, 유형별로 가져오기
  • Terraform 0.13을 지원
  • Terraformer는 Terraform 공급자를 사용하며 새로 추가된 리소스를 쉽게 지원하도록 설계되어 새로운 필드가 있는 리소스를 업그레이드하려면 관련 Terraform 공급자를 업그레이드하기만 하면 된다.

 

Terraformer 설치 및 구성 방법

1. Terraformer 설치

brew install terraformer

2. AWS Provider plugin 다운로드

링크에서 운영체제에 맞는 바이너리를 선택해서 다운받는다. 나는 M1 Mac을 사용중이라 다음과 같이 다운로드 받았다. 다운 받은 플러그인은 terraform plugin 폴더(일반적으로 ~/.terraform.d/plugins/)로 이동, 압축을 해제한다.

# 플러그인을 저장할 폴더 생성 
mkdir -p ~/.terraform.d/plugins/darwin_arm64 
cd ~/.terraform.d/plugins/darwin_arm64 

# 작성 당시 최신 버전인 4.66.1 버전 다운 
curl -LO https://releases.hashicorp.com/terraform-provider-aws/4.66.1/terraform-provider-aws_4.66.1_darwin_arm64.zip

# 압축 해제
unzip terraform-provider-aws_4.66.1_darwin_arm64.zip

3. Terraformer 실행

Terraformer를 실행하고 terraformer 폴더로 이동하면 generated directory가 생성된 것을 확인할 수 있다.

terraformer import aws --resources=vpc --regions=ap-northeast-2 --profile=admin

--resources : import 시킬 리소스 지정 지원되는 리소스 목록

--regions : 리전 지정, ex)europe-west1, (default [global])

--profile : aws를 멀티 어카운트로 사용할 경우 인증키의 프로필 지정

실행 결과 generated directory와 .tf/.tfstate 파일이 생성되었다. 

terraformer는 리소스 필터링을 지원하기 때문에 다음과 같이 응용해서 사용해볼 수 있다.

# ap-northeast-2 리전의 모든 리소스 가져오기 
terraformer import aws --resources="*" --regions=ap-northeast-2

# ap-northeast-2 리전에서 iam을 제외한 모든 리소스 가져오기
# 가져오지 않으려는 서비스는 --excludes 사용 
terraformer import aws --resources="*" --excludes="iam" --regions=ap-northeast-2

# eu-west-1리전에서 vpc=myvpcid id가 있는 vpc,subnet만 가져오기 
terraformer import aws --resources=vpc,subnet --filter=vpc=myvpcid --regions=eu-west-1

서울리 전의 전체 리소스를 가져왔을 때 약 2분 40초가 소요되었다.

 

Tip ) output 경로 설정

Terraformer는 기본적으로 각 리소스를 파일로 분리하여 지정된 서비스 디렉터리에 저장하기 때문에 vpc별로 subnet별로 폴더가 각각 생성된다.

aws 리소스 파일의 기본 경로는 {output}/{provider}/{service}/{resource}.tf 이다. 폴더가 이렇게 나뉘는게 싫다면 --path-pattern 파라미터를 적용해서 경로를 수정할 수 있다.

예를들어 --path-pattern="{output}/"으로 설정하면 불러온 리소스 파일들이 generated 폴더 바로 아래 생성된다.

--path-pattern="{output}/" 으로 import했을 때 생성되는 구조

가져온 리소스들은 이름앞에 tfer--이 붙는다.

리소스 명이 알아보기 힘들어서 구성파일에서 이름을 바꾸고 terraform state mv 명령을 사용해 명칭을 변경해줬다.

 

4. terraform init

여기까지 진행한 상태로 terraform init을 수행하면 다음과 같은 에러가 나타난다. 기본적으로 terraformer가 생성한 파일은 Terraform0.12으로 생성하기 때문에 terraform init을 실행하면 다음과 같은 오류가 발생하는 것이다. 다음 명령어를 사용해서 provider를 업그레이드한다.

4.1 Upgrade Provider

기본적으로 terraformer가 생성한 파일은 Terraform0.12으로 생성하기 때문에 terraform init을 실행하면 다음과 같은 오류가 발생하는 것이다. 다음 명령어를 사용해서 provider를 업그레이드한다.

```

-/aws -> hashicorp/aws로 provider 변경

terraform state replace-provider -auto-approve -- -/aws hashicorp/aws

```

  • terraform state replace-provider: state 파일에서 provider를 교체한다.
  • -auto-approve: 작업 승인을 물어보는 과정을 건너뜀

이제 다시 terraform init을 수행한다.

성공 !

여기까지 작업 후 terraform plan이 정상적으로 이뤄진 분들은 더 이상 글을 읽지 않으셔도 됩니다!

5. terraform plan

그럼 plan을 해볼까 !

ipv6 주소가 없어서 안된단다. ipv6 주소를 사용하지 않는 리소스를 처리하는 방법을 찾아봐야겠다.

vpc 대신 ec2 파일로 다시 init 을 시도 해보자.

cpu관련 블럭이 충돌하는 것 같다. 문서에 따르면 cpu_core_count , cpu_threads_per_core사용 중단된 인자이고,
cpu_options 를 사용한다고 한다. 왜인지 모르겠지만 cpu 관련 인자가 중복해서 여러개 생성되어 발생한 문제인 것으로 보인다.

에러가 난 instance.tf파일

cpu_options만 남기고 중복된 인자들을 삭제 후 terraform plan을 다시 시도하니 성공했다.

마치며

우여곡절이 있었지만 한번 익혀두면 굉장히 편하게 클라우드 리소스를 terraform 코드화 할 수 있다. terraforming보다 안정적인 것 같지만 예외 처리를 해주는 작업이 필요해 보인다. 예외처리만 된다면 방대한 양의 리소스를 코드화해서 관리할 수 있다. 관련해서 좀 더 고민해보고 불러온 코드를 바탕으로 프로젝트를 모듈식으로 구조화한 다음 테스트해보려한다.


참고자료

반응형

'📃 Terraform' 카테고리의 다른 글

Terraform 코드 네이밍 컨벤션  (0) 2023.07.13

관련글 더보기

댓글 영역