Hello World/IaC

[AWS] 이미 생성된 infra를 terraform 으로 가져오기

Run DaramG 2022. 8. 26. 12:34

Terraform import 명령어는 말그대로 기존에 존재하는 인프라 상태를 가져오는 기능이다.

이미 생성되어 운영중인 AWS 리소스에 대해 terraform 으로 상태를 code로 가져올 수 있다.

 

Terraform import 로 기존에 구축된 리소스에 대한 terraform 코드를 작성하는 과정을 간단하게 정리하자면

1. 가져올 개체가 mapping될 리소스에 대한 빈 블록을 수동으로 작성한다

2. terraform import 명령어를 수행하면 terraform.tfstate파일에 가져온 리소스에 대한 상태값이 저장된다.

3. tfstate파일을 보면서 리소스.tf 파일에 각 속성을 하나하나 직접 선언한다.

 

혹은 Terraformer 라는 Tool 을 사용할 수도 있다.

Terraformer는 기존 인프라를 기반으로 tf code 및 tfstate 파일을 생성하는 CLI 도구이다.

1. Terraformer git 을 clone 받고 install 한다.

2. terraformer import aws --resources="*" 명령어를 사용하여 운영중인 인프라 리소스를 모두 가져와서 작성한다.(--filtering 옵션을 통해 원하는 리소스의 코드만 가져올 수 도 있다.)

 

 

terraform import 의 단계별로 실제 명령어와 함께 자세한 내용을 보여주자면.. 

 

사전 준비

기본적으로 provider.tf 가 작성되어있고, terraform init 까지는 수행되어야 한다.

아래와 같이 provider.tf 와 variables.tf 를 작성 후 terraform init 명령어를 수행한다. 

#provider.tf

terraform {
  required_version = ">= 0.12"
}

provider "aws" {
  region = var.aws_region
  access_key = var.aws_access_key
  secret_key = var.aws_secret_key
}

data "aws_availability_zones" "available" {}

provider "http" {}

 

#variables.tf

variable "aws_region" {
  default = "ap-northeast-2"
}

variable "aws_access_key" {
  default = "XXXXXXXXXXXXX"
}

variable "aws_secret_key" {
  default = "XXXXXXXXXXXXXXXXXXXXXXXXX"
}

 

 

1단계 : tf파일을 생성하여 가져올 리소스에 대한 빈 블록을 생성한다. 

 

2단계 : AWS 웹콘솔에 접속하여 가져올 리소스에 대한 id 값을 확인한 후 terraform import 명령어를 사용하여 가져온다.

명령어 - terraform import <리소스>.<모듈이름> <대상id>

ex) terrarom import aws_subnet.public_subnet1 subnet-04917582

ex) terraform import aws_mq_broker.myBroker b-fff381-ad9b78-1u8950

 

3단계 : terraform.tfstate 파일에 내가 import 한 리소스의 상태가 저장되었다. 

리소스를 선언했던 빈 블록에 terraform 문법에 맞게 tfstate 파일을 참조하여 작성한다.

 {
      "mode": "managed",
      "type": "aws_mq_broker",
      "name": "broker",
      "provider": "provider[\"registry.terraform.io/hashicorp/aws\"]",
      "instances": [
        {
          "schema_version": 0,
          "attributes": {
            "apply_immediately": null,
            "arn": "arn:aws:mq:ap-northeast-2:4111:broker:Mybroker:b-fff8",
            "authentication_strategy": "simple",
            "auto_minor_version_upgrade": true,
            "broker_name": "Mybroker",
            "configuration": [],
            "deployment_mode": "SINGLE_INSTANCE",
            "encryption_options": [
              {
                "kms_key_id": "",
                "use_aws_owned_key": true
              }
            ],
            "engine_type": "RabbitMQ",
            "engine_version": "3.9.16",
            "host_instance_type": "mq.m5.large",
            "id": "b-fff8adde-0e4b-406",
            "instances": [
              {
                "console_url": "https://b-fffXxxx.mq.ap-northeast-2.amazonaws.com",
                "endpoints": [
                  "amqps://b-fffCxxx.mq.ap-northeast-2.amazonaws.com:5671"
                ],
                "ip_address": ""
              }
            ],
            "ldap_server_metadata": [],
            "logs": [
              {
                "audit": "",
                "general": true
              }
            ],
            "maintenance_window_start_time": [
              {
                "day_of_week": "MONDAY",
                "time_of_day": "21:00",
                "time_zone": "UTC"
              }
            ],
            "publicly_accessible": true,
            "security_groups": [],
            "storage_type": "ebs",
            "subnet_ids": [
              "subnet-00362766215312f"
            ],
            "tags": {
              "dev": ""
            },
            "tags_all": {
              "dev": ""
            },
            "user": []
          },
          "sensitive_attributes": [],
          "private": "xxxxxxxxxx"
        }
      ]
    },

 

리소스가 많아질수록 한땀한땀 작성하는게 매우 노가다이다.

 

terraformer 도구를 사용하면 AWS 리소스를 tfstate 파일 혹은 tf 코드로 가져올 수 있다.

GitHub - GoogleCloudPlatform/terraformer: CLI tool to generate terraform files from existing infrastructure (reverse Terraform). Infrastructure to Code

해당 tool은 AWS 뿐만 아니라 terraform 에서 지원하는 GCP, Azure, GitHub, Kubernetes 등 많은 클라우드 제공 없체를 지원하며, 최신 리소스 스키마를 기반으로 코드를 생성해주는 tool이다.