Webhook

Webhook は、ビジネス ロジックのホストや、他のサービスの呼び出しを行うサービスです。Webhook では、セッション中に会話エージェント(Dialogflow CX)の自然言語処理で抽出されたデータを使用することで、動的レスポンスの生成、収集したデータの検証、バックエンドでのアクションのトリガーが可能になります。

Webhook は、標準 Webhook またはフレキシブル Webhook のいずれかになります。標準 Webhook では、リクエスト フィールドとレスポンス フィールドは会話エージェント(Dialogflow CX)によって定義されます。フレキシブル Webhook では、リクエスト フィールドとレスポンス フィールドを自分で定義します。

標準 Webhook

標準 Webhook では、会話エージェント(Dialogflow CX)で定義されたリクエスト メッセージとレスポンス メッセージを使用します。リクエスト メッセージには、セッションに関する多くの詳細情報が含まれています。たとえば、現在のアクティブなページ、最近一致したインテント、セッション パラメータ値、エージェント定義のレスポンスがすべて含まれています。

標準 Webhook リクエスト

Webhook でのフルフィルメントが呼び出されると、会話エージェント(Dialogflow CX)は Webhook サービスに HTTPS POST Webhook リクエストを送信します。このリクエストの本文は、セッションに関する情報を含む WebhookRequest JSON オブジェクトです。

一部の統合では、WebhookRequest.payload フィールドに追加情報が入力されます。たとえば、Dialogflow CX Phone Gateway の統合では、エンドユーザーの呼び出し元 ID を提供します。

詳しくは、WebhookRequest(V3)または WebhookRequest(V3Beta1)のリファレンス ドキュメントをご覧ください。

標準 Webhook レスポンス

Webhook サービスは Webhook リクエストを受け取ると、Webhook レスポンスを送信する必要があります。回答には次の制限が適用されます。

  • レスポンスは、Webhook リソースを作成するときに構成したタイムアウト内で実行する必要があります。この制限時間を超えると、リクエストがタイムアウトになります。
  • レスポンスのサイズは 64 KiB 以下でなければなりません。

詳しくは、WebhookResponse(V3)または WebhookResponse(V3Beta1)のリファレンス ドキュメントをご覧ください。

標準 Webhook リソース設定

標準 Webhook の Webhook リソース設定は次のとおりです。

用語 定義
表示名 Webhook のコンソールに表示される名前。
Webhook タイムアウト 会話エージェント(Dialogflow CX)が Webhook サービスに Webhook リクエストを送信する際、レスポンスの待機中にタイムアウトが発生することがあります。この設定では、タイムアウトを秒単位で制御します。タイムアウトが発生すると、会話エージェント(Dialogflow CX)は webhook.error.timeout イベントを呼び出します。
タイプ プライベート ネットワーク アクセスに Service Directory を使用する場合は「Service Directory」、それ以外の場合は「Generic Web Service」に設定します。
webhook URL Webhook サービスの URL アドレスを指定します。
サブタイプ Standard に設定します。
環境特有の Webhook 環境特有の Webhook を指定できます。
認証 認証セクションをご覧ください。
カスタム CA 証明書 これはカスタム CA 証明書をアップロードするために使用されます。

フレキシブル Webhook

フレキシブル Webhook では、リクエスト HTTP メソッド、リクエスト URL パラメータ、リクエスト メッセージとレスポンス メッセージのフィールドを自分で定義します。リクエストは、選択したパラメータ値のみを指定し、レスポンスはパラメータのオーバーライド値のみを指定できます。エージェントと Webhook 間のインターフェースを簡素化するため、この制限は実際に有益です。エージェントと Webhook 間でセッション パラメータ値以外の情報をやり取りする必要はほとんどありません。また、リクエスト メッセージとレスポンス メッセージには必要なものだけが含まれ、さまざまなシナリオに一意の Webhook メッセージを指定できるため、Webhook の実装も簡素化されます。

フレキシブル Webhook リクエスト

