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
이 링크를 따라가 그대로 따라하면 yaml 파일을 tf 파일로 변경이 가능합니다.
트러블 슈팅
- 환경 변수 문제
- pip은 Package Installer of python으로 이걸 실행 하기 위해서는 파이썬이 설치되어 있어야 합니다.
- PythonSoftwareFoundation.Python.3.10_qbz5n2kfra8p0\LocalCache\local-packages\Python310\Scripts 이 파일이 있는 주소를 환경 변수에 추가해줘야 합니다.
- 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에 접근하기 위해 AWS CLI를 설치해야 합니다. 위의 AWS 사이트에 들어가 자신의 OS에 맞는 방법으로 다운을 받으면 됩니다.
TerraForm 설치
https://developer.hashicorp.com/terraform/install
이 사이트에 들어가 자신의 컴퓨터에 맞는 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 |