HashiCorp 사의 코드형 인프라스트럭처 (Infrastructure as Code) 도구
클라우드부터 온프레미스 리소스, 하위 수준의 컴퓨팅, 스토리지, 네트워킹 리소스 상위 수준의 DNS 및 SaaS를 배포 및 관리
aws --version 을 입력해 버전 확인 및 설치 확인aws configure를 통해 Access Key 및 정보 입력cat .aws/credentials - 설정된 config 정보 확인aws sts get-caller-identity - 현재 접속된 aws 유저 정보aws s3 ls - 내 계정에 존재하는 s3 리스트 확인terraform --version - 설치 후 테라폼 버전 확인Terraform 인프라를 정의하기 위해 사용 하는 파일
<BLOCK_TYPE> "<BLOCK_LABEL>" ... {
<ARGUMENT>
}terraform init - 작성 완료된 .tf 파일을 기준으로 초기화terraform valid - 작성된 .tf 파일의 검증terraform plan - 작업 직전 현재 구성에서 필요한 변경사항이 계획대로 진행되는 것인지 확인하기 위해 사용terraform apply - .tf 파일의 설정대로 프로세스 진행terraform show - 상태 확인terraform fmt <terraform.tf> - 작성된 .tf 파일의 스타일 수정(=Python black)// 기본
variable "<var1>" {
default = "value"
}
// 타입 지정1
variable "<var2>" {
type = string
description = "value"
}
// 타입 지정2
variable "<var3>" {
type = list(string)
default = [
"<value1>",
"<value2>"
]
}
// 타입 지정3
variable "<var4>" {
type = map
default = {
<key1> = "<value1>"
<key2> = "<value2>"
}
}terraform apply -var="<var1>=<value1>"terraform apply -var="<var2>=['<value1>', '<value2>']".tfvars 파일안에 직접 변수와 값을 지정한다.
<var1>="<value1>"
<var2>="<value2>"
export TF_VAR_<var1>=<file>instance_type = var.instance_typeoutput 블록으로 정의
구성 파일에 출력 블록을 만들어 값을 정의하면 특정 정보를 쉽게 확인할 수 있다.
출력 값 예
output "pubIic.ip" {
description = "Public IP of Instance"
value = aws_instance.my_instance.public_ip
}
output "elastic_ip" {
description = "Elastic IP of Instance"
value = aws_eip.my_eip.public_ip
}
terraform output - 출력값 확인
자주 사용하는 문자열 및 표현식에 이름을 할당해 구성파일에서 사용할 수 있는 값(=지역변수)
locals 블록으로 정의
단순 문자열, 입력 변수, 리소스 속성, 다른 로컬 값을 포함 가능
local.<NAME> 형식으로 사용
resource "aws_instance" "example" {
tags = local.common_tags
}
variable "project_name" {
type = string
default = "my_project"
}
variable "environment" {
type = string
default = "dev"
}
locals {
common_tags = {
Name = "${var.project_name}-${var.environment}"
Project = var.project_name
Environment = var.environment
}
}
리소스의 데이터를 가져올 수 있는 기능
data 블록으로 정의
data "aws_ami" "example" {
most_recent = true
owners = ["self"]
tags = {
Name = "app-server"
Tested = "true"
}
}
사용 방법
data... 로 사용 및 참조
resource "aws_instance" "web" {
ami = data.aws_ami.web.id
instance_type = "t1.micro"
}
resource "aws_instance" "my_instance" {
ami = data.aws_ami.ubuntu_focal.id
instance_type = t2.micro
vpc_security_group_ids = [aws_security_group.my_sg_web.id]
/*
# 파일 함수로 user_data 제공
user_data = file("./web_deploy.sh")
*/
# 데이터 소스로 user_data 제공
user_data = data.template_file.myweb_deploy.rendered
tags = local.common_tags
}
data "template_file" "myweb_deploy"{
template = file("./web_deploy.sh")
}
# EC2 보안그룹 설정
resource "aws_security_group" "my_sg_web" {
name = "allow-web”
egress {
from_port = 0
to_port = 0
protocol - "-1"
cidr_blocks = ["0.0.0.0/0"]
}
ingress {
from port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
}
}
테라폼에서 제공하는 구성 관리 기능(리눅스-SSH, 윈도우-WinRM 과 같은 연결 설정 필요)
프로비저너 연결 예시
# file
provisionor "file" {
source = "conf/myapp.conf"
destination = "/etc/myapp.conf"
connection {
type = "ssh"
user = "root"
password = "${var.root_password}"
host = "$(var.host)"
}
}
# remote-exec
provisioner "remote=exec" {
inline = [
"chmod +x /tmp/web_deploy.sh"
"/tmp/web_deploy.sh"
]
}
# local-exec
provisioner "local-exec" {
command = "echo ${self.public_ip}" > ipaddr.txt
}
여러 리소스의 모음으로 디렉토리에 저장된 .tf, .tf.json 파일의 모음으로 구성되며 테라폼의 구성을 패키지화 해 재사용성을 높이는 역할을 한다.
terraform init - 구성에 필요한 모듈을 다운로드module 블록으로 정의 및 호출module "my_vpc" {
source = "terraform-aws-modules/vpc/aws"
name = var.vpc_name
cidr = var.vpc_cidr
azs = var.vpc_aza // 가용영역
private_subnets = var.vpc_private_subnets
public_subnets = var.vpc_public_subnets
enable_nat_gateway = true
enable_vpn_gateway = true
tags = {
Terraform = "true"
Environment = "dev"
}
}resource "aws_instance" "server" {
count = 4
ami = ""
instance_type = "t2.micro
tags = {
Name = "Server ${count.index}"
}
}[0] 부터 맨 끝의 -1까지 존재한다.<TYPE>.<NAME>[<INDEX>] 형태로 참조한다.백엔드 라고 한다.backend 블록으로 구성하며 원격 상태 저장소는 Terraform cloud를 이용해서 상태를 저장할 수 있다.terraform login 을 입력 후 출력에서 제공하는 https://app.terraform.io ~ 로 시작하는 URL을 선택해 로그인에 필요한 value를 받아 Enter a value 에 그대로 붙여넣기 하면 terraform cloud에 로그인 할 수 있다.자동화된 이미지 빌더로 여러 플랫폼에 대해 동일한 머신 이미지를 생성 할 수 있다.
일반적으로 클라우드 인프라에 사용할 수 있는 골든 이미지를 생성
.pkr.hcl 이며 packer 블록 외에는 테라폼의 .tf, .tf.json과 동일한 형태로 구성을 작성한다.