Ruby で Cloud Functions の HTTP 関数を作成してデプロイする

Ruby で Cloud Functions の HTTP 関数を作成してデプロイする

このガイドでは、Ruby ランタイムを使用して Cloud Functions の関数を記述するプロセスを説明します。Cloud Functions の関数には次の 2 つのタイプがあります。

  • HTTP 関数。標準的な HTTP リクエストから呼び出します。
  • イベント ドリブン関数。Pub/Sub トピックのメッセージや Cloud Storage バケットの変更など、Cloud インフラストラクチャのイベントを処理するために使用します。

詳しくは、HTTP 関数の作成イベント ドリブン関数の作成をご覧ください。

始める前に

  1. Google Cloud アカウントにログインします。Google Cloud を初めて使用する場合は、アカウントを作成して、実際のシナリオでの Google プロダクトのパフォーマンスを評価してください。新規のお客様には、ワークロードの実行、テスト、デプロイができる無料クレジット $300 分を差し上げます。
  2. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  3. Google Cloud プロジェクトで課金が有効になっていることを確認します

  4. Cloud Functions, Cloud Build, Artifact Registry, Cloud Run, and Cloud Logging API を有効にします。

    API を有効にする

  5. Google Cloud Console の [プロジェクト セレクタ] ページで、Google Cloud プロジェクトを選択または作成します。

    プロジェクト セレクタに移動

  6. Google Cloud プロジェクトで課金が有効になっていることを確認します

  7. Cloud Functions, Cloud Build, Artifact Registry, Cloud Run, and Cloud Logging API を有効にします。

    API を有効にする

  8. Google Cloud SDK をインストールして初期化します。
  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 の関数では、これらのパッケージの 1 つは functions_framework gem である必要があります。

この演習用に、関数コードを含む app.rb ファイルと同じディレクトリに Gemfile というファイルを作成し、そのファイルに次の内容を含めます。

source "https://rubygems.org"
gem "functions_framework", "~> 0.7"

functions_framework gem とその他の依存関係は、次のコマンドを実行してインストールします。

bundle install
をご覧ください。

関数をローカルでビルドしてテストする

関数をデプロイする前に、ローカルでビルドしてテストできます。

  1. functions-framework-ruby 実行可能ファイルを使用して、hello_http 関数を実行するローカル ウェブサーバーを起動するため、次のコマンドを実行します。

    bundle exec functions-framework-ruby --target hello_http
    
  2. 関数をテストするには、ブラウザで http://localhost:8080 にアクセスするか、別のウィンドウから curl localhost:8080 を実行します。

    詳細については、ローカル関数にリクエストを送信するをご覧ください。

Ruby Functions Framework のドキュメントの関数のテストをご覧ください。

関数をデプロイする

関数をデプロイするには、helloworld ディレクトリで次のコマンドを実行します。

  gcloud functions deploy ruby-http-function \
    --gen2 \
    --runtime=ruby32 \
    --region=REGION \
    --entry-point=hello_http \
    --source=. \
    --trigger-http \
    --allow-unauthenticated

REGION は、関数をデプロイする Google Cloud リージョンの名前に置き換えます(us-west1 など)。

オプションの --allow-unauthenticated フラグを使用すると、認証なしで関数にアクセスできます。

デプロイした関数をテストする

  1. 関数がデプロイされたら、gcloud functions deploy コマンドの出力で uri プロパティをメモするか、次のコマンドを使用して取得します。

        gcloud functions describe ruby-http-function \
          --region=REGION
    

    REGION は、関数をデプロイした Google Cloud リージョンの名前に置き換えます(us-west1 など)。

  2. ブラウザで、この URL にアクセスします。関数から「Hello World!」というメッセージが返されます。

関数のログを表示する

関数のログを表示するには、Cloud Logging UI または Google Cloud CLI を使用します。

コマンドライン ツールを使用してログを表示する

gcloud CLI を使用して関数のログを表示するには、logs read コマンドを使用します。

    gcloud functions logs read \
      --gen2 \
      --limit=10 \
      --region=REGION \
      ruby-http-function

REGION は、関数をデプロイした Google Cloud リージョンの名前に置き換えます(us-west1 など)。

出力は次のようになります。

LEVEL: I
NAME: hello-http
TIME_UTC: 2023-06-01 00:09:41.477
LOG: Default STARTUP TCP probe succeeded after 1 attempt for container "hello__http-1" on port 8080.

LEVEL:
NAME: hello-http
TIME_UTC: 2023-06-01 00:09:41.451
LOG: I, [2023-06-01T00:09:41.451784 #1]  INFO -- : FunctionsFramework: Serving function "hello_http" on port 8080...

LEVEL:
NAME: hello-http
TIME_UTC: 2023-06-01 00:09:41.364
LOG: I, [2023-06-01T00:09:41.363923 #1]  INFO -- : FunctionsFramework: Starting server...

LEVEL:
NAME: hello-http
TIME_UTC: 2023-06-01 00:09:41.363
LOG: I, [2023-06-01T00:09:41.363855 #1]  INFO -- : FunctionsFramework: Looking for function name "hello_http"...

LEVEL:
NAME: hello-http
TIME_UTC: 2023-06-01 00:09:41.354
LOG: I, [2023-06-01T00:09:41.354150 #1]  INFO -- : FunctionsFramework: Loading functions from "./app.rb"...

ロギング ダッシュボードでログを表示する

ロギング ダッシュボードで関数のログを表示するには、Cloud Functions の概要ページを開き、リストから関数の名前をクリックして、ログタブをクリックします。