初めての関数: Node.js

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

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

次のサンプルでは、簡単な HTTP 関数を作成しています。

ガイドの構成

  1. Cloud SDK を使用した GCP プロジェクトの作成
  2. 関数の作成
  3. 依存関係の指定
  4. 関数のデプロイ
  5. 関数のテスト

Cloud SDK を使用した GCP プロジェクトの作成

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

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

  3. Cloud プロジェクトに対して課金が有効になっていることを確認します。プロジェクトに対して課金が有効になっていることを確認する方法を学習する

  4. Cloud Functions and Cloud Build API を有効にします。

    API を有効にする

  5. Cloud SDK をインストールし、初期化します
  6. gcloud コンポーネントを更新してインストールします。
    gcloud components update
  7. 開発環境を準備します。

    Node.js 設定ガイドに移動

関数の作成

  1. 関数コードで使用するため、ローカル システムにディレクトリを作成します。

    Linux / Mac OS X

    mkdir ~/helloworld
    cd ~/helloworld
    

    Windows

    mkdir %HOMEPATH%\helloworld
    cd %HOMEPATH%\helloworld
    
  2. helloworld ディレクトリに、次の内容の index.js ファイルを作成します。

    const escapeHtml = require('escape-html');
    
    /**
     * HTTP Cloud Function.
     *
     * @param {Object} req Cloud Function request context.
     *                     More info: https://expressjs.com/en/api.html#req
     * @param {Object} res Cloud Function response context.
     *                     More info: https://expressjs.com/en/api.html#res
     */
    exports.helloHttp = (req, res) => {
      res.send(`Hello ${escapeHtml(req.query.name || req.body.name || 'World')}!`);
    };

    このサンプル関数は HTTP リクエストで指定された名前を使用します。名前が指定されていない場合は、「Hello World!」という挨拶を返します。

依存関係の指定

Node.js における依存関係は、npm で管理され、package.json というメタデータ ファイルで表現されます。

  1. 手動または次のコマンドで helloworld ディレクトリに package.json ファイルを作成します。

    npm init
    
  2. 関数の依存関係を追加します。escape-html パッケージの場合は、手動または次のコマンドで package.json ファイルに追加します。

    npm install escape-html
    

    package.json ファイルには、次のようなセクションが含まれています。

    {
      ...
      "dependencies": {
        "escape-html": "^1.0.3"
      }
      ...
    }
    

    package.json ファイルを手動で作成する場合は、次の内容をコピーして使用できます。

    {
      "name": "nodejs-docs-samples-functions-hello-world",
      "version": "0.0.1",
      "private": true,
      "license": "Apache-2.0",
      "author": "Google Inc.",
      "repository": {
        "type": "git",
        "url": "https://github.com/GoogleCloudPlatform/nodejs-docs-samples.git"
      },
      "engines": {
        "node": ">=12.0.0"
      },
      "scripts": {
        "unit-test": "mocha test/index.test.js test/*unit*test.js test/*integration*test.js --timeout=2000 --exit",
        "system-test": "mocha test/*system*test.js --timeout=600000 --exit",
        "all-test": "npm run unit-test && npm run system-test",
        "test": "npm -- run all-test"
      },
      "dependencies": {
        "@google-cloud/debug-agent": "^5.0.0",
        "escape-html": "^1.0.3"
      },
      "devDependencies": {
        "@google-cloud/functions-framework": "^1.1.1",
        "@google-cloud/pubsub": "^2.0.0",
        "@google-cloud/storage": "^5.0.0",
        "child-process-promise": "^2.2.1",
        "express": "^4.16.3",
        "mocha": "^8.0.0",
        "moment": "^2.24.0",
        "promise-retry": "^2.0.0",
        "proxyquire": "^2.1.0",
        "request": "^2.88.0",
        "requestretry": "^5.0.0",
        "sinon": "^10.0.0",
        "supertest": "^6.0.0",
        "uuid": "^8.0.0"
      }
    }
    

関数のデプロイ

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

gcloud functions deploy helloHttp --runtime nodejs12 --trigger-http --allow-unauthenticated

--allow-unauthenticated フラグを使用すると、認証なしで関数にアクセスできます。認証を要求するには、フラグを省略します。

関数のテスト

  1. 関数がデプロイされたら、httpsTrigger.url プロパティをメモするか、次のコマンドを使用して検索します。

    gcloud functions describe helloHttp
    

    次のようになります。

    https://GCP_REGION-PROJECT_ID.cloudfunctions.net/helloHttp
  2. ブラウザで、この URL にアクセスします。「Hello World!」というメッセージが表示されます。

    たとえば、次の URL を使用して HTTP リクエストで名前を渡します。

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

    「Hello NAME!」というメッセージが表示されます。

ログの表示

コマンドライン ツールの使用

Cloud Functions のログは、Cloud Logging UI または gcloud コマンドライン ツールで表示できます。

gcloud ツールを使用して関数のログを表示するには、logs read コマンドの後に関数の名前を続けます。

gcloud functions logs read helloHttp

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

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

ロギング ダッシュボードを使う

Cloud Console から Cloud Functions のログを表示することもできます。