Terraform을 사용하여 기본 Flask 웹 서버 배포

이 튜토리얼에서는 Terraform을 사용하여 Compute Engine에서 기본 웹 서버를 만들어 Terraform을 시작하는 방법을 알아봅니다.

이 가이드에서는 다음 작업을 수행합니다.

  • Terraform을 사용하여 Google Cloud에서 VM을 만듭니다.
  • 기본 Python Flask 서버를 시작합니다.

비용

이 문서에서는 비용이 청구될 수 있는 다음과 같은 Google Cloud 구성요소를 사용합니다.

Compute Engine

프로젝트 사용량을 기준으로 예상 비용을 산출하려면 가격 계산기를 사용하세요. Google Cloud를 처음 사용하는 사용자는 무료 체험판을 사용할 수 있습니다.

이 문서에 설명된 태스크를 완료했으면 만든 리소스를 삭제하여 청구가 계속되는 것을 방지할 수 있습니다. 자세한 내용은 삭제를 참조하세요.

시작하기 전에

튜토리얼을 시작할 준비를 합니다.

프로젝트 선택 또는 생성

  1. Google Cloud Console에서 프로젝트 선택기 페이지로 이동합니다.

    프로젝트 선택기로 이동

  2. Google Cloud 프로젝트를 선택하거나 만듭니다.

권한 설정

사용자 계정에 필요한 Compute Engine 권한이 있는지 확인합니다.

  • compute.instances.*
  • compute.firewalls.*

IAM 페이지로 이동

역할과 권한에 대해 자세히 알아보기

API 사용 설정

Compute Engine API 사용 설정

API 사용 설정

Cloud Shell 시작

Cloud Shell은 Compute Engine 가상 머신입니다.

이 가상 머신과 연결된 서비스 사용자 인증 정보는 자동으로 수행되므로 서비스 계정 키를 설정하거나 다운로드할 필요가 없습니다.

Terraform은 Cloud Shell과 통합되며, Cloud Shell은 Terraform을 자동으로 인증하므로 간단한 설정으로 시작할 수 있습니다.

Compute Engine VM 만들기

먼저 Terraform 구성 파일에서 VM 설정을 정의합니다. 그런 다음 Terraform 명령어를 실행하여 프로젝트에서 VM을 만듭니다.

디렉터리 만들기

Cloud Shell에서 새 디렉터리를 만듭니다. 새 디렉터리에서 Terraform 구성에 사용할 main.tf 파일을 만듭니다. 이 파일의 콘텐츠는 프로젝트에서 생성될 모든 Google Cloud 리소스를 설명합니다.

mkdir tf-tutorial && cd tf-tutorial
nano main.tf

가상 프라이빗 클라우드 네트워크 및 서브넷 만들기

이 섹션에서는 VM의 네트워크 인터페이스에 대해 Virtual Private Cloud(VPC) 네트워크 및 서브넷을 만듭니다.

만든 main.tf 파일에 다음 Terraform 리소스를 추가합니다.

resource "google_compute_network" "vpc_network" {
  name                    = "my-custom-mode-network"
  auto_create_subnetworks = false
  mtu                     = 1460
}

resource "google_compute_subnetwork" "default" {
  name          = "my-custom-subnet"
  ip_cidr_range = "10.0.1.0/24"
  region        = "us-west1"
  network       = google_compute_network.vpc_network.id
}

Compute Engine VM 리소스 만들기

이 섹션에서는 Debian을 실행하는 단일 Compute Engine 인스턴스를 만듭니다. 이 튜토리얼에서는 사용 가능한 가장 작은 머신 유형을 사용합니다. 나중에 더 큰 머신 유형으로 업그레이드할 수 있습니다.

만든 google_compute_instance Terraform 리소스를 다음 main.tf 파일에 추가합니다.

# Create a single Compute Engine instance
resource "google_compute_instance" "default" {
  name         = "flask-vm"
  machine_type = "f1-micro"
  zone         = "us-west1-a"
  tags         = ["ssh"]

  boot_disk {
    initialize_params {
      image = "debian-cloud/debian-11"
    }
  }

  # Install Flask
  metadata_startup_script = "sudo apt-get update; sudo apt-get install -yq build-essential python3-pip rsync; pip install flask"

  network_interface {
    subnetwork = google_compute_subnetwork.default.id

    access_config {
      # Include this section to give the VM an external IP address
    }
  }
}

샘플 코드는 Google Cloud 영역을 us-west1-a로 설정합니다. 다른 영역으로 변경할 수 있습니다.

Terraform 초기화

이제 terraform init을 실행하여 필요한 플러그인을 추가하고 .terraform 디렉터리를 빌드할 수 있습니다.

terraform init

출력:

Initializing the backend...

Initializing provider plugins...
...

Terraform has been successfully initialized!

Terraform 구성 검증

필요한 경우 지금까지 빌드한 Terraform 코드를 검증할 수 있습니다. 다음을 실행하는 terraform plan을 실행합니다.

  • main.tf 구문이 올바른지 확인합니다.
  • 생성될 리소스의 미리보기를 표시합니다.
terraform plan

출력:

...

Plan: 1 to add, 0 to change, 0 to destroy.

Note: You didn't use the -out option to save this plan, so Terraform can't
guarantee to take exactly these actions if you run "terraform apply" now.

구성 적용

VM을 만들려면 terraform apply를 실행합니다.

terraform apply

메시지가 표시되면 yes를 입력합니다.

