CloudFormation을 TerraForm으로 변경하기

2024. 3. 11. 00:24·AWS Cloud School/project

Terraform이란?

Terraform은 HashiCorp에 의해 개발된 오픈 소스 Infrastructure as Code(IaC) 소프트웨어 도구입니다. 이를 사용하면 구성 파일을 통해 데이터 센터 인프라를 구축, 변경 및 버전 관리할 수 있습니다. Terraform은 클라우드 서비스(예: Amazon Web Services, Microsoft Azure, Google Cloud Platform 등), 온프레미스 리소스(예: VMware vSphere), 그리고 기타 서비스 제공자의 리소스를 포함한 다양한 서비스 및 프로바이더를 지원합니다.

 

CloudFormation과 Terraform의 차이

언어 및 구문

  • CF : JSON 또는 Yaml과 같은 선언적 언어를 사용합니다. (AWS 리소스와 관련된 템플릿을 정의하는 데 사용합니다.)
  • Terraform : HCL(HashiCorp Configuration Launguage)을 사용합니다. (HCL은 인프라 리소스를 정의하는 데 사용합니다.)

벤더 독립성

벤더 독립성이란? 특정 벤더나 공급업체에 의존하지 않는 상태

  • CF : AWS 서비스에 특화된 도구입니다. AWS의 서비스에 대한 자원을 생성, 관리 및 조작하는 데 주로 사용합니다.
  • Terraform : 다중 클라우드 공급자 및 온-프레미스 인프라와도 통합할 수 있습니다. 이는 클라우드 벤더 독립성을 제공하며, AWS 외에도 Azure, Google Cloud Platform, VMware 등과 같은 다양한 환경을 관리할 수 있다는 큰 장점을 지닙니다.

수정 용이성

  • CF : 변경 사항을 적용할 때, 변경된 부분만을 수정하기가 어려워서 전체 템플릿을 다시 배포해야 합니다.
  • Terraform : 번경 사항을 적용할 때, 변경된 부분만을 업데이트하고 기존 리소스를 다시 생성하지 않고도인프라를 업데이트할 수 있습니다.

커뮤니티 및 에코시스템

  • CF : AWS에서 직접 관리하고 지원하며, AWS 서비스와 긴밀하게 통합되어 리소스가 풍부합니다.
  • Terraform : HashiCorp에서 개발하고 유지 관리하며, AWS 외에도 여러 다른 클라우드 및 인프라 공급자와의 통합을 지원합니다. 테라폼에는 넓은 커뮤니티와 풍부한 플러그인 생태계가 있습니다.

 

CloudFormaition yaml파일을 Terraform tf 파일로 변환

CloudFormaition을 사용하기 위해 만든 yaml파일을 TerraForm 형식으로 변환이 가능합니다.

https://discuss.hashicorp.com/t/tool-to-convert-cloudformation-to-terraform/46704

 

Tool to Convert Cloudformation to Terraform

cf2tf version v0.4.0 is out. This release has a ton of improvements over the previous versions. Install with: pip install cf2tf Use with: cf2tf my_template.yaml Works with JSON as well!

discuss.hashicorp.com

이 링크를 따라가 그대로 따라하면 yaml 파일을 tf 파일로 변경이 가능합니다.

트러블 슈팅

  1. 환경 변수 문제
    • pip은 Package Installer of python으로 이걸 실행 하기 위해서는 파이썬이 설치되어 있어야 합니다.
    • PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\Scripts 이 파일이 있는 주소를 환경 변수에 추가해줘야 합니다.
  2. UTF-8 문제
    • 아래와 같은 에러가 나오는데 우리나라는 decode를 utf-8로 해야 하기 때문에 생기는 에러 인 것 같습니다.
    • UnicodeDecodeError: 'cp949' codec can't decode byte 0xec in position 28: illegal multibyte sequence
    • PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\site-packages\cf2tf\terraform\doc_file.py 이 파일을 찾아서 open 부분을 찾은 뒤 모두 아래 처럼 변경해줍니다.