エージェントの Webhook リソースを作成する際に、Webhook リクエストに対し、以下を指定できます。

  • Webhook サービスに送信される Webhook リクエストに使用される HTTP メソッド。
  • 会話エージェント(Dialogflow CX)が URL を使用して Webhook サービスに送信するセッション パラメータ値。
  • 方式として POSTPUTPATCH のいずれかを選択した場合、リクエストの JSON 本文を通じて会話エージェント(Dialogflow CX)が Webhook サービスに送信するセッション パラメータ値を指定できます。

リクエスト URL または JSON 本文を使用してセッション パラメータ値を送信するには、通常どおりパラメータ参照を使用します。パラメータ参照を URL エスケープする必要はありません。また、参照を引用符で囲む必要はありません。実行時に、会話エージェント(Dialogflow CX)は必要に応じてパラメータ値を URL エンコードします。リストまたは複合値は JSON として指定されます。

JSON 本文でパラメータ参照を使用する場合は、パラメータのタイプに関係なく、参照を引用符で囲む必要があります。パラメータが実際に数値スカラー、リスト、複合値である場合、会話エージェント(Dialogflow CX)は、実行時にリクエストを送信するときに引用符を削除して、パラメータのデータ型を保持します。文字列スカラー型は、引用符で囲まれたままになります。数値スカラー、数値、または複合値が文字列値内で参照されている場合(例: "This is a number: $session.params.size")、パラメータは文字列として扱われます("This is a number: 3")。

たとえば、次のようにして、fruitsize のセッション パラメータ値をリクエスト URL に指定できます。

https://your-webhook-service.com/handler?f=$session.params.fruit&s=$session.params.size

また、次のようにして、リクエスト JSON 本文に指定できます。

{
  "fruitParameter": "$session.params.fruit",
  "sizeParameter": "$session.params.size"
}

フレキシブル Webhook レスポンス

エージェントの Webhook リソースを作成する際に、会話エージェント(Dialogflow CX)が実行時に Webhook レスポンスの特定のフィールドに設定する必要があるセッション パラメータを指定できます。

回答には次の制限が適用されます。

  • レスポンスは、Webhook リソースを作成するときに構成したタイムアウト内で実行する必要があります。この制限時間を超えると、リクエストがタイムアウトになります。
  • レスポンスのサイズは 64 KiB 以下でなければなりません。

スカラー、リスト、複合フィールドを指定するには、次の形式を使用します。

$.fully.qualified.path.to.field

たとえば、次の JSON レスポンスについて考えてみましょう。

{
  "routes" : [
    {
      "legs" : [
        {
          "distance" : {
            "text" : "2,064 mi",
            "value" : 3321004
          }
        }
      ]
    }
  ]
}

「value」フィールドを指定するには、次のコマンドを使用します。

$.routes[0].legs[0].distance.value

フレキシブル Webhook リソース設定

フレキシブル Webhook の Webhook リソース設定は次のとおりです。

用語 定義
表示名 Webhook のコンソールに表示される名前。
Webhook タイムアウト 会話エージェント(Dialogflow CX)が Webhook サービスに Webhook リクエストを送信する際、レスポンスの待機中にタイムアウトが発生することがあります。この設定では、タイムアウトを秒単位で制御します。タイムアウトが発生すると、会話エージェント(Dialogflow CX)は webhook.error.timeout イベントを呼び出します。
タイプ プライベート ネットワーク アクセスに Service Directory を使用する場合は「Service Directory」、それ以外の場合は「Generic Web Service」に設定します。
webhook URL Webhook サービスの URL アドレスを指定します。これには、セッション パラメータへの参照を配置することができます。
サブタイプ フレキシブルに設定します。
メソッド Webhook リクエストの HTTP メソッドを設定します。
リクエストの本文 前述のように、リクエストの JSON 本文を指定します。
レスポンスの構成 前述のように、レスポンス フィールドに設定する必要があるセッション パラメータを指定します。
環境特有の Webhook 環境特有の Webhook を指定できます。
認証 認証セクションをご覧ください。
カスタム CA 証明書 これはカスタム CA 証明書をアップロードするために使用されます。

事前定義されたカスタム テンプレートを使用する

