Terraform 教程

本教程演示了如何通过将函数源代码 zip 文件上传到 Cloud Storage 存储桶来部署 HTTP 函数(使用 Terraform 预配资源)。Terraform 是一种开源工具,可让您通过声明式配置文件预配 Google Cloud 资源。

本教程以 Node.js HTTP 函数为例,但也适用于 Python、Go 和 Java HTTP 函数。 无论您使用哪种运行时,说明都是相同的。

使用 Terraform 进行部署时,您必须将函数的压缩源代码文件上传到 Cloud Storage 存储桶 (source_archive_bucket),并在 Terraform 配置中指定 Cloud Storage 对象名称 (source_archive_object)。如需了解详情,请参阅 Terraform 规范指南

Cloud Run functions 会将您在 source_archive_bucket 中上传的源文件复制到项目中的一个存储桶,该存储桶的名称遵循 gcf-v2-sources-PROJECT_NUMBER-REGION(Cloud Run functions)gcf-sources-PROJECT_NUMBER-REGION Cloud Run functions(第 1 代)格式。此配置因 CMEK 依赖项而异。

设置环境

在本教程中,您将在 Cloud Shell 中运行命令。Cloud Shell 是一个已安装 Google Cloud CLI 的 shell 环境,其中包括 Google Cloud CLI 以及已为当前项目设置的值。Cloud Shell 可能需要几分钟才能完成初始化:

打开 Cloud Shell

准备应用

在 Cloud Shell 中,执行以下步骤:

  1. 将示例应用代码库克隆到 Cloud Shell 实例:

    git clone https://github.com/terraform-google-modules/terraform-docs-samples.git
  2. 切换到包含 Cloud Run functions 示例代码的目录:

    cd terraform-docs-samples/functions/basic

    本教程中使用的 Node.JS 示例是一个基本的“Hello World”HTTP 函数。以下是 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     = "nodejs22"
        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
    }

初始化 Terraform

在包含 main.tf 文件的 terraform-docs-samples/functions/basic 目录中,运行以下命令以添加必要的插件并构建 .terraform 目录:

terraform init

应用 Terraform 配置

在包含 main.tf 文件的同一 terraform-docs-samples/functions/basic 目录中,通过应用配置来部署函数。出现提示时,输入 yes

terraform apply

测试函数

  1. 当函数完成部署时,请记下 URI 特性,或使用以下命令查找该特性:

    gcloud functions describe function-v2 --gen2 --region=us-central1 --format="value(serviceConfig.uri)"
    
  2. 向此网址发出请求,以查看函数的“Hello World”消息。请注意,部署的函数需要身份验证。因此,您必须在请求中提供凭据:

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

清理

完成本教程后,您可以删除自己创建的所有内容,以免产生任何额外费用。

凭借 Terraform,您可以通过在包含 main.tf 文件的 terraform-docs-samples/functions/basic 目录中运行 terraform destroy 命令来移除配置文件中定义的所有资源:

terraform destroy

输入 yes 以允许 Terraform 删除您的资源。