실행

cf2tf my_template.yaml > my_terraform_template.tf

이렇게 하면 yaml파일에서 변경된 tf가 생성됩니다.

한계

  • CloudFormation을 TerraForm 파일로 만들어 준다는 것에서 엄청나게 획기적입니다.
  • 다만, 기본틀만 만들어준다는 것 입니다.
resource "aws_autoscalingplans_scaling_plan" "my_app_server_group" {
  // CF Property(VPCZoneIdentifier) = [
  //   aws_subnet.private_subnet3.id,
  //   aws_subnet.private_subnet4.id
  // ]
  // CF Property(LaunchTemplate) = {
  //   LaunchTemplateId = aws_launch_template.my_app_launch_template.arn
  //   Version = aws_launch_template.my_app_launch_template.latest_version
  // }
  min_capacity = 2
  max_capacity = 4
  predictive_scaling_max_capacity_behavior = 4
  target_tracking_configuration = [
    aws_lb_target_group_attachment.internal_alb_target_group.id
  ]
  // CF Property(tags) = {
  //   Name = "EC2AppServer"
  // }
}

예로 직접적인 Terraform 대응 부재 및 복잡한 리소스 관계 등으로 정확하게 변경은 되지 않는 모습을 볼 수 있습니다.

이럴바에 처음부터 테라폼으로 작성하는 것이 더 좋을 것 같습니다.

 

AWS CLI 설치

https://docs.aws.amazon.com/ko_kr/cli/latest/userguide/getting-started-install.html

 

최신 버전의 AWS CLI 설치 또는 업데이트 - AWS Command Line Interface

이전 버전에서 업데이트하는 경우 unzip 명령을 실행하면 기존 파일을 덮어쓸지 묻는 메시지가 표시됩니다. 스크립트 자동화와 같은 경우에 이러한 프롬프트를 건너뛰려면 unzip에 대한 -u 업데이

docs.aws.amazon.com

AWS에 접근하기 위해 AWS CLI를 설치해야 합니다. 위의 AWS 사이트에 들어가 자신의 OS에 맞는 방법으로 다운을 받으면 됩니다.

 

TerraForm 설치

https://developer.hashicorp.com/terraform/install

 

Install | Terraform | HashiCorp Developer

Explore Terraform product documentation, tutorials, and examples.

developer.hashicorp.com

이 사이트에 들어가 자신의 컴퓨터에 맞는 OS를 다운 받으면 됩니다. 

윈도우의 경우 환경변수 설정을 해줘야합니다. 
terraform 실행 파일의 경로를 환경변수 Path에 추가해줍니다.

 

TerraForm 대표 문법 정리

terraform {
  required_version = ">= 0.14"  

  required_providers {
    aws = {
      source  = "hashicorp/aws"
      version = ">= 3.0"  
    }
  }
}

특정 Terraform 버전과 프로바이더(이 경우 AWS)에 대한 요구 사항을 정의합니다.

  • required_version = ">= 0.14":  Terraform의 0.14 버전 이상에서만 실행될 수 있음을 명시합니다.
  • required_providers: 이 구성에서 사용될 프로바이더와 그 버전을 정의합니다.
    • source = "hashicorp/aws": 프로바이더의 소스를 지정합니다. hashicorp/aws는 공식 HashiCorp에서 관리하는 AWS 프로바이더를 의미합니다.
    • version = ">= 3.0": 이 Terraform 구성이 AWS 프로바이더의 3.0 버전 이상에서만 실행될 수 있음을 명시합니다. 

providers

provider "aws" { // AWS 프로바이더 설정
  region = "us-east-1" // 사용할 AWS 리전
}
  • region 변수에 지정된 값에 따라 특정 AWS 리전으로 설정됩니다. 이렇게 함으로써 테라폼은 해당 리전의 AWS 계정과 상호 작용 가능

variable