Dialogflow には、柔軟な Webhook を Salesforce CRM と統合するために使用できる、事前定義されたカスタム テンプレートが用意されています。

  1. [管理] タブで [Webhooks]、[+ 作成] の順にクリックします。

  2. [サブタイプ] で [フレキシブル] を選択します。

  3. [事前定義されたテンプレートを使用して構成] をクリックして、この機能を有効にします。

  4. [統合タイプ] プルダウン メニューで、[Salesforce] を選択します。

  5. [API 名] プルダウン メニューで API 名を選択します。選択した API 名に基づいて、テンプレートによって Webhook フォームが自動的に入力されます。

    1. 必要に応じて、パラメータに基づいて次のフィールドを手動で構成できます。

      • webhook URL
      • メソッド
      • リクエスト本文の JSON
      • レスポンスの構成
    2. 必要な OAuth フィールドは、[認証] セクションでハイライト表示されます。

  6. [保存] をクリックして Webhook を作成します。

Webhook サービスの要件

webhook サービスは、次の要件を満たす必要があります。

認証

会話エージェント(Dialogflow CX)エージェントまたはその所有者のみがリクエスト作成認証を持つように、Webhook サービスを保護することが重要です。これは、Webhook リソースを作成または編集するときに構成します。会話エージェント(Dialogflow CX)は、次の認証メカニズムをサポートしています。

用語 定義
認証ヘッダー Webhook の設定では、オプションの HTTP ヘッダーの Key-Value ペアを指定できます。指定した場合、会話エージェント(Dialogflow CX)によって Webhook リクエストに HTTP ヘッダーが追加されます。通常は、authorization のキーを持つ単一のペアを指定します。 ヘッダー値は、静的レスポンス メッセージの場合と同様に、セッション パラメータ参照システム関数の解析をサポートしています。authorization ヘッダーに静的認証情報を使用する場合は、Secret Manager を使用して認証情報を指定することをおすすめします。
ユーザー名とパスワードによる基本認証 Webhook の設定では、必要に応じてログイン ユーザー名とパスワードの値を指定できます。指定された場合、会話エージェント(Dialogflow CX)は webhook リクエストに認証 HTTP ヘッダーを追加します。このヘッダーの形式は "authorization: Basic <base 64 encoding of the string username:password>" です。Secret Manager を使用してユーザー名とパスワードを指定することをおすすめします。
サードパーティの OAuth 会話エージェント(Dialogflow CX)が OAuth システムからのアクセス トークンを交換して認証 HTTP ヘッダーに追加するように、サードパーティの OAuth 構成を指定できます。クライアント認証情報フローのみがサポートされています。Secret Manager を使用してクライアント シークレットを指定することをおすすめします。
サービス エージェントのアクセス トークン サポート終了
サービス アカウント 認証にはサービス アカウントを使用できます。これを使用して、他の Google Cloud APIs にアクセスできます。
サービス エージェントの ID トークン サービス エージェント認証で ID トークンを選択して、認証にサービス エージェントの ID トークンを使用できます。これを使用して、Cloud Run リソースにアクセスできます。
相互 TLS 認証 相互 TLS 認証のドキュメントをご覧ください。

サードパーティの OAuth

会話エージェント(Dialogflow CX)は、サードパーティの OAuth プロバイダからアクセス トークンを収集し、Webhook リクエストを行うときに認証 HTTP ヘッダーに追加できます。

サードパーティ OAuth のリソース設定は次のとおりです。

用語 定義
クライアント ID OAuth トークンをリクエストする際に使用するクライアント ID。
クライアント シークレット OAuth トークンのリクエストに使用するシークレット。Secret Manager を使用してクライアント シークレットを指定することをおすすめします。
OAuth エンドポイント URL OAuth トークンをリクエストするために使用する URL。
OAuth スコープ OAuth トークンを使用できるスコープのカンマ区切りのリスト。

トークンを受け取るために OAuth エンドポイント URL に送信されるリクエストには、Webhook リクエスト用に構成されたカスタム リクエスト ヘッダーが含まれません。カスタム情報を OAuth エンドポイント URL のクエリ文字列内のパラメータとして OAuth サーバーに渡すことができます。

サービス エージェントの ID トークン

会話エージェント(Dialogflow CX)は、会話エージェント(Dialogflow CX)サービス エージェントを使用してID トークンを生成できます。

トークンは、会話エージェント(Dialogflow CX)が Webhook を呼び出すときに認可 HTTP ヘッダーに追加されます。

