使用 Ruby(第 1 代)创建和部署 HTTP Cloud Run 函数

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

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

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

准备工作

  1. Sign in to your Google Cloud account. If you're new to Google Cloud, create an account to evaluate how our products perform in real-world scenarios. New customers also get $300 in free credits to run, test, and deploy workloads.
  2. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  3. Make sure that billing is enabled for your Google Cloud project.

  4. Enable the Cloud Functions and Cloud Build APIs.

    Enable the APIs

  5. In the Google Cloud console, on the project selector page, select or create a Google Cloud project.

    Go to project selector

  6. Make sure that billing is enabled for your Google Cloud project.

  7. Enable the Cloud Functions and Cloud Build APIs.

    Enable the APIs

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

    转到 Ruby 设置指南

创建一个函数

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

    Linux 或 Mac OS X

    mkdir ~/helloworld
    cd ~/helloworld
    

    Windows

    mkdir %HOMEPATH%\helloworld
    cd %HOMEPATH%\helloworld
    
  2. helloworld 目录中创建一个 app.rb 文件,其中包含以下内容:

    require "functions_framework"
    require "cgi"
    require "json"
    
    FunctionsFramework.http "hello_http" do |request|
      # The request parameter is a Rack::Request object.
      # See https://www.rubydoc.info/gems/rack/Rack/Request
      name = request.params["name"] ||
             (request.body.rewind && JSON.parse(request.body.read)["name"] rescue nil) ||
             "World"
      # Return the response body as a string.
      # You can also return a Rack::Response object, a Rack response array, or
      # a hash which will be JSON-encoded into a response.
      "Hello #{CGI.escape_html name}!"
    end

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

指定依赖项

Ruby 依赖项可通过 bundler 进行管理,并在名为 Gemfile 的文件中表示。

部署您的函数时,Cloud Functions 会使用 bundler 下载并安装 GemfileGemfile.lock 中声明的依赖项。

Gemfile 会列出函数所需的软件包以及所有可选版本限制条件。对于 Cloud Functions 函数,其中一个软件包必须是 functions_framework gem。

在此练习中,在包含函数代码的 app.rb 文件所在的目录中创建名为 Gemfile 的文件,其中包含以下内容:

source "https://rubygems.org"

gem "functions_framework", "~> 0.7"

运行以下命令安装 functions_framework gem 和其他依赖项:

bundle install

在本地构建和测试

在部署函数之前,您可以在本地构建和测试该函数。运行以下命令以使用 functions-framework-ruby 可执行文件启动运行 hello_http 函数的本地 Web 服务器:

bundle exec functions-framework-ruby --target hello_http
# ...starts the web server in the foreground

如果函数成功构建,它会显示一个网址,您可以在网络浏览器中访问该网址,以查看实际应用中的函数:http://localhost:8080/。您应该会看到 Hello World! 消息。

或者,您也可以从另一个终端窗口使用 curl 向此函数发送请求:

curl localhost:8080
# Output: Hello World!

请参阅 Ruby Functions 框架文档中的测试函数

部署该函数

如需使用 HTTP 触发器部署该函数,请在 helloworld 目录中运行以下命令:

gcloud functions deploy hello_http --no-gen2 --runtime ruby32 --trigger-http --allow-unauthenticated

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

测试已部署的函数

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

    gcloud functions describe hello_http
    

    该属性应如下所示:

    https://GCP_REGION-PROJECT_ID.cloudfunctions.net/hello_http
  2. 在浏览器中访问此网址。您应该会看到一条“Hello World!”消息。

    尝试通过 HTTP 请求传递姓名,例如使用以下网址:

    https://GCP_REGION-PROJECT_ID.cloudfunctions.net/hello_http?name=NAME

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

查看日志

您可以在 Cloud Logging 界面中或通过 Google Cloud CLI 查看 Cloud Run 函数日志。

使用命令行工具查看日志

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

gcloud functions logs read hello_http

输出应类似于以下内容:

LEVEL  NAME       EXECUTION_ID  TIME_UTC                 LOG
D      helloHttp  rvb9j0axfclb  2019-09-18 22:06:25.983  Function execution started
D      helloHttp  rvb9j0axfclb  2019-09-18 22:06:26.001  Function execution took 19 ms, finished with status code: 200

在 Logging 信息中心内查看日志

您还可以通过 Google Cloud 控制台查看 Cloud Functions 函数的日志。