Implemente um servidor Web Flask básico através do Terraform

Neste tutorial, vai aprender a começar a usar o Terraform através do Terraform para criar um servidor Web básico no Compute Engine.

Neste tutorial, vai fazer o seguinte:

  • Use o Terraform para criar uma VM no Trusted Cloud.
  • Inicie um servidor Python Flask básico.

Custos

Neste documento, usa os seguintes componentes faturáveis do Trusted Cloud by S3NS:

Compute Engine

Quando terminar as tarefas descritas neste documento, pode evitar a faturação contínua eliminando os recursos que criou. Para mais informações, consulte o artigo Limpe.

Antes de começar

Prepare-se para iniciar o tutorial.

Selecione ou crie um projeto

  1. In the Trusted Cloud console, go to the project selector page.

    Go to project selector

  2. Select or create a Trusted Cloud project.

    Roles required to select or create a project

    • Select a project: Selecting a project doesn't require a specific IAM role—you can select any project that you've been granted a role on.
    • Create a project: To create a project, you need the Project Creator (roles/resourcemanager.projectCreator), which contains the resourcemanager.projects.create permission. Learn how to grant roles.

Configure as autorizações

Certifique-se de que tem as autorizações do Compute Engine necessárias na sua conta de utilizador:

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

Aceda à página IAM

Saiba mais acerca das funções e autorizações.

Ative a API

Enable the Compute Engine API.

Roles required to enable APIs

To enable APIs, you need the Service Usage Admin IAM role (roles/serviceusage.serviceUsageAdmin), which contains the serviceusage.services.enable permission. Learn how to grant roles.

Enable the API

Instale a CLI gcloud

Para usar o Terraform a partir de um ambiente de desenvolvimento local, instale e inicialize a CLI Google Cloud e, em seguida, configure as credenciais predefinidas da aplicação com as suas credenciais de utilizador:

  1. Instale a CLI gcloud.
  2. Inicialize a CLI gcloud:
    gcloud init
  3. Crie credenciais de autenticação local para a sua conta:
    gcloud auth application-default login

Crie a VM do Compute Engine

Primeiro, define as definições da VM num ficheiro de configuração do Terraform. Em seguida, execute comandos do Terraform para criar a VM no seu projeto.

Crie o diretório

Crie um novo diretório. No novo diretório, crie um ficheiro main.tf para a configuração do Terraform. O conteúdo deste ficheiro descreve todos os Trusted Cloud recursos a criar no projeto.

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

Crie a rede e a sub-rede da nuvem privada virtual

Nesta secção, cria uma rede da nuvem virtual privada (VPC) e uma sub-rede para a interface de rede da VM.

Adicione os seguintes recursos do Terraform ao ficheiro main.tf que criou:

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
}

Crie o recurso de VM do Compute Engine

Nesta secção, cria uma única instância do Compute Engine que executa o Debian. Neste tutorial, usa o tipo de máquina mais pequeno disponível. Mais tarde, pode atualizar para um tipo de máquina maior.

Adicione o seguinte recurso do google_compute_instance Terraform ao ficheiro main.tf que criou.

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

O exemplo de código define a Trusted Cloud zona como us-west1-a. Pode alterar esta opção para uma zona diferente.

Inicialize o Terraform

Neste ponto, pode executar terraform init para adicionar os plug-ins necessários e criar o diretório .terraform.

terraform init

Saída:

Initializing the backend...

Initializing provider plugins...
...

Terraform has been successfully initialized!

Valide a configuração do Terraform

Opcionalmente, pode validar o código do Terraform que criou até agora. Executar terraform plan, que faz o seguinte:

  • Verifica se a sintaxe de main.tf está correta
  • Mostra uma pré-visualização dos recursos que vão ser criados
terraform plan

Saída:

...

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.

Aplique a configuração

Para criar a VM, execute o comando terraform apply.

terraform apply

Quando lhe for pedido, introduza yes.

O Terraform chama as Trusted Cloud APIs para configurar a nova VM. Consulte a página de instâncias de VM para ver a nova VM.

Execute um servidor Web em Trusted Cloud

Os passos seguintes consistem em criar uma aplicação Web, implementá-la na VM e criar uma regra de firewall para permitir pedidos de clientes à aplicação Web.

Adicione uma regra de firewall SSH personalizada

A regra de firewall default-allow-ssh na rede default permite-lhe usar o SSH para se ligar à VM. Se preferir usar a sua própria regra de firewall personalizada, pode adicionar o seguinte recurso no final do ficheiro 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"]
}

Execute terraform apply para criar a regra de firewall.

Ligue-se à VM com SSH

Valide se tudo está configurado corretamente neste ponto ligando-se à VM com SSH.

  1. Aceda à página Instâncias de VM.

  2. Encontre a VM com o nome flask-vm.

  3. Na coluna Ligar, clique em SSH.

    É aberta uma janela de terminal SSH no navegador para a VM em execução.

Para mais informações, consulte o artigo Estabelecer ligação a VMs.

Crie a app Flask

Para este tutorial, vai criar uma app Python Flask para que possa ter um único ficheiro que descreva o seu servidor Web e pontos finais de teste.

  1. No terminal SSH no navegador, crie um ficheiro denominado app.py.

    nano app.py
    
  2. Adicione o seguinte ao ficheiro 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. Corrida app.py:

    python3 app.py
    

    Por predefinição, o Flask envia tráfego em localhost:5000.

  4. Abra uma segunda ligação SSH:

    1. Aceda à página Instâncias de VM.
    2. Encontre a VM com o nome flask-vm e clique em SSH.
  5. Na segunda ligação SSH, execute curl para confirmar que a saudação que configurou em app.py é devolvida.

    curl http://0.0.0.0:5000
    

    O resultado deste comando é Hello Cloud.

Abra a porta 5000 na VM

Para estabelecer ligação ao servidor Web a partir do seu computador local, a VM tem de ter a porta 5000 aberta.O Trusted Cloud permite-lhe abrir portas ao tráfego através de regras de firewall.

Adicione o seguinte recurso do Terraform google_compute_firewall no final do ficheiro 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"]
}

Execute terraform apply para criar a regra de firewall.

Adicione uma variável de saída para o URL do servidor Web

  1. No final de main.tf, adicione uma variável de saída do Terraform para emitir o URL do servidor 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. Corrida terraform apply.

    terraform apply
    

    Quando lhe for pedido, introduza yes. O Terraform imprime o endereço IP externo da VM e a porta 5000 no ecrã, da seguinte forma:

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

    Em qualquer altura, pode executar terraform output para devolver esta saída:

    terraform output
    
  3. Clique no URL do passo anterior e veja a mensagem "Olá, nuvem!".

    Isto significa que o seu servidor está em execução.

Resolução de problemas

  • Se uma API necessária não estiver ativada, o Terraform devolve um erro. A mensagem de erro inclui um link para ativar a API. Depois de ativar a API, pode executar novamente o comando terraform apply.

  • Se não conseguir estabelecer ligação à sua VM através do SSH:

    • Certifique-se de que adiciona a regra de firewall SSH.
    • Certifique-se de que a VM inclui o argumento tags = ["ssh"].

Limpar

Após concluir o tutorial, pode eliminar tudo o que criou para não incorrer em custos adicionais.

O Terraform permite-lhe remover todos os recursos definidos no ficheiro de configuração executando o comando terraform destroy:

terraform destroy

Introduza yes para permitir que o Terraform elimine os seus recursos.