본문 바로가기
Cloud

리버스테라포밍(Terraforming)을 위한 발걸음..feat. 테라코그니타

by C곰군 2023. 5. 17.

안녕하세요?

곰군입니다.

 

오랜만에 쓰는 글인데,, 그것도 기술 글이네요! 뿌듯합니다..ㅎㅎ

지금 구성되어 있는 환경을 테라폼 소스로 구현해야 하는 이슈가 있어서,

맞는 리버스테라포밍 툴을 찾고 있습니다.

 

제가 찾는 조건은...

1. 현재 운영환경에 영향을 주지 않을 것

2. 리소스 별로 코드를 만들 수 있을 것

이 가장 주요한 조건입니다.

 

여러 가지 툴들을 보면서 제가 찾는 조건에 맞는 툴을 찾아보면서 각 도구들의 특성과 사용법, 후기 등을 남겨보겠습니다.

 

1. Former2

(https://github.com/iann0036/former2   /  https://www.former2.com   )

 

Former2 AWS, Google Cloud, Azure 등의 클라우드 리소스를 스캔하여 현재 클라우드 인프라의 구성을 읽어 코드 형태로 변환해 주는 도구입니다.

이 변환된 코드는 Infrastructure as Code (IaC) 도구인 Terraform이나 AWS CloudFormation과 같은 형식으로 출력됩니다. 이를 통해 기존 클라우드 인프라를 코드로 관리하고, 인프라의 버전 관리, 재사용, 변경 관리 등이 가능해집니다.

 

Former2는 웹 인터페이스 또는 CLI(Command Line Interface) 도구로 제공되며, AWS 리소스에 대한 읽기 권한만 있으면 AWS 리소스의 현재 상태를 스캔하고 이를 코드로 변환하는 작업을 수행할 수 있습니다.

이미 구축된 클라우드 인프라를 코드로 변환하거나, 클라우드 리소스의 현재 상태를 쉽게 파악하고 싶은 경우 유용하게 사용될 수 있습니다.

 

사용 방법

 1.Iam에서 읽기 전용 계정을 생성하고 액세스 키를 생성합니다.

2.Former2 설정에서 액세스 키 정보를 입력합니다.

3. 스캔을 시작합니다.

4. 스캔된 정보 중에서 변환하고 싶은 리소스를 선택하고 ADD를 클릭합니다.

5. 변환을 시작하고 코드를 확인합니다.

 

후기 :

장점: 사용이 간편합니다.

          테라포밍보다는 리소스 한눈에 보거나 필요한 리소스를 쉽게 찾는데 좋아 보였습니다.

단점: 모듈 지원이 없습니다.

 

2. Terraforming

(https://github.com/dtan4/terraforming)

 Terraforming 도구는 2021 12 11일 이후로 업데이트가 중지되었습니다.

그래서 테스트를 진행하지 않았습니다!!

 

3. Terracognita

(https://github.com/cycloidio/terracognita)

 

Terracognita는 클라우드 리소스를 관리하는 데 사용되는 HashiCorp Terraform 코드로 변환하는 도구입니다.

 

설치법

다음의 명령어를 통해 간단히 설치할 수 있습니다.

curl -L https://github.com/cycloidio/terracognita/releases/latest/download/terracognita-linux-amd64.tar.gz -o terracognita-linux-amd64.tar.gz
tar -xf terracognita-linux-amd64.tar.gz
chmod u+x terracognita-linux-amd64
sudo mv terracognita-linux-amd64 /usr/local/bin/terracognita

위 명령어를 실행하여 Terracognita /usr/local/bin 디렉토리로 이동시킵니다.

 

사용 방법:

Terracognita를 사용하기 전에 인증 정보를 환경 변수로 등록하는 것이 편리합니다. 아래와 같이 환경 변수를 설정합니다:

export AWS_ACCESS_KEY_ID=<your-access-key-id>
export AWS_SECRET_ACCESS_KEY=<your-secret-access-key>
export AWS_DEFAULT_REGION=<your-default-region>

기본적으로 Terracognita는 다음과 같은 생성 옵션을 제공합니다: --hcl 또는 --module --tfstate입니다.

 

예제 1: hcl 플래그로 소스 코드 생성

소스 코드를 생성하기 위해 --hcl 옵션을 사용합니다. 다음과 같은 명령어로 실행할 수 있습니다:

terracognita aws --hcl ./test.tf

위 명령어는 test.tf 파일에 모든 리소스 내용을 담아줍니다.

 

특정 리소스만 변환하고 싶다면 --resources와 함께 사용할 수 있습니다.

다음과 같은 명령어를 실행하여 원하는 리소스만 변환합니다:

terracognita aws --resources aws_s3_bucket,aws_s3_bucket_policy --hcl ./test.tf

위 명령어는 aws_s3_bucket aws_s3_bucket_policy 리소스만을 선택하여 test.tf 파일에 담아줍니다.

 *--hcl 방식은 하나의 파일에 모든 리소스가 코드가 담기는 형태로, 아쉽지만 제가 찾는 조건은 아니였습니다.

 

예제 2: module 플래그로 소스코드 생성

리소스를 모듈 단위로 분리하여 폴더별로 생성하려면 --module 옵션을 사용합니다. 아래와 같은 명령어를 실행하면 각 리소스별로 모듈 폴더가 생성됩니다:

terracognita aws --module "module_test"

위 명령어를 실행하면 아래와 같은 구조의 소스 코드가 생성됩니다.

test/
├── module-test
│   ├── autoscaling.tf
│   ├── cloud_front.tf
│   ├── cloud_watch.tf
│   ├── ec2.tf
│   ├── elastic_load_balancing_v2_alb_nlb.tf
│   ├── iam.tf
│   ├── rds.tf
│   ├── route53_resolver.tf
│   ├── route53.tf
│   ├── s3.tf
│   ├── ses.tf
│   └── variables.tf
└── module.tf

위 방식은 `--hcl` 옵션보다 더 활용도가 높은 소스 코드를 생성할 수 있습니다.

하지만 리소스 별로 폴더 구분이 되어있지는 않기 때문에 아쉽죠

 

**최종: 리소스를 폴더로 분리하여 모듈화**

리소스를 폴더 단위로 분리하고 모듈화 하려면 아래와 같은 스크립트를 사용할 수 있습니다:

#!/bin/bash

# AWS 인증 정보는 환경 변수로 설정되어야 합니다.
# export AWS_ACCESS_KEY_ID=<your-access-key>
# export AWS_SECRET_ACCESS_KEY=<your-secret-key>

# 리전을 지정합니다.
region="ap-south-1" # 뭄바이 리전

# 제외할 리소스를 쉼표로 구분하여 지정합니다.
exclude_resources=("aws_iam_role_policy_attachment" "aws_iam_role_policy" "aws_iam_role" "aws_iam_policy" "aws_iam_access_key")

# 지원하는 모든 리소스 목록을 가져옵니다.
resources=$(terracognita aws resources)

# 리소스 목록을 순회합니다.
for resource in $resources
do
    if [[ " ${exclude_resources[*]} " == *" $resource "* ]] ; then
        echo "Skipping $resource"
    else
        echo "Importing $resource"
        terracognita aws --module "module_$resource" --include "$resource"
    fi
done

위 스크립트는 terracognita aws resources 명령어를 사용하여 모든 리소스를 가져온 후,

제외할 리소스를 필터링하고 하나씩 모듈을 생성합니다.

이렇게 하면 리소스 별로 폴더가 생성되며 폴더 안에는 테라폼 코드가 생성됩니다.

코드를 수정하거나 추가해야 하지만 작업량을 크게 줄일 수 있습니다.

 

이렇게 열심히 찾아보고 비교해보려고 했지만 3번째 만에 원하는 걸 찾아버렸습니다.ㅎㅎㅎㅎ

그래도 지금까지 분석해놓은 것은 공유해 놓겠습니다!!

테라폼 관련한 한글로 작성된 글이 인터넷에 별로 없어서 이 글이 다른 분들께 도움이 되셨으면 하네요.

읽어주셔서 감사합니다!!

댓글