가시다 테라폼 스터디 1주차 정리

강재민·2023년 9월 2일
0

테라폼으로 시작하는 IaC 책을 기준으로 정리하였습니다.

IaC와 테라폼 이해하기

  • IaC란?
    • 코드형 인프라는 수동 프로세스가 아닌 코드를 통해 인프라를 관리하고 프로비저닝하는 것을 말합니다.
  • IaC의 특장점
    • IaC를 사용하면 인프라 사양을 담은 구성 파일이 생성되므로 구성을 편집하고 배포하기가 더 쉬워집니다.
    • IaC는 매번 동일한 환경을 프로비저닝하도록 보장합니다.
    • IaC는 구성 사양을 코드화하고 문서화함으로써 구성 관리를 지원하며, 구성 변경 사항을 문서화하지 않고 임시로 변경하는 일을 막을 수 있습니다.
    • 버전 제어는 IaC의 중요한 부분입니다.
      • 다른 소프트웨어 소스 코드 파일과 마찬가지로 구성파일도 소스 제어가 필요합니다.
      • 코드로 인프라를 배포한다는 것은 인프라를 모듈식 구성요소로 분할하고 자동화를 통해 다양한 방식으로 결합할 수 있다는 뜻이기도 합니다.
    • IaC로 인프라 프로비저닝을 자동화하면 애플리케이션을 개발하거나 배포할 때마다 개발자가 직접 서버, 운영체제, 스토리지, 기타 인프라 구성 요소를 수동으로 프로비저닝하고 관리할 필요가 없어집니다.
    • 인프라를 코드화하여 템플릿을 만들고 프로비저닝할 때 이 템플릿을 사용하면 됩니다.
      • IaC의 특장점 요약
        • 배포 속도 향상
        • 오류 감소
        • 인프라 일관성 향상
        • 구성 변동 제거
        • 모듈화 및 재사용성 향상
  • IaC에 대한 선언적 접근과 명령형 접근 방식 비교
    • 선언적 접근 방식
      • 필요한 리소스와 리소스의 속성 등 바람직한 시스템 상태를 정의하면 IaC 툴이 바람직한 상태로 구성해 줍니다.
      • 시스템 오브젝트의 현재 상태 목록을 유지하며, 이를 통해 인프라를 더 쉽게 관리할 수 있습니다.
    • 명령적 접근 방식
      - 바람직한 구성을 얻기 위한 특정 명령을 정의하며, 정의된 명령을 올바른 순서로 실행해야합니다.
      • IaC 접근 방식 요약
        • 선언적 접근 방식은 코드와 인프라의 상태가 항상 동일합니다.
          • 때문에 인프라가 늘어날 때 코드도 같이 늘어납니다.
        • 명령적 접근 방식은 단순한 명령어의 반복이 됩니다.
          • 때문에 인프라가 늘어날 때 명령어를 반복하면 됩니다.
  • IaC가 DevOps에 중요한 이유
    • 개발자가 하던 프로비저닝 작업을 대부분 IaC로 처리하고 개발자는 스크립트를 실행하여 인프라를 준비할 수 있습니다.
    • CI/CD는 통합 및 테스트에서 제공 및 배포에 이르는 애플리케이션 라이프사이클 전반에 걸쳐 지속적인 자동화와 지속적인 모니터링에 의존합니다.
    • 환경을 자동화하려면 환경에 일관성이 있어야합니다.
      • 개발팀의 애플리케이션 배포 또는 환경 구성방식이 운영 팀의 배포 및 구성 방식과 다른 경우 애플리케이션 자동화는 효과가 없습니다.
    • DevOps 접근 방식을 통해 개발 팀과 운영 팀의 방식을 서로 일치시키면 오류, 수동 배포, 비일관성 문제가 줄어듭니다.
      • IaC가 DevOps에 중요한 이유 요약
        • 개발자가 인프라를 손쉽게 다룰 수 있다.
        • 인프라부터 애플리케이션까지 자동화를 확장시킬 수 있다.
        • 일관성을 유지할 수 있다.
  • 테라폼이란?
    • 하시코프사에서 공개한 IaC 도구
    • 하시코프의 철학 중, 3가지를 담아서 테라폼을 설계: 워크플로우에 집중, 실용주의, 코드를 통한 버전관리
  • 테라폼 제공 유형
    • On-premise
      • Community Edition
      • 사용자의 컴퓨팅 환경에 오픈소스 바이너리툴인 테라폼을 통해 사용
    • Hosted SaaS
      • Terraform Cloud
      • SaaS로 제공되는 구성 환경
      • 하시코프가 관리하는 서버 환경이 제공
    • Private Install
      • Terraform Enterprise
      • 서버 설치형 구성 환경
      • 기업의 사내 정책에 따라 프로비저닝 관리가 외부 네트워크와 격리
    • 테라폼 제공 유형별 기능 리스트
      • 기본 기능
        • IaC, 워크스페이스, 입력 변수, Runs, State, 리소스 종속성 관리, 프로바이더 사용, 공개된 모듈 레지스트리 사용
      • Terraform Cloud/Enterprise 기능
        • 협업을 위한 기능
          • Remote State
          • VCS 연동
          • 워크스페이스 관리
          • 민감 변수 저장소
          • API
          • 팀 관리
          • 프라이빗 모듈 저장소
          • SAML, SSO
        • 거버넌스와 정책
          • 코드기반 정책
          • 비용 추정
          • Run Task
          • Audit
        • 셀프 서비스 인프라 기능
          • 구성 디자이너
          • No-code
          • 인프라 편차 추적
          • Service Now 연동
  • 테라폼 클라우드 가격정책
    • Free : 리소스 500개 까지 무료 → 커뮤니티 버전
    • Standard : Free + 워크플로우 기능 추가 + 동시실행(Concurrency 개수 3개)
    • Plus : 정책, 보안, 신뢰성, 확장성 등 기업형 고객에게 적합(대규모 사용자를 위한 비용모델)
    • Enterprise : Plus와 대부분 유사하며 설치형 모델

