Terraformer 설치 환경은 AWS 클라우드 환경에서 ubuntu 20.04 LTS EC2에서 진행합니다. Ubuntu의 OS 버전은 크게 중요하지 않습니다. (EC2는 사전에 생성하고 EC2 생성과정은 생략함)
그 전에 terrafomer에 대해서 알아봅시다. terraformer는 기존이 이미 존재하는 클라우드 자원을 terraform code로 변환해주는 유틸리티입니다. terraform 도구의 역행하는 reverse engineering 도구로 생각해도 좋을 듯 합니다. terraformer가 공식적인 유틸리티는 아니지만, 구글 내부 오픈소스 프로젝트에서 gcp에서 활용하기 위해 만들어진 도구로서, 기능적으로는 아주 편리합니다.
Terraformer(테라포머) 설치 방법
1. 최초 패키지 목록를 업데이트합니다.
$ sudo apt-get update
2. Terraformer를 설치합니다.
$ export PROVIDER=aws
$ curl -LO https://github.com/GoogleCloudPlatform/terraformer/releases/download/$(curl -s https://api.github.com/repos/GoogleCloudPlatform/terraformer/releases/latest | grep tag_name | cut -d '"' -f 4)/terraformer-${PROVIDER}-linux-amd64
$ chmod +x terraformer-${PROVIDER}-linux-amd64
$ sudo mv terraformer-${PROVIDER}-linux-amd64 /usr/local/bin/terraformer
3. Terraformer 설치후 버전 확인하여 정상여부를 확인합니다.
$ terraformer version
Terraformer v0.8.20
Terraformer(테라포머) 수행 방법
Terraformer를 설치하였다면, AWS 환경에 이미 존재하는 자원을 tf(terraform) 파일로 변환하도록 합시다. 사전에 terraform의 plugin 설치 경로를 디폴트값이 개별 로컬 디렉토리(workspace)였다면, 공통으로 재활용하기 위해 경로로 변경합니다. (참고 URL : https://www.terraform.io/cli/config/config-file ) 그리고 그 경로의 다운로드 받은 플러그인을 활용해서 기존 aws 자원을 tf 파일로 변환할 수 있게 됩니다. 지금 해봅니다.
1. terraform plugin 경로를 공통 위치로 변경합니다. 우분투 홈 디렉토리(/home/ubuntu)에서 .terraformrc 파일을 생성하고, 아래 내용을 작성하여 저장합니다. 파일명이 정확히 .terraformrc 라는 사실에 주의합니다.
$ vi .terraformrc
plugin_cache_dir = "$HOME/.terraform.d/plugins"
disable_checkpoint = true
이번에는 우분투의 $HOME/.terraform.d 디렉토리에서 plugins 디렉토리를 생성합니다. 이전에 terraform을 수행한 적이 있다면 홈 디렉토리에 .terraform.d 디렉토리가 있을 것이고 mkdir 명령어를 통해서 plugins 디렉토리를 생성합니다.
.terraform.d$ pwd
/home/ubuntu/.terraform.d
.terraform.d$ mkdir plugins
방금 전에 생성한 plugins 파일에는 AWS 프로바이더에 대한 플러그인 파일이 없습니다. 따라서 terraform 파일이 있는 워크스페이스(디렉토리)에서 terraform init 을 수행하거나, terraform 파일이 있는 워크스페이스의 .terraform 내용을 복사(cp) 합니다. 필자는 편의상 아무런 내용이 없는 임시 tf 파일(dummy 파일)을 만들고 terraform init 명령어를 수행하였습니다.
2. aws configure 정보에서 profile 정보를 확인합니다. 필자는 단 1개의 aws 계정정보만 저장해놔서, profile이 not set입니다. 만약 2개 이상의 AWS 계정을 사용해서 여러 개의 aws profile(인증정보)이 설정되어 있다면, terraformer이 어떤 prfile에서 수행할지 알고 있어야 합니다.
$ aws configure list
Name Value Type Location
---- ----- ---- --------
profile <not set> None None
access_key ****************2Q6Z shared-credentials-file
secret_key ****************ufYS shared-credentials-file
region ap-northeast-2 config-file ~/.aws/config
3. 본격적으로 terraform import 명령어를 수행합니다. 그러면 AWS에 terraform으로 생성했던 vpc, subnet 자원 등이 tf 파일로 변환됩니다. 즉, terraform 코드로 자동 작성됩니다. 나머지 옵션 설정은 본인의 환경에 맞게 설정해도 됩니다. 필자의 경우는 vpc, subnet 자원에 대해서만, 서울 리전에 있는 자원들을 terraform 코드로 만들기 위한 옵션을 설정하였습니다.
$ terraformer import aws --resources=vpc,subnet --connect=true --regions=ap-northeast-2 --profile=default
2022/05/19 05:48:49 aws importing region ap-northeast-2
2022/05/19 05:48:50 aws importing... vpc
2022/05/19 05:48:50 aws done importing vpc
2022/05/19 05:48:50 aws importing... subnet
2022/05/19 05:48:50 aws done importing subnet
2022/05/19 05:48:50 Number of resources for service subnet: 17
2022/05/19 05:48:50 Number of resources for service vpc: 4
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-092b034e17d810921
2022/05/19 05:48:50 Refreshing state... aws_vpc.tfer--vpc-078038c68840cbfbc
2022/05/19 05:48:50 Refreshing state... aws_vpc.tfer--vpc-01a81c0e2144bdd47
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-09f0e4fd5f17a0cc0
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-0aae713476d65fe7b
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-02bd3aaa711a20d00
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-0fcb54046715d93e0
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-028a2aa49de693c15
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-0ca100c38f015c211
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-055a5f1bcbc7694ba
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-04f738ca162f5c2f2
2022/05/19 05:48:50 Refreshing state... aws_vpc.tfer--vpc-03f5e59e172fdbfb2
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-084acb594ef0d1265
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-027888e2e5d2808f5
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-0e00af5c09e91cb25
2022/05/19 05:48:50 Refreshing state... aws_vpc.tfer--vpc-07d137e8fcb98387c
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-057a10c05f348ec0e
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-076766b5c56ebc498
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-0f2cce1af115ea800
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-0779ddd4e0b96d339
2022/05/19 05:48:50 Refreshing state... aws_subnet.tfer--subnet-06d7f3921d21f03ef
2022/05/19 05:48:50 Filtered number of resources for service vpc: 4
2022/05/19 05:48:50 Filtered number of resources for service subnet: 17
2022/05/19 05:48:50 aws Connecting....
2022/05/19 05:48:50 aws save subnet
2022/05/19 05:48:50 aws save tfstate for subnet
2022/05/19 05:48:50 aws save vpc
2022/05/19 05:48:50 aws save tfstate for vpc
4. 이제 최종 변환된 파일을 확인합니다. (편의상 파일 구조를 표현하는 tree 유틸리티를 통해서 결과 확인) generated 디렉토리 하위에 vpc, subnet 으로 분리하여 tf 파일이 잘 생성된 것을 확인할 수 있습니다.
/terraformer$ tree
.
├── generated
└── aws
├── subnet
│ ├── outputs.tf
│ ├── provider.tf
│ ├── subnet.tf
│ ├── terraform.tfstate
│ └── variables.tf
└── vpc
├── outputs.tf
├── provider.tf
├── terraform.tfstate
└── vpc.tf