기존에 생성되어있던 리소스들을 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는 오픈소스 도구로 이미 존재하는 클라우드 리소스를 Terraform 코드로 변환하는 데 사용된다. 이 변환 프로세스를 Terraform import라고도 부른다. Terraformer는 다음 기능들을 제공하고 있다.
tf/json
+ tfstate
파일 생성tf/json
파일을 저장
brew install terraformer
이 링크에서 운영체제에 맞는 바이너리를 선택해서 다운받는다. 나는 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
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를 멀티 어카운트로 사용할 경우 인증키의 프로필 지정
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
폴더 바로 아래 생성된다.
가져온 리소스들은 이름앞에 tfer--
이 붙는다.
리소스 명이 알아보기 힘들어서 구성파일에서 이름을 바꾸고 terraform state mv
명령을 사용해 명칭을 변경해줬다.
여기까지 진행한 상태로 terraform init을 수행하면 다음과 같은 에러가 나타난다. 기본적으로 terraformer가 생성한 파일은 Terraform0.12으로 생성하기 때문에 terraform init을 실행하면 다음과 같은 오류가 발생하는 것이다. 다음 명령어를 사용해서 provider를 업그레이드한다.
기본적으로 terraformer가 생성한 파일은 Terraform0.12으로 생성하기 때문에 terraform init을 실행하면 다음과 같은 오류가 발생하는 것이다. 다음 명령어를 사용해서 provider를 업그레이드한다.
```
terraform state replace-provider -auto-approve -- -/aws hashicorp/aws
```
오
이제 다시 terraform init을 수행한다.
성공 !
여기까지 작업 후 terraform plan이 정상적으로 이뤄진 분들은 더 이상 글을 읽지 않으셔도 됩니다!
그럼 plan을 해볼까 !
ipv6 주소가 없어서 안된단다. ipv6 주소를 사용하지 않는 리소스를 처리하는 방법을 찾아봐야겠다.
vpc 대신 ec2 파일로 다시 init 을 시도 해보자.
cpu관련 블럭이 충돌하는 것 같다. 문서에 따르면 cpu_core_count
, cpu_threads_per_core
는 사용 중단된 인자이고,cpu_options
를 사용한다고 한다. 왜인지 모르겠지만 cpu 관련 인자가 중복해서 여러개 생성되어 발생한 문제인 것으로 보인다.
cpu_options
만 남기고 중복된 인자들을 삭제 후 terraform plan을 다시 시도하니 성공했다.
우여곡절이 있었지만 한번 익혀두면 굉장히 편하게 클라우드 리소스를 terraform 코드화 할 수 있다. terraforming보다 안정적인 것 같지만 예외 처리를 해주는 작업이 필요해 보인다. 예외처리만 된다면 방대한 양의 리소스를 코드화해서 관리할 수 있다. 관련해서 좀 더 고민해보고 불러온 코드를 바탕으로 프로젝트를 모듈식으로 구조화한 다음 테스트해보려한다.
Terraform 코드 네이밍 컨벤션 (0) | 2023.07.13 |
---|
댓글 영역