테라폼 기본 명령 사용법 알아보기

  • terraform init
    • 코드 사용 구문 기반으로 필요한 프로바이더 플러그인을 찾고 설치
    • '프로바이더/모듈/백엔드' 구성 설정/변경 시 수행 필요
    • terraform init -upgrade
      • 0.14 버전 이후부터 프로바이더 종속성을 고정시키는 .terraform.lock.hcl이 추가됨. 작업자가 의도적으로 버전을 변경하거나 코드에 명시한 다른 버전으로 변경하고자 할 때 사용
  • terraform validate
    • 디렉터리에 있는 테라폼 구성 파일의 유효성을 확인
    • API작업은 발생하지 않음
    • terraform validate -no-color
      • 파싱할 때 사용할 수 있음
    • teraform validate -json
      • 결과를 쿼리할 때 사용할 수 있음
  • terraform plan
    • 구성 내용을 바탕으로 어떤 리소스가 생성되는지 상세 내역 출력
    • 기본값 자동 입력 적용
    • terraform plan -detailed-exitcode
      • plan 추가 옵션으로, 파이프라인 설계에서 활용 가능, exitcode가 환경 변수로 구성됨
      • 코드 확인
        • echo $?
          • 0(변경 사항이 없는 성공)
          • 1(오류가 있음)
          • 2(변경 사항이 있는 성공)
  • terraform apply
    • 코드기반을 인프라에 적용할 수 있다.
    • terraform apply -auto-approve
      • 인터렉티브한 부분 없이 자동으로 적용
  • terraform state list
    • 현재 테라폼 상태를 확인할 수 있다.
  • terraform destroy
    • 테라폼 구성에서 관리하는 모든 개체를 제거하는 명령어
  • terraform fmt
    • 테라폼 구성 파일을 표준 형식과 표준 스타일로 적용
    • 코드 가독성 높임

HCL을 이해하고 기본 활용 방법을 학습하기

  • HCL이란?
    • HashiCorp Configuration Language
    • 하시코프사에서 IaC와 구성 정보를 명시하기 위해 개발된 오픈 소스 도구이다.
    • HCL은 CLI와 함께 사용하기 위해 인간과 기계 모두에게 친숙한 구조화된 구성 언어들을 만들기 위한 도구 키트이다.
    • HCL에는 사람이 쉽게 읽고 쓸 수 있도록 고안된 기본 구문과 기계가 더 쉽게 생상하고 구문 분석할 수 있는 JSON 기반 변형이 모두 있다.
    • HCL 기본 구문은 libucl, nginx 구성 등에서 영감을 받았다.
  • HCL의 특징
    • 동적인 구성 언어를 위한 변수함수를 사용할 수 있다.
    • 일반적인 프로그래밍 언어의 조건문 처리 같은 동작이가능하다.
      • 자동화와 더불어 쉽게, 버저닝해 히스토리를 관리하고 함께 작업할 수 있는 기반을 제공한다.
  • HCL을 사용하는 이유
    • 인간 친화적인 언어
    • 더 간결하고 읽기 쉽게 작성
    • 주석이 가능하다.
  • HCL 표현식
    • // 한줄 주석 방법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
}
  • HCL 표현식에서는 코드에서 사용되는 주석 표기부터 변수 정의 등을 포함하고 프로그래밍적인 연산과 구성 편의성을 높이기 위한 function 제공 - 링크
  • 테라폼으로 인프라를 구성하기 위한 선언 블록도 다수 존재 : terraform, resource, data, variable, local, output

샘플코드 작성 및 배포를 실습하기

  • [도전과제1] EC2 웹 서버 배포 + 리소스 생성 그래프 확인
    • Ubuntu 에 apache(httpd) 를 설치하고 index.html 생성(닉네임 출력)하는 userdata 를 작성해서 설정 배포 후 웹 접속 - 해당 테라폼 코드(파일)를 작성

디렉토리 생성

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"

웹서버 접속

0개의 댓글