테라폼으로 시작하는 IaC 책을 기준으로 정리하였습니다.
편집하고 배포하기가 더 쉬워집
니다.동일한 환경을 프로비저닝
하도록 보장합니다.변경 사항을
문서화하지 않고 임시로 변경하는 일을 막을 수 있
습니다.버전 제어
는 IaC의 중요한 부분입니다.소스 제어
가 필요합니다.모듈식 구성요소로 분할하고 자동화
를 통해 다양한 방식으로 결합할 수 있다는 뜻이기도 합니다.개발자가
직접 서버, 운영체제, 스토리지, 기타 인프라 구성 요소를 수동으로 프로비저닝하고 관리할 필요가 없어집
니다.템플릿
을 사용하면 됩니다.
- IaC의 특장점 요약
- 배포 속도 향상
- 오류 감소
- 인프라 일관성 향상
- 구성 변동 제거
- 모듈화 및 재사용성 향상
바람직한 시스템 상태를 정의
하면 IaC 툴이 바람직한 상태로 구성해 줍니다.현재 상태 목록을 유지
하며, 이를 통해 인프라를 더 쉽게 관리할 수 있습니다.정의된 명령을 올바른 순서로 실행
해야합니다.
- IaC 접근 방식 요약
- 선언적 접근 방식은 코드와 인프라의 상태가 항상 동일합니다.
- 때문에 인프라가 늘어날 때 코드도 같이 늘어납니다.
- 명령적 접근 방식은 단순한 명령어의 반복이 됩니다.
- 때문에 인프라가 늘어날 때 명령어를 반복하면 됩니다.
스크립트를 실행하여 인프라를 준비
할 수 있습니다.라이프사이클 전반에 걸쳐
지속적인 자동화와 지속적인 모니터링에 의존합니다.일관성
이 있어야합니다.
- IaC가 DevOps에 중요한 이유 요약
- 개발자가 인프라를 손쉽게 다룰 수 있다.
- 인프라부터 애플리케이션까지 자동화를 확장시킬 수 있다.
- 일관성을 유지할 수 있다.
워크플로우에 집중
, 실용주의
, 코드를 통한 버전관리
사용자의 컴퓨팅 환경
에 오픈소스 바이너리툴인 테라폼을 통해 사용하시코프가 관리하는 서버
환경이 제공외부 네트워크와 격리
terraform init
필요한 프로바이더 플러그인을 찾고 설치
구성 설정/변경 시 수행 필요
terraform init -upgrade
0.14
버전 이후부터 프로바이더 종속성을 고정시키는 .terraform.lock.hcl이 추가됨. 작업자가 의도적으로 버전을 변경하거나 코드에 명시한 다른 버전으로 변경하고자 할 때 사용terraform validate
terraform validate -no-color
teraform validate -json
terraform plan
terraform plan -detailed-exitcode
echo $?
terraform apply
terraform apply -auto-approve
terraform state list
terraform destroy
terraform fmt
구성 정보를 명시
하기 위해 개발된 오픈 소스 도구이다.인간과 기계 모두에게 친숙
한 구조화된 구성 언어들을 만들기 위한 도구 키트이다.libucl
, nginx
구성 등에서 영감을 받았다.변수
및 함수
를 사용할 수 있다.조건문 처리
같은 동작이가능하다.함께 작업할 수 있는 기반
을 제공한다.//
한줄 주석 방법1#
한줄 주석 방법2/*
라인
주석
*/
실제 표현 예시
- locals { key1 = "value1" # = 를 기준으로 키와 값이 구분되며 myStr = "TF ♡ UTF-8" # UTF-8 문자를 지원한다. multiStr = <<EOF Multi Line String with anytext EOF boolean1 = true # boolean true boolean2 = false # boolean false를 지원한다. deciaml = 123 # 기본적으로 숫자는 10진수, octal = 0123 # 0으로 시작하는 숫자는 8진수, hexadecimal = "0xD5" # 0x 값을 포함하는 스트링은 16진수, scientific = 1e10 # 과학표기 법도 지원한다. # funtion 호출 예 myprojectname = format("%s is myproject name", var.project) # 3항 연산자 조건문을 지원한다. credentials = var.credentials == "" ? file(var.credentials_file) : var.credentials }
[도전과제1]
EC2 웹 서버 배포 + 리소스 생성 그래프 확인디렉토리 생성
mkdir sample-deploy
cd sample-deploy
vi main.tf
샘플코드 작성
provider "aws" {
region = "ap-northeast-2"
}
resource "aws_instance" "example" {
ami = "ami-0c9c942bd7bf113a2"
instance_type = "t2.micro"
vpc_security_group_ids = [aws_security_group.instance.id]
key_name = "myubuntu" # 트러블슈팅을 위해 ssh 접속
user_data = <<-EOF
#!/bin/bash
apt-get update
apt-get install -y apache2
service apache2 start
echo "Hello, I'm repush" > /var/www/html/index.html
EOF
# 아파치 설치 후 시작, 문구 수정
tags = {
Name = "Single-WebSrv"
}
}
resource "aws_security_group" "instance" {
name = var.security_group_name
ingress {
from_port = 80
to_port = 80
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
} # 아피치 접속을 위한 인바운드
ingress {
from_port = 22
to_port = 22
protocol = "tcp"
cidr_blocks = ["0.0.0.0/0"]
} # SSH 접속을 위한 인바운드
egress {
from_port = 0
to_port = 0
protocol = "-1"
cidr_blocks = ["0.0.0.0/0"]
} # 아파치 설치를 위한 아웃바운드
}
variable "security_group_name" {
description = "The name of the security group"
type = string
default = "terraform-example-instance"
}
output "public_ip" {
value = aws_instance.example.public_ip
description = "The public IP of the Instance"
} # 외부 접속 ip 출력
테라폼 실행
terraform init
terraform plan
terraform apply
결과
aws_security_group.instance: Creating...
aws_security_group.instance: Creation complete after 2s [id=sg-02132b4bd8bcaec97]
aws_instance.example: Creating...
aws_instance.example: Still creating... [10s elapsed]
aws_instance.example: Still creating... [20s elapsed]
aws_instance.example: Still creating... [30s elapsed]
aws_instance.example: Creation complete after 32s [id=i-07dc98b1a7f9b07b4]
Apply complete! Resources: 2 added, 0 changed, 0 destroyed.
Outputs:
public_ip = "3.34.124.168"
웹서버 접속