Terraform에서 Google Cloud API를 호출하여 새 VM을 설정합니다. VM 인스턴스 페이지에서 새 VM을 확인하세요.

Google Cloud에서 웹 서버 실행

다음 단계에서는 웹 애플리케이션을 만들어 VM에 배포하고 웹 애플리케이션에 대한 클라이언트 요청을 허용하는 방화벽 규칙을 만듭니다.

커스텀 SSH 방화벽 규칙 추가

default 네트워크의 default-allow-ssh 방화벽 규칙을 사용하면 SSH를 통해 VM에 연결할 수 있습니다. 자체 커스텀 방화벽 규칙을 사용하려면 main.tf 파일 끝에 다음 리소스를 추가할 수 있습니다.

resource "google_compute_firewall" "ssh" {
  name = "allow-ssh"
  allow {
    ports    = ["22"]
    protocol = "tcp"
  }
  direction     = "INGRESS"
  network       = google_compute_network.vpc_network.id
  priority      = 1000
  source_ranges = ["0.0.0.0/0"]
  target_tags   = ["ssh"]
}

terraform apply를 실행하여 방화벽 규칙을 만듭니다.

SSH를 사용하여 VM에 연결

이 시점에서 SSH로 VM에 연결하여 올바르게 설정되었는지 확인합니다.

  1. VM 인스턴스 페이지로 이동합니다.

  2. 이름이 flask-vm인 VM을 찾습니다.

  3. 연결 열에서 SSH를 클릭합니다.

    실행 중인 VM에 대해 SSH-in-browser 터미널 창이 열립니다.

자세한 내용은 VM에 연결을 참조하세요.

Flask 앱 빌드

이 튜토리얼용 Python Flask 앱을 빌드하여 웹 서버 및 테스트 엔드포인트를 설명하는 단일 파일을 가질 수 있습니다.

  1. 브라우저에서 SSH를 통해 연결한 터미널에서 app.py라는 파일을 만듭니다.

    nano app.py
    
  2. app.py 파일에 다음을 추가합니다.

    from flask import Flask
    app = Flask(__name__)
    
    @app.route('/')
    def hello_cloud():
      return 'Hello Cloud!'
    
    app.run(host='0.0.0.0')
    
  3. app.py을 실행합니다.

    python3 app.py
    

    Flask는 기본적으로 localhost:5000에서 트래픽을 제공합니다.

  4. 두 번째 SSH 연결을 엽니다.

    1. VM 인스턴스 페이지로 이동합니다.
    2. flask-vm이라는 VM을 찾고 SSH를 클릭합니다.
  5. 두 번째 SSH 연결에서 curl을 실행하여 app.py에서 구성한 인사말이 반환되는지 확인합니다.

    curl http://0.0.0.0:5000
    

    이 명령어의 출력은 Hello Cloud입니다.

VM에서 포트 5000 열기

로컬 컴퓨터에서 웹 서버에 연결하려면 VM에 포트 5000이 열려 있어야 합니다. Google Cloud에서는 방화벽 규칙을 사용하여 트래픽에 대한 포트를 열 수 있습니다.

main.tf 파일 끝에 다음 google_compute_firewall Terraform 리소스를 추가합니다.

resource "google_compute_firewall" "flask" {
  name    = "flask-app-firewall"
  network = google_compute_network.vpc_network.id

  allow {
    protocol = "tcp"
    ports    = ["5000"]
  }
  source_ranges = ["0.0.0.0/0"]
}

Cloud Shell에서 terraform apply를 실행하여 방화벽 규칙을 만듭니다.

웹 서버 URL의 출력 변수 추가

  1. main.tf 끝에 Terraform 출력 변수를 추가하여 웹 서버 URL을 출력합니다.

    // A variable for extracting the external IP address of the VM
    output "Web-server-URL" {
     value = join("",["http://",google_compute_instance.default.network_interface.0.access_config.0.nat_ip,":5000"])
    }
    
  2. terraform apply를 실행합니다.

    terraform apply
    

    메시지가 표시되면 yes를 입력합니다. Terraform은 다음과 같이 VM의 외부 IP 주소와 포트 5000을 화면에 출력합니다.

    Web-server-URL = "http://IP_ADDRESS:5000"
    

    언제든지 terraform output을 실행하여 이 출력을 반환할 수 있습니다.

    terraform output
    
  3. 이전 단계의 URL을 클릭하고 'Hello Cloud!' 메시지를 확인합니다.

    이는 서버가 실행 중임을 의미합니다.

문제 해결하기

  • 필요한 API가 사용 설정되지 않은 경우 Terraform에서 오류를 반환합니다. 오류 메시지에는 API를 사용 설정하는 링크가 포함됩니다. API를 사용 설정한 후 terraform apply를 다시 실행할 수 있습니다.

  • SSH를 통해 VM에 연결할 수 없는 경우 다음을 수행합니다.

    • SSH 방화벽 규칙을 추가해야 합니다.
    • VM에 tags = ["ssh"] 인수가 포함되었는지 확인합니다.

삭제

이 튜토리얼을 완료한 후 추가 비용이 발생하지 않도록 생성된 모든 리소스를 삭제할 수 있습니다.

Terraform에서는 terraform destroy 명령어를 실행하여 구성 파일에 정의된 모든 리소스를 삭제할 수 있습니다.

terraform destroy

Terraform에서 리소스를 삭제할 수 있도록 yes를 입력합니다.

다음 단계