variable instance_type {
  description = "EC2 instance type for the Bastion Host and AppServer"
  type = string
  default = "t2.micro"
}
  • 클라우드 포메이션에 매개변수 입니다.
  • 자신이 원하는 변수를 매개변수 형식으로 받아올 수 있습니다.
  • 위 코드는 EC2의 instance_type을 매개변수로 받아오는 것 입니다.

resource

resource "aws_vpc" "vpc" {
  cidr_block = "10.10.0.0/16"
  enable_dns_hostnames = true ## VPC 내의 인스턴스가 hostname을 사용할 수 있도록 허용
  tags = {
    Name = "MagicMin-VPC"
  }
}
  • resource 블록은 실제 클라우드 인프라스트럭처의 구성요소(리소스)를 정의하는데 사용됩니다
  • 각 리소스는 특정 유형의 클라우드 리소스(예: 가상 프라이빗 클라우드, 가상 머신, 네트워크 인터페이스 등)를 나타내며, 해당 리소스에 대한 구성 세부 정보를 포함합니다.
  • 위 코드는 AWS의 vpc를 설정하는 코드 입니다.
  • resource 옆에 있는 aws_vpc가 리소스의 유형입니다. (ex, aws_subnet, aws_internet_gateway, aws_eip 등등)
  • vpc는 리소스의 이름입니다.

output

output "bastion_host_public_ip" {
  description = "Public IP address of the bastion host"
  value       = aws_instance.bastion_host.public_ip
}
  • 테라폼이 생성한 리소스의 속성을 추출하여 사용
  • 원하는 내용을 output으로 설정하여 콘솔에 들어가지 않고도 확인할 수 있습니다.

Modules

module "vpc" {
  source = "terraform-aws-modules/vpc/aws"
  version = "2.77.0"

  name = "my-vpc"
  cidr = "10.0.0.0/16"
  azs  = ["us-east-1a", "us-east-1b"]
  private_subnets = ["10.0.1.0/24", "10.0.2.0/24"]
  public_subnets  = ["10.0.3.0/24", "10.0.4.0/24"]

  enable_nat_gateway = true
  enable_vpn_gateway = true
}

output "public_subnets" {
  value = module.vpc.public_subnets
}
  • 사용자는 모듈에 입력 변수를 제공하고, 모듈은 이 입력을 기반으로 리소스를 생성한 후 결과를 출력합니다.
  • 이런 방식으로 모듈은 재사용 가능하며, 다양한 환경이나 프로젝트에서 공통적인 인프라 패턴을 쉽게 배포할 수 있게 해줍니다.

Function

Terraform은 다양한 내장 함수를 제공합니다. 이 함수들은 입력 값을 받아 처리하고 결과를 반환합니다. 예를 들어, 문자열을 조작하거나, IP 주소를 계산하거나, 다른 리소스의 속성을 참조하는 데 사용할 수 있습니다.

join("-", ["a", "b", "c"])  // 결과: "a-b-c"

조건문

Terraform의 조건문은 condition ? true_val : false_val 형식을 사용합니다. 조건이 참이면 true_val을, 거짓이면 false_val을 반환합니다.

variable "environment" {
  type    = string
  default = "development"
}

resource "aws_instance" "example" {
  count         = var.environment == "production" ? 5 : 1
  instance_type = var.environment == "production" ? "t3.large" : "t3.micro"
  // 다른 설정...
}

반복문

Terraform에서 반복문은 주로 count 파라미터와 for_each 구문을 통해 구현됩니다.

// count로 반복
resource "aws_instance" "example" { 
  count = 3  // 3개의 인스턴스 생성
  
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"
}
--------------------------------------------------------
// for_each로 반복
variable "instances" {
  type = map(string)
  default = {
    "example1" = "t2.micro"
    "example2" = "t2.small"
  }
}

resource "aws_instance" "example" {
  for_each = var.instances
  
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = each.value
  tags = {
    Name = each.key
  }
}

 

TerraForm 실행

