PHP で Cloud Run の HTTP 関数を作成してデプロイする(第 1 世代)

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

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

次のサンプルでは、簡単な 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. 開発環境を準備します。

    PHP スタートガイド

関数を作成する

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

    Linux / Mac OS X

    mkdir ~/helloworld_http
    cd ~/helloworld_http
    

    Windows

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

    <?php
    
    use Google\CloudFunctions\FunctionsFramework;
    use Psr\Http\Message\ServerRequestInterface;
    
    // Register the function with Functions Framework.
    // This enables omitting the `FUNCTIONS_SIGNATURE_TYPE=http` environment
    // variable when deploying. The `FUNCTION_TARGET` environment variable should
    // match the first parameter.
    FunctionsFramework::http('helloHttp', 'helloHttp');
    
    function helloHttp(ServerRequestInterface $request): string
    {
        $name = 'World';
        $body = $request->getBody()->getContents();
        if (!empty($body)) {
            $json = json_decode($body, true);
            if (json_last_error() != JSON_ERROR_NONE) {
                throw new RuntimeException(sprintf(
                    'Could not parse body: %s',
                    json_last_error_msg()
                ));
            }
            $name = $json['name'] ?? $name;
        }
        $queryString = $request->getQueryParams();
        $name = $queryString['name'] ?? $name;
    
        return sprintf('Hello, %s!', htmlspecialchars($name));
    }
    

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

依存関係を指定する

PHP の依存関係を管理するには、Composer を使用します。Composer をまだインストールしていない場合は、次の手順でインストールします。

  1. 任意の場所に Composer をダウンロードします。

  2. ダウンロード完了後、composer.phar ファイルをシステムパス内のディレクトリに移動します。次に例を示します。

    mv composer.phar /usr/local/bin/composer
    

次に、関数の依存関係を指定します。

  1. 依存関係を含む composer.json ファイルを関数コードのディレクトリに追加します。ここで、FUNCTION_TARGET=FUNCTION_NAME は関数の名前を示します。この例では、FUNCTION_NAMEhelloHttp です。

    {
        "require": {
            "php": ">= 8.1",
            "google/cloud-functions-framework": "^1.1"
        },
        "scripts": {
            "start": [
               "Composer\\Config::disableProcessTimeout",
               "FUNCTION_TARGET=helloHttp php -S localhost:${PORT:-8080} vendor/google/cloud-functions-framework/router.php"
            ]
        }
    }
    
  2. 関数コードを含むディレクトリ(先ほど作成した composer.json ファイルも含める必要があります)で、次のコマンドを実行します。

    composer require google/cloud-functions-framework
    

    これにより、Functions Framework が composer.json に追加されます。また、依存関係を含む関数コードのディレクトリに vendor/ ディレクトリが作成されます。

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

依存関係を指定するの手順を完了したら、関数をローカルでビルドしてテストできます。

次のコマンドは、helloHttp 関数を実行するローカル ウェブサーバーを作成します。

export FUNCTION_TARGET=helloHttp
php -S localhost:8080 vendor/bin/router.php

関数が正常にビルドされると、URL が表示されます。この URL(http://localhost:8080/)にはウェブブラウザでアクセスできます。Hello World! というメッセージが表示されます。

別のターミナル ウィンドウから curl を使用して、この関数にリクエストを送信することもできます。

curl localhost:8080
# Output: Hello World!

関数をデプロイする

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

gcloud functions deploy helloHttp --no-gen2 --runtime php83 --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 Run functions のログは、Google Cloud CLI を使用して、また Cloud Logging UI で表示できます。

コマンドライン ツールを使用する

gcloud CLI を使用して関数のログを表示するには、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

Logging ダッシュボードを使用する

Google Cloud コンソールから Cloud Run functions のログを表示することもできます。