Tutorial do Terraform (2a geração)


Neste tutorial, você verá como implantar uma função HTTP fazendo upload de um arquivo ZIP do código-fonte da função em um bucket do Cloud Storage usando o Terraform para provisionar os recursos. O Terraform é uma ferramenta de código aberto que permite provisionar recursos do Google Cloud com arquivos de configuração declarativos

Neste tutorial, usamos uma função HTTP Node.js como exemplo, mas ela também funciona com funções HTTP Python, Go e Java. As instruções são as mesmas, independentemente do ambiente de execução que você está usando.

Objetivos

  • Saiba como usar o Terraform para implantar uma função HTTP.

Custos

Neste documento, você usará os seguintes componentes faturáveis do Google Cloud:

Veja detalhes em Preços do Cloud Functions.

Para gerar uma estimativa de custo baseada na projeção de uso deste tutorial, use a calculadora de preços. Novos usuários do Google Cloud podem estar qualificados para uma avaliação gratuita.

Antes de começar

  1. Faça login na sua conta do Google Cloud. Se você começou a usar o Google Cloud agora, crie uma conta para avaliar o desempenho de nossos produtos em situações reais. Clientes novos também recebem US$ 300 em créditos para executar, testar e implantar cargas de trabalho.
  2. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  3. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  4. Ative as APIs Cloud Functions, Cloud Run, Cloud Build, Artifact Registry, and Cloud Storage.

    Ative as APIs

  5. Instale a CLI do Google Cloud.
  6. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  7. No console do Google Cloud, na página do seletor de projetos, selecione ou crie um projeto do Google Cloud.

    Acessar o seletor de projetos

  8. Verifique se a cobrança está ativada para o seu projeto do Google Cloud.

  9. Ative as APIs Cloud Functions, Cloud Run, Cloud Build, Artifact Registry, and Cloud Storage.

    Ative as APIs

  10. Instale a CLI do Google Cloud.
  11. Para inicializar a CLI gcloud, execute o seguinte comando:

    gcloud init
  12. Se a gcloud CLI já estiver instalada, atualize-a executando o seguinte comando:

    gcloud components update
  13. Prepare seu ambiente de desenvolvimento.

    Acessar o guia de configuração do Node.js

Como configurar o ambiente

Neste tutorial, você executa comandos no Cloud Shell. O Cloud Shell é um ambiente com a Google Cloud CLI pré-instalada, incluindo a Google Cloud CLI e os valores já definidos para o projeto atual. O Cloud Shell pode demorar vários minutos para ser inicializado.

Abra o Cloud Shell

Como preparar o aplicativo

No Cloud Shell, execute as seguintes etapas:

  1. Clone o repositório de aplicativos de amostra para sua instância do Cloud Shell:

    git clone https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git
  2. Altere para o diretório que contém o código de amostra do Cloud Functions:

    cd nodejs-docs-samples/functions/helloworld/helloworldHttp

    A amostra Node.js usada neste tutorial é uma função HTTP básica "Hello World".

  3. Crie um arquivo ZIP com o código-fonte da função que o Terraform enviará para um bucket do Cloud Storage:

    zip -r function-source.zip .
    

    A raiz do arquivo ZIP precisa ser o diretório raiz do código-fonte da função. Portanto, o comando acima inclui os arquivos no diretório helloworldHttp, mas não inclui o próprio diretório.

Crie seu arquivo main.tf.

  1. No diretório nodejs-docs-samples/functions/, crie um arquivo main.tf para a configuração do Terraform:

    touch main.tf
    
  2. Copie esta configuração do Terraform para seu arquivo main.tf:

    terraform {
      required_providers {
        google = {
          source  = "hashicorp/google"
          version = ">= 4.34.0"
        }
      }
    }
    
    resource "random_id" "default" {
      byte_length = 8
    }
    
    resource "google_storage_bucket" "default" {
      name                        = "${random_id.default.hex}-gcf-source" # Every bucket name must be globally unique
      location                    = "US"
      uniform_bucket_level_access = true
    }
    
    data "archive_file" "default" {
      type        = "zip"
      output_path = "/tmp/function-source.zip"
      source_dir  = "functions/hello-world/"
    }
    resource "google_storage_bucket_object" "object" {
      name   = "function-source.zip"
      bucket = google_storage_bucket.default.name
      source = data.archive_file.default.output_path # Add path to the zipped function source code
    }
    
    resource "google_cloudfunctions2_function" "default" {
      name        = "function-v2"
      location    = "us-central1"
      description = "a new function"
    
      build_config {
        runtime     = "nodejs16"
        entry_point = "helloHttp" # Set the entry point
        source {
          storage_source {
            bucket = google_storage_bucket.default.name
            object = google_storage_bucket_object.object.name
          }
        }
      }
    
      service_config {
        max_instance_count = 1
        available_memory   = "256M"
        timeout_seconds    = 60
      }
    }
    
    resource "google_cloud_run_service_iam_member" "member" {
      location = google_cloudfunctions2_function.default.location
      service  = google_cloudfunctions2_function.default.name
      role     = "roles/run.invoker"
      member   = "allUsers"
    }
    
    output "function_uri" {
      value = google_cloudfunctions2_function.default.service_config[0].uri
    }
  3. Edite o arquivo main.tf para garantir que ele tenha os valores corretos dos itens a seguir. Você precisa editar esse arquivo sempre que a configuração mudar (por exemplo, para usar um ambiente de execução diferente ou implantar uma função diferente):

    • Ambiente de execução: neste exemplo, o ambiente de execução é nodejs16.
    • Ponto de entrada da função: neste exemplo, o ponto de entrada da função é helloHttp.
    • Caminho para o arquivo ZIP: neste exemplo, se você colocou o arquivo main.tf no diretório nodejs-docs-samples/functions/, conforme descrito acima, o caminho é ./helloworld/helloworldHttp/function-source.zip.

Inicialize o Terraform

No diretório nodejs-docs-samples/functions/ que contém o arquivo main.tf, execute este comando para adicionar os plug-ins necessários e criar o diretório .terraform:

terraform init

Aplique a configuração do Terraform:

No diretório nodejs-docs-samples/functions/ que contém o arquivo main.tf, implante a função aplicando a configuração. Quando solicitado, digite yes.

terraform apply

Testar a função

  1. Quando a implantação da função estiver concluída, anote a propriedade ou encontre-a usando o seguinte comando:

    gcloud functions describe function-v2 --gen2 --region=us-central1 --format="value(serviceConfig.uri)"
    
  2. Faça uma solicitação a este URL para ver a mensagem "Hello World" da sua função. Observe que a função é implantada exigindo autenticação. Portanto, é necessário fornecer as credenciais na sua solicitação:

    curl -H "Authorization: Bearer $(gcloud auth print-identity-token)" YOUR_FUNCTION_URL
    

Limpar

Depois de concluir o tutorial, exclua tudo o que foi criado para que você não tenha custos adicionais.

O Terraform permite remover todos os recursos definidos no arquivo de configuração executando o comando terraform destroy no diretório nodejs-docs-samples/functions/ que contém o arquivo main.tf:

terraform destroy

Digite yes para permitir que o Terraform exclua seus recursos.