Esegui il deployment di un server web Flask di base utilizzando Terraform

In questo tutorial imparerai a iniziare a utilizzare Terraform creando un server web di base su Compute Engine.

In questo tutorial imparerai a:

  • Utilizzare Terraform per creare una VM in Google Cloud.
  • Avviare un server Python Flask di base.

Costi

In questo documento vengono utilizzati i seguenti componenti fatturabili di Google Cloud:

Compute Engine

Per generare una stima dei costi in base all'utilizzo previsto, utilizza il calcolatore prezzi.

I nuovi Google Cloud utenti potrebbero avere diritto a una prova senza costi.

Al termine delle attività descritte in questo documento, puoi evitare l'addebito di ulteriori costi eliminando le risorse che hai creato. Per saperne di più, consulta Esegui la pulizia.

Prima di iniziare

Preparati a iniziare il tutorial.

Seleziona o crea un progetto

  1. Nella Google Cloud console, vai alla pagina di selezione del progetto.

    Vai al selettore di progetti

  2. Seleziona o crea un Google Cloud progetto.

    Ruoli richiesti per selezionare o creare un progetto

    • Seleziona un progetto: la selezione di un progetto non richiede un ruolo IAM specifico: puoi selezionare qualsiasi progetto su cui ti è stato concesso un ruolo.
    • Crea un progetto: per creare un progetto, devi disporre del ruolo Autore progetto (roles/resourcemanager.projectCreator), che contiene l' resourcemanager.projects.create autorizzazione. Scopri come concedere i ruoli.

Configurare le autorizzazioni

Assicurati di disporre delle autorizzazioni di Compute Engine necessarie sul tuo account utente:

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

Vai alla pagina IAM

Scopri di più sui ruoli e le autorizzazioni.

Abilita l'API

Abilita l'API Compute Engine

Ruoli richiesti per abilitare le API

Per abilitare le API, devi disporre del ruolo IAM Amministratore utilizzo servizi (roles/serviceusage.serviceUsageAdmin), che contiene l'autorizzazione serviceusage.services.enable. Scopri come concedere i ruoli.

Abilita l'API

Avvia Cloud Shell

Cloud Shell è una macchina virtuale Compute Engine.

Le credenziali di servizio associate a questa macchina virtuale sono automatiche, quindi non è necessario configurare o scaricare una chiave dell'account di servizio.

Terraform è integrato con Cloud Shell e Cloud Shell autentica automaticamente Terraform, consentendoti di iniziare con una configurazione ridotta.

Crea la VM Compute Engine

Innanzitutto, definisci le impostazioni della VM in un file di configurazione Terraform. Poi, esegui i comandi Terraform per creare la VM nel tuo progetto.

Crea la directory

Crea una nuova directory. Nella nuova directory, crea un file main.tf per la configurazione di Terraform. I contenuti di questo file descrivono tutte le Google Cloud risorse da creare nel progetto.

In Cloud Shell:

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

Crea la rete e la subnet Virtual Private Cloud

In questa sezione, crei una rete e una subnet Virtual Private Cloud (VPC) per l'interfaccia di rete della VM.

Aggiungi le seguenti risorse Terraform al file main.tf che hai creato:

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
}

Crea la risorsa VM Compute Engine

In questa sezione, crei una singola istanza Compute Engine che esegue Debian. In questo tutorial, utilizzi il tipo di macchina più piccolo disponibile. In un secondo momento, puoi eseguire l'upgrade a un tipo di macchina più grande.

Aggiungi la seguente google_compute_instance risorsa Terraform al file main.tf che hai creato.

# 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
    }
  }
}

Il codice campione imposta la Google Cloud zona su us-west1-a. Puoi modificare questa in una zona diversa.

Inizializza Terraform

A questo punto, puoi eseguire terraform init per aggiungere i plug-in necessari e creare la directory .terraform.

terraform init

Output:

Initializing the backend...

Initializing provider plugins...
...

Terraform has been successfully initialized!

Convalida la configurazione Terraform