呼び出し元のロールの権限を付与すると、ID トークンを使用して Cloud Run リソースにアクセスできます。

service-agent-project-number@gcp-sa-dialogflow.iam.gserviceaccount.com
Cloud Run リソースが同じリソース プロジェクト内にある場合、これらを呼び出すための追加の IAM 権限は必要ありません。

ID トークンの生成に使用されるオーディエンスは、クエリ パラメータ以外の Webhook URL 全体です。Cloud Run を使用している場合は、この URL が Cloud Run オーディエンスでサポートされていることを確認してください。たとえば、Webhook URL が

https://myproject.cloudfunctions.net/my-function/method1?query=value

の場合、次の URL をカスタム オーディエンスに含める必要があります。

https://myproject.cloudfunctions.net/my-function/method1

Webhook はまた、Google クライアント ライブラリまたは github.com/googleapis/google-auth-library-nodejs などのオープンソース ライブラリを使用して、必要に応じてトークンを検証できます。

サービス アカウント

サービス アカウントを使用すると、Webhook をサポートするすべての Google API に対する Webhook リクエストを認証できます。

まだサービス アカウントがない場合は、サービス アカウントを作成します。

サービス アカウントはプリンシパルであるため、他のプリンシパルと同様に、ロールを付与することでプロジェクト内のリソースにアクセスできます。サービス アカウントのメールアドレスは、Webhook リクエストの Authorization ヘッダーで送信されるアクセス トークンの生成に使用されます。

サービス アカウントを使用するように Webhook を構成するユーザーには、次の権限が必要です。

  • roles/iam.serviceAccountUser

会話エージェント(Dialogflow CX)がトークンを生成するには、Dialogflow サービス エージェントに次の権限が必要です。

  • roles/iam.serviceAccountTokenCreator

また、サービス アカウントには、Webhook をホストしているサービスにアクセスする権限も必要です。

Secret Manager 認証

認証ヘッダー、ユーザー名とパスワードを使用した基本認証、サードパーティの OAuth を使用する場合は、Secret Manager を使用して認証情報をシークレットとして保存できます。シークレットを使用して Webhook を認証する手順は次のとおりです。

  1. シークレットがまだない場合は、シークレットを作成します。
  2. 新しいシークレットに Secret Manager のシークレット アクセサーroles/secretmanager.secretAccessor)ロールを Dialogflow サービス エージェントに付与します。
  3. 認証情報をクリップボードにコピーします。
  4. シークレットに新しいシークレット バージョンを追加します。認証情報をシークレット値として貼り付けます。
    • 認証ヘッダーを使用する場合は、Bearer <YOUR_CREDENTIAL> を入力します。
    • 基本的なユーザー名とパスワードの認証を使用している場合は、代わりに <YOUR_USERNAME>:<YOUR_PASSWORD> を入力します。
    • 末尾の改行文字は省略します。
  5. 追加したシークレット バージョンの名前をコピーします。名前の形式は projects/{project_id}/secrets/{secret_id}/versions/{version_id}" です。
  6. Webhook の編集画面を開き、次の操作を行います。
    • 認証ヘッダーを使用する場合は、新しいシークレット バージョン リクエスト ヘッダーを作成します。[Key] に「Authorization」と入力し、シークレット バージョン名を [Secret version] 入力ボックスに貼り付けます。
    • 基本的なユーザー名とパスワードの認証を使用している場合は、[基本認証] の [Secret バージョン] をクリックし、Secret バージョンの名前を [Secret バージョン] 入力ボックスに貼り付けます。
    • サードパーティの OAuth を使用する場合は、[サードパーティの OAuth] の [シークレット バージョン] をクリックし、シークレット バージョン名を [シークレット バージョン] 入力ボックスに貼り付けます。
  7. [保存] をクリックします。

HTTPS 証明書の検証

会話エージェント(Dialogflow CX)はデフォルトで Google のデフォルトのトラストストアを使用して HTTPS 証明書を検証します。Google のデフォルトのトラストストアで認識されない証明書(自己署名証明書やカスタムルート証明書など)を HTTPS サーバーに使用する場合は、カスタム CA 証明書をご覧ください。

環境特有の Webhook