terraform init

  • Terraform 구성 파일이 있는 디렉토리를 초기화합니다.
  • Terraform에 필요한 모든 플러그인과 모듈을 다운로드하는 작업이 포함됩니다.
  • init은 새로운 Terraform 구성 작업을 시작할 때나 기존 구성을 다른 컴퓨터로 옮겼을 때 실행해야 합니다.

terraform validate

Terraform 구성 파일의 문법 오류를 검증합니다. 이 명령어는 구성이 올바른지, 모든 필수 값이 제공되었는지 등을 확인하지만, 실제 클라우드 리소스의 생성은 시도하지 않습니다.

terraform plan

실행 계획을 생성합니다. 이 명령어는 현재 인프라와 구성 파일 간의 차이점을 분석하여 Terraform이 수행할 작업을 보여줍니다. plan은 실제 리소스를 생성하거나 수정하기 전에 변경 사항을 미리 확인하는 데 유용합니다.

terraform apply

실제로 인프라를 생성하거나 수정합니다. terraform plan이 생성한 실행 계획에 따라 리소스를 배포합니다. 사용자는 실행 계획을 확인한 후 이 명령어를 통해 변경 사항을 적용할 수 있습니다.

terraform output

Terraform 구성에서 정의된 출력 변수의 값을 표시합니다. 이 명령어는 특정 리소스의 주요 정보(예: IP 주소, DNS 이름)를 검색할 때 유용합니다. 현재는 로드발란서의 DNS를 출력하게 코드를 생성했습니다.

terraform destroy

Terraform으로 관리되는 모든 리소스를 제거합니다. 이 명령어는 주의해서 사용해야 하며, 주로 인프라의 전체 삭제가 필요할 때 사용됩니다.

'AWS Cloud School > project' 카테고리의 다른 글

CloudFormation 실행하기 및 테스트  (0) 2024.03.11
CloudFormation을 이용하여 인프라 관리 Yaml 파일 생성  (0) 2024.03.02
DMZ 구성  (0) 2024.02.01
CentOS에서 보안 회선 VPN 구성 (실습)  (2) 2024.01.21
'AWS Cloud School/project' 카테고리의 다른 글
  • CloudFormation 실행하기 및 테스트
  • CloudFormation을 이용하여 인프라 관리 Yaml 파일 생성
  • DMZ 구성
  • CentOS에서 보안 회선 VPN 구성 (실습)
인프라 감자
인프라 감자
  • 인프라 감자
    삶은 인프라
    인프라 감자
  • 전체
    오늘
    어제
    • 분류 전체보기 (243)
      • 클라우드&인프라 (28)
        • 인프라 공부 (4)
        • AWS 구조와 서비스 (18)
        • 클라우드 공부 (4)
        • Terraform (2)
      • AWS Cloud School (13)
        • project (5)
        • Linux, Network (6)
        • Docker (2)
      • BackEnd (162)
        • JAVA 공부 (15)
        • 알고리즘 공부 (71)
        • MySQL 문제 풀기 (8)
        • 스프링 핵심 원리 - 기본편 (18)
        • 스프링 MVC 1편 (4)
        • 자바 ORM 표준 JPA 프로그래밍 (21)
        • 실전! 스프링 부트와 JPA 활용1 (8)
        • 실전! 스프링 부트와 JPA 활용2 (5)
        • 스프링 데이터 JPA (8)
        • Querydsl (4)
      • 혼자하는 프로젝트 (32)
        • 배달의 민족 클론코딩 (7)
        • 나만의 프로젝트 (10)
        • 스프링 부트로 구현한 웹 (15)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • Email
    • GitHub
  • 공지사항

  • 인기 글

  • 태그

    다이나믹 프로그래밍
    정렬
    디팬스 게임
    상속
    유니온 파인드
    querydsl
    스프링 핵심 원리-기본편
    중첩 선언
    네트워크 기본 용어
    쿼드 압축
    조합
    이것이 자바다
    완전탐색
    linux
    백트래킹
    자동 배포
    VPN
    자바
    프로그래머스
    dp
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
인프라 감자
CloudFormation을 TerraForm으로 변경하기
상단으로

티스토리툴바