Facoltativamente, puoi convalidare il codice Terraform che hai creato finora. Esegui terraform plan, che esegue le seguenti operazioni:

  • Verifica che la sintassi di main.tf sia corretta
  • Mostra un'anteprima delle risorse che verranno create
terraform plan

Output:

...

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.

Applica la configurazione

Per creare la VM, esegui terraform apply.

terraform apply

Quando richiesto, inserisci yes.

Terraform chiama le Google Cloud API per configurare la nuova VM. Controlla la pagina delle istanze VM per visualizzare la nuova VM.

Esegui un server web su Google Cloud

I passaggi successivi consistono nella creazione di un'applicazione web, nel deployment della VM e nella creazione di una regola firewall per consentire le richieste client all'applicazione web.

Aggiungi una regola firewall SSH personalizzata

La regola firewall default-allow-ssh nella rete default ti consente di utilizzare SSH per connetterti alla VM. Se preferisci utilizzare una regola firewall personalizzata, puoi aggiungere la seguente risorsa alla fine del file 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"]
}

Esegui terraform apply per creare la regola firewall.

Connettiti alla VM con SSH

A questo punto, verifica che tutto sia configurato correttamente connettendoti alla VM con SSH.

  1. Vai alla pagina Istanze VM.

  2. Trova la VM con il nome flask-vm.

  3. Nella colonna Connetti, fai clic su SSH.

    Si apre una finestra del terminale SSH nel browser per la VM in esecuzione.

Per saperne di più, consulta Connessione alle VM.

Crea l'app Flask

Per questo tutorial, crei un'app Python Flask in modo che tu possa avere un unico file che descrive il server web e gli endpoint di test.

  1. Nel terminale SSH nel browser, crea un file denominato app.py.

    nano app.py
    
  2. Aggiungi quanto segue al file 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. Esegui app.py:

    python3 app.py
    

    Per impostazione predefinita, Flask gestisce il traffico su localhost:5000.

  4. Apri una seconda connessione SSH:

    1. Vai alla pagina Istanze VM.
    2. Trova la VM denominata flask-vm e fai clic su SSH.
  5. Nella seconda connessione SSH, esegui curl per verificare che venga restituito il saluto configurato in app.py.

    curl http://0.0.0.0:5000
    

    L'output di questo comando è Hello Cloud.

Apri la porta 5000 sulla VM

Per connetterti al server web dal computer locale, la VM deve avere la porta 5000 aperta. Google Cloud ti consente di aprire le porte al traffico utilizzando le regole firewall.

Aggiungi la seguente google_compute_firewall risorsa Terraform alla fine del file main.tf.

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"]
}

In Cloud Shell, esegui terraform apply per creare la regola firewall.

Aggiungi una variabile di output per l'URL del server web

  1. Alla fine di main.tf, aggiungi una variabile di output Terraform per generare l'URL del server web:

    // 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. Esegui terraform apply.

    terraform apply
    

    Quando richiesto, inserisci yes. Terraform stampa l'indirizzo IP esterno della VM e la porta 5000 sullo schermo, come segue:

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

    In qualsiasi momento, puoi eseguire terraform output per restituire questo output:

    terraform output
    
  3. Fai clic sull'URL del passaggio precedente e visualizza il messaggio "Hello Cloud!".

    Ciò significa che il server è in esecuzione.

Risoluzione dei problemi

  • Se un'API richiesta non è abilitata, Terraform restituisce un errore. Il messaggio di errore include un link per abilitare l'API. Dopo aver abilitato l'API, puoi eseguire di nuovo terraform apply.

  • Se non riesci a connetterti alla VM tramite SSH:

    • Assicurati di aggiungere la regola firewall SSH.
    • Assicurati che la VM includa l'argomento tags = ["ssh"].

Libera spazio

Al termine del tutorial, puoi eliminare tutto ciò che hai creato per non incorrere in ulteriori costi.

Terraform ti consente di rimuovere tutte le risorse definite nel file di configurazione eseguendo il comando terraform destroy:

terraform destroy

Inserisci yes per consentire a Terraform di eliminare le risorse.

Passaggi successivi