環境を使用して本番環境システムを開発環境から分離している場合は(推奨)、Webhook を環境特有に構成できます。定義した Webhook リソースごとに、エージェント用に定義した環境ごとに一意の URL と認証の設定を指定できます。

これによって、Webhook コードの更新を本番環境にデプロイする前に安全に開発してテストできます。

Webhook リソースを作成または編集する

Webhook サービスを実行すると、接続と認証の情報を含むエージェントに Webhook リソースを作成する必要があります。作成後、Webhook リソースの設定を随時編集することもできます。

Webhook リソースを作成または編集するには:

コンソール

  1. Dialogflow CX コンソールを開きます。
  2. ご自身の Google Cloud プロジェクトを選択します。
  3. エージェントを選択します。
  4. [Manage] タブを選択します。
  5. [Webhooks] をクリックします。
  6. [作成] をクリックするか、編集するリスト内の Webhook リソースをクリックします。
  7. 標準の Webhook リソース設定またはフレキシブル Webhook リソース設定を入力します。
  8. [保存] をクリックします。

API

Webhook リソースを作成するには、Webhook タイプ用の create メソッドをご覧ください。Webhook リソース(環境特有の設定を除く)を編集するには、Webhook タイプ用の patch または update メソッドをご覧ください。

Webhook リファレンスのプロトコルとバージョンを選択:

プロトコル V3 V3beta1
REST Webhook リソース Webhook リソース
RPC Webhook インターフェース Webhook インターフェース
C++ WebhooksClient 利用できません
C# WebhooksClient 利用できません
Go WebhooksClient 利用できません
Java WebhooksClient WebhooksClient
Node.js WebhooksClient WebhooksClient
PHP 利用不可 利用できません
Python WebhooksClient WebhooksClient
Ruby 利用不可 利用できません

Webhook 用の環境特有の設定を編集するには、Environment タイプ用の patch または update メソッドをご覧ください。

環境リファレンスのプロトコルとバージョンを選択:

プロトコル V3 V3beta1
REST 環境リソース 環境リソース
RPC 環境インターフェース 環境インターフェース
C++ EnvironmentsClient 利用できません
C# EnvironmentsClient 利用できません
Go EnvironmentsClient 利用できません
Java EnvironmentsClient EnvironmentsClient
Node.js EnvironmentsClient EnvironmentsClient
PHP 利用不可 利用できません
Python EnvironmentsClient EnvironmentsClient
Ruby 利用不可 利用できません

Webhook エラー

Webhook サービスで Webhook リクエストの処理中にエラーが発生した場合、Webhook コードは次のいずれかの HTTP ステータス コードを返します。

  • 400 Bad Request(不正なリクエスト)
  • 401 Unauthorized(未承認)
  • 403 Forbidden(禁止)
  • 404 Not found(未検出)
  • 500 Server fault(サーバーエラー)
  • 503 Service Unavailable(サービス利用不可)

エラー状況が次のいずれかの場合、会話エージェント(Dialogflow CX)は Webhook エラーまたはタイムアウトの組み込みイベントを呼び出し、通常どおり処理を続けます。

  • レスポンスのタイムアウトを超過しました。
  • エラー ステータス コードを受信しました。
  • レスポンスが無効です。
  • Webhook サービスを利用できません。

また、インテント検出 API 呼び出しによってWebhook サービス呼び出しがトリガーされた場合、インテント検出レスポンスの queryResult.webhookStatuses フィールドには Webhook ステータスの情報が含まれます。

自動再試行

会話エージェント(Dialogflow CX)には、特定の Webhook エラーに対して自動的に再試行して堅牢性を高める内部メカニズムが含まれています。再試行されるのは、終了以外のエラー(タイムアウトや接続エラーなど)のみです。

重複する呼び出しの可能性を低減するには:

  • Webhook タイムアウトのしきい値を長く設定します。
  • Webhook ロジックでべき等性をサポートするか、重複除去します。

Cloud Run の使用

会話エージェント(Dialogflow CX)は Cloud Run と統合されているため、セキュアなサーバーレス Webhook を作成できます。エージェントと同じプロジェクトに存在する Cloud Run リソースを作成する場合、認証構成で [サービス エージェント認証 -> ID トークン] を選択して、エージェントが Webhook を安全に呼び出せるようにします。

ただし、次の 2 つの状況では、この統合を手動で設定する必要があります。

  1. 次のアドレスを含む会話エージェント(Dialogflow CX)サービス エージェントサービス アカウントが、エージェント プロジェクト用に存在している必要があります。
    service-agent-project-number@gcp-sa-dialogflow.iam.gserviceaccount.com
    この特別なサービス アカウントおよび関連付けられた鍵は通常、プロジェクトの最初のエージェントを作成するときに自動的に作成されます。2020 年 11 月 1 日より前にエージェントを作成した場合は、この特別なサービス アカウントの作成をトリガーできます。
    1. プロジェクトの新しいエージェントを作成します。
    2. 次のコマンドを実行します。
      gcloud beta services identity create --service=dialogflow.googleapis.com --project=agent-project-id
  2. Webhook 関数がエージェントとは異なるプロジェクトにある場合は、Cloud Run リソースのプロジェクトの 会話エージェント(Dialogflow CX)Service Agent サービス アカウントに Cloud Run 起動元または Cloud Functions 起動元IAM のロールを提供する必要があります。
  3. [Auth configuration] セクションで、[Service Agent Auth -> ID Token] を選択します。

コンテナ化された Webhook と Go ezcx フレームワークの使用

Go を使用してコンテナ化された Webhook を実装する場合は、Go ezcx フレームワークをご覧ください。 このフレームワークを使用すると、Webhook の作成に必要な多くの手順を簡素化できます。

内部トラフィック専用の Cloud Run の使用

同じプロジェクトまたは同じ VPC Service Controls 境界内の VPC ネットワークからの内部トラフィックを受け入れるように設定された Cloud Run リソースは、エージェントが同じプロジェクトまたは同じ VPC Service Controls 境界内にある限り、Webhook として使用できます。

サービス ディレクトリを使用したプライベート ネットワーク アクセス

会話エージェント(Dialogflow CX)は Service Directory プライベート ネットワーク アクセスと統合されたため、VPC ネットワーク内の Webhook ターゲットに接続できます。これにより、トラフィックが Google Cloud ネットワーク内に保持され、IAMVPC Service Controls が適用されます。

プライベート ネットワークをターゲットとする Webhook を設定するには、次のようにします。

  1. サービス ディレクトリのプライベート ネットワーク構成に従って、VPC ネットワークとサービス ディレクトリ エンドポイントを構成します。

  2. 次のアドレスを含む会話エージェント(Dialogflow CX)サービス エージェントサービス アカウントが、エージェント プロジェクト用に存在している必要があります。

    service-agent-project-number@gcp-sa-dialogflow.iam.gserviceaccount.com

    Service Directory が配置されているプロジェクトの 会話エージェント(Dialogflow CX)サービス エージェント サービス アカウントに、次のロールを付与します。

    • servicedirectory.viewer
    • servicedirectory.pscAuthorizedService

    また、Service Directory が Dialogflow CX エージェントとは異なるプロジェクトにある場合は、Dialogflow CX エージェントをホストするプロジェクトの会話エージェント(Dialogflow CX)Service Agent アカウントにも servicedirectory.viewer ロールを付与する必要があります。

  3. Webhook の作成時に、サービス ディレクトリ サービスと URL、オプションの認証情報を指定します。

    コンソール

    サービス ディレクトリ Webhook のスクリーンショット。

    API

    Webhook タイプの serviceDirectory フィールドをご覧ください。

    Webhook リファレンスのプロトコルとバージョンを選択:

    プロトコル V3 V3beta1
    REST Webhook リソース Webhook リソース
    RPC Webhook インターフェース Webhook インターフェース
    C++ WebhooksClient 利用できません
    C# WebhooksClient 利用できません
    Go WebhooksClient 利用できません
    Java WebhooksClient WebhooksClient
    Node.js WebhooksClient WebhooksClient
    PHP 利用不可 利用できません
    Python WebhooksClient WebhooksClient
    Ruby 利用不可 利用できません

問題のトラブルシューティングを行う場合、非公開稼働時間チェックを設定することで Service Directory が正しく構成されていることを確認できます。

サンプルとトラブルシューティング

Webhook の入門ガイドをご覧ください。