리소스 정의

LinuxBeginner
지금 연습하기

소개

이전 실습에서는 주방, 즉 Terraform 을 설치했습니다. 이제 메뉴를 작성할 차례입니다.

Terraform 에서는 일반적으로 모든 하위 수준의 작업을 하나씩 직접 설명하지 않습니다. 대신 원하는 인프라 객체를 선언합니다. Terraform 이 관리하는 각 객체를 리소스라고 합니다.

리소스는 Terraform 이 관리하는 기본 단위입니다. .tf 파일의 코드와 대상 플랫폼의 실제 객체를 연결하는 다리 역할을 합니다.

레스토랑에서 주문하는 상황을 생각해 보세요. 요리사에게“양파를 썰고, 볶고, 달걀 두 개를 풀고…”라고 말하는 대신“오믈렛을 주세요”라고만 말합니다. Terraform 은 주문 (구성) 을 받아 주방 (Docker) 이 요청한 내용을 정확히 준비하도록 확인하는 웨이터와 같습니다.

이것이 Terraform 의 핵심 워크플로입니다. 리소스를 정의하고, 제안된 변경 사항을 미리 확인한 다음, 적용합니다.

이미지 정의

먼저 필요한 재료를 선언합니다. Docker 환경에서는 컨테이너를 실행하기 전에 이미지가 필요합니다. 이미지는 소프트웨어를 동결된 패키지로 묶어 둔 것과 같습니다.

먼저 프로젝트 폴더로 이동한 다음 주문서 역할을 할 main.tf 파일을 만듭니다.

cd ~/project
touch main.tf

텍스트 편집기 nano를 사용해 main.tf를 엽니다.

nano main.tf

항상 Terraform 에 작업을 수행할 주체인 Provider 를 먼저 알려줍니다. Docker provider 를 설정하려면 다음 표준 블록을 파일 맨 위에 복사하여 붙여 넣습니다.

terraform {
  required_providers {
    docker = {
      source  = "kreuzwerker/docker"
      version = "~> 3.0.1"
    }
  }
}

provider "docker" {}

이제 첫 번째 요청인 Nginx 이미지를 추가합니다. 아래 코드를 provider 블록 아래의 main.tf에 이어서 추가합니다. 아래로 이동할 때는 화살표 키를 사용합니다.

resource "docker_image" "nginx" {
  name         = "nginx:latest"
  keep_locally = false
}

코드를 붙여 넣은 후 작업 내용을 저장합니다. Ctrl + O를 누르고 Enter 키를 눌러 확인한 다음, Ctrl + X를 눌러 편집기를 종료합니다.

이 구성을 다음과 같이 해석할 수 있습니다.

  • resource: Terraform 에“무언가를 주문하고 싶다”고 알려주는 키워드입니다.
  • "docker_image": 주문하는 항목의 **유형 (Type)**입니다. AWS 와 연동한다면 aws_instance가 될 수도 있습니다.
  • "nginx": 나중에 이 항목을 참조할 수 있도록 노트에 지정하는 **이름 (Name)**입니다. 실제 환경의 객체에는 영향을 주지 않습니다.
  • name = "nginx:latest": Docker 에 전달하는 구체적인 매개변수입니다. Docker 에 다운로드할 이미지를 정확히 알려줍니다.

이제 설계도에 provider 와 하나의 리소스 정의가 포함되었습니다.

컨테이너 정의

이미지는 디스크에 저장되어 있지만, 컨테이너는 실행 중인 애플리케이션입니다. 레시피와 접시에 담긴 실제 음식의 차이와 같습니다.

이제 main.tf 파일에 두 번째 리소스를 추가합니다. 새 리소스는 첫 번째 리소스에 종속됩니다.

다시 nano를 사용해 main.tf를 엽니다.

nano main.tf

화살표 키를 사용해 파일 맨 아래로 이동한 다음, 다음 블록을 파일 끝에 붙여 넣습니다.

resource "docker_container" "web" {
  image = docker_image.nginx.image_id
  name  = "tutorial"
  ports {
    internal = 80
    external = 8000
  }
}

image = docker_image.nginx.image_id 줄에 있는 참조에 주목하세요.

이 참조는 단순히 입력을 편리하게 해 주는 기능이 아닙니다. Terraform 이 종속성 그래프를 구성하여 리소스를 어떤 순서로 생성할지 자동으로 결정하도록 합니다.

nginx:latest를 다시 입력하는 대신, 앞에서 정의한 리소스 (docker_image.nginx) 를 가리킵니다. 이는 Terraform 에“이미지 준비를 완료하기 전에는 이 컨테이너를 생성하지 마세요”라고 알려줍니다. 이것이 **종속성 (Dependencies)**을 생성하는 방법입니다.

또한 ports 블록도 추가했습니다. 이 설정은 컴퓨터의 포트 8000 에서 컨테이너의 포트 80 으로 연결되는 통로를 열어 웹사이트를 볼 수 있게 합니다.

초기화 및 계획 확인

Terraform 이 변경 사항을 적용하기 전에 프로젝트를 초기화하여 도구를 다운로드한 다음, 실행 계획을 미리 확인해야 합니다.

먼저 init을 실행해 Docker provider 플러그인을 설치합니다.

terraform init

웨이터가 주문을 확인하지 않고 바로 음식을 가져온다면 위험할 것입니다. Terraform 에는 Plan이라는 안전 기능이 있습니다. 사용자가 요청한 내용과 현재 존재하는 내용을 비교해 차이를 계산합니다.

plan 명령을 실행합니다.

terraform plan

출력을 자세히 확인합니다. 리소스 옆에 녹색 + 기호가 표시됩니다. 이 기호는“이 리소스를 생성합니다”라는 뜻입니다.

Plan 단계는 Terraform 의 가장 중요한 안전 기능 중 하나입니다. 실제 환경을 변경하기 전에 제안된 변경 사항을 검토할 수 있게 해 줍니다.

핵심 팁: 항상 plan 을 읽으세요. 실수가 실제 인프라에 반영되기 전에 발견할 수 있는 마지막 기회입니다.

변경 사항 적용

계획이 올바르게 보입니다. 이제 웨이터에게“그대로 실행하세요”라고 말할 차례입니다.

apply 명령은 계획을 실행합니다.

terraform apply

Terraform 은 신중하게 동작합니다. 계획을 한 번 더 표시하고 최종 확인을 요청합니다. 계속하려면 yes를 입력해야 합니다.

Do you want to perform these actions?
  Terraform will perform the actions described above.
  Only 'yes' will be accepted to approve.

  Enter a value: yes

yes를 입력하고 Enter 키를 누르면 Terraform 이 Docker 에 연결하여 이미지를 가져오고 컨테이너를 시작합니다.

제대로 동작했는지 확인해 보겠습니다. 표준 Docker 명령을 사용해 컨테이너가 실행 중인지 확인할 수 있습니다.

docker ps

방금 배포한 웹사이트도 테스트할 수 있습니다. 포트 8000 을 매핑했으므로 curl을 사용해 다음과 같이 접속합니다.

curl localhost:8000

Welcome to nginx!의 HTML 코드가 표시되면 코드로 첫 번째 인프라를 성공적으로 배포한 것입니다.

요약

축하합니다! Terraform 의 핵심 워크플로를 완료했습니다.

이 실습에서는 다음 내용을 배웠습니다.

  • 리소스 정의: main.tf에서 원하는 항목 (이미지와 컨테이너) 을 지정하는 방법입니다.
  • 참조: 리소스를 서로 연결하는 방법입니다. 예를 들어 컨테이너가 사용할 이미지를 지정할 수 있습니다.
  • Plan: 변경 사항을 적용하기 전에“청구서”를 미리 확인하는 과정입니다.
  • Apply: 실제 인프라를 생성하는 과정입니다.

작성 -> Plan -> Apply의 순환 과정은 전문가가 대규모 클라우드 인프라를 관리하는 방식과 정확히 같습니다. 이제 DevOps 엔지니어가 되기 위한 첫걸음을 내디뎠습니다.