您的第一个函数:Go 函数

本指南将引导您完成用 Go 运行时编写 Cloud Functions 函数的过程。Cloud Functions 函数有两种类型:

  • HTTP 函数,通过标准 HTTP 请求调用。
  • 事件驱动函数,用于处理来自云基础架构的事件,例如 Cloud Pub/Sub 主题中收到消息或 Cloud Storage 存储分区发生更改。

本指南中的示例演示了如何创建简单的 HTTP 函数。

指南结构

  1. 使用 Cloud SDK 创建 GCP 项目
  2. 创建函数
  3. 指定依赖项
  4. 部署函数
  5. 测试函数

使用 Cloud SDK 创建 GCP 项目

  1. 登录您的 Google Cloud 帐号。如果您是 Google Cloud 新手,请创建一个帐号来评估我们的产品在实际场景中的表现。新客户还可获享 $300 赠金,用于运行、测试和部署工作负载。
  2. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到“项目选择器”

  3. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  4. 启用 Cloud Functions and Cloud Build API。

    启用 API

  5. 在 Google Cloud Console 的项目选择器页面上,选择或创建一个 Google Cloud 项目。

    转到“项目选择器”

  6. 确保您的 Cloud 项目已启用结算功能。 了解如何确认您的项目是否已启用结算功能

  7. 启用 Cloud Functions and Cloud Build API。

    启用 API

  8. 安装并初始化 Cloud SDK
  9. 更新并安装 gcloud 组件:
    gcloud components update
  10. 准备开发环境。

    转到 Go 设置指南

创建函数

  1. 在本地系统上为函数代码创建一个目录:

    Linux 或 Mac OS X

    mkdir ~/helloworld
    cd ~/helloworld
    

    Windows

    mkdir %HOMEPATH%\helloworld
    cd %HOMEPATH%\helloworld
    
  2. helloworld 目录中创建一个名为 hello_http.go 的文件,其中包含以下内容:

    
    // Package helloworld provides a set of Cloud Functions samples.
    package helloworld
    
    import (
    	"encoding/json"
    	"fmt"
    	"html"
    	"net/http"
    )
    
    // HelloHTTP is an HTTP Cloud Function with a request parameter.
    func HelloHTTP(w http.ResponseWriter, r *http.Request) {
    	var d struct {
    		Name string `json:"name"`
    	}
    	if err := json.NewDecoder(r.Body).Decode(&d); err != nil {
    		fmt.Fprint(w, "Hello, World!")
    		return
    	}
    	if d.Name == "" {
    		fmt.Fprint(w, "Hello, World!")
    		return
    	}
    	fmt.Fprintf(w, "Hello, %s!", html.EscapeString(d.Name))
    }
    

    此示例函数会获取 HTTP 请求中提供的姓名并返回问候语;或者,如果没有提供姓名,则返回“Hello, World!”。

指定依赖项

此示例函数仅使用 Go 标准库软件包,因此除了仅导入软件包之外,您无需声明任何依赖项。

对于需要标准库以外的依赖项的函数,您必须通过 go.mod 文件或 vendor 目录提供依赖项。如需了解详情,请参阅指定 Go 依赖项

部署函数

如需使用 HTTP 触发器部署函数,请在 helloworld 目录中运行以下命令,根据您使用的版本,指定 go113go111 作为 --runtime 标志的值:

gcloud functions deploy HelloHTTP --runtime go116 --trigger-http --allow-unauthenticated

通过 --allow-unauthenticated 标志,您可以在不进行身份验证的情况下访问函数。如需进行身份验证,请省略此标志。

测试函数

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

    gcloud functions describe HelloHTTP
    

    该属性应如下所示:

    https://GCP_REGION-PROJECT_ID.cloudfunctions.net/HelloHTTP
  2. 在浏览器中访问此网址,或者通过运行以下命令使用 cURL:

    curl https://GCP_REGION-PROJECT_ID.cloudfunctions.net/HelloHTTP

    您应该会看到一条“Hello, World!”消息。请运行以下命令,尝试通过 HTTP 请求传递姓名:

    curl -X POST https://GCP_REGION-PROJECT_ID.cloudfunctions.net/HelloHTTP -H "Content-Type:application/json"  -d '{"name":"NAME"}'

    您应该会看到一条“Hello, NAME!”消息。

查看日志

使用命令行工具

您可以在 Cloud Logging 界面中或通过 gcloud 命令行工具查看 Cloud Functions 函数的日志。

如需使用 gcloud 工具查看函数的日志,请使用 logs read 命令,后跟函数名称:

gcloud functions logs read HelloHTTP

输出应类似于以下内容:

LEVEL  NAME        EXECUTION_ID  TIME_UTC                 LOG
D      HelloHTTP  buv9ej2k1a7r  2019-09-20 13:23:18.910  Function execution started
D      HelloHTTP  buv9ej2k1a7r  2019-09-20 13:23:18.913  Function execution took 4 ms, finished with status code: 200

使用 Logging 信息中心

您还可以通过 Cloud Console 查看 Cloud Functions 函数的日志。