Google Cloud Platformでの外部関数の作成

これらの手順は、リモートサービスとしてGoogle Cloud Functionを使用し、プロキシサービスとしてGoogle Cloud API Gatewayを使用して、Google Cloud Platform(GCP)でホストされる外部関数を作成する方法を示しています。これらの手順は、Snowflakeにより提供されるサンプルの外部関数を作成するか、独自の外部関数を作成するためのガイドとして使用できます。

これらの手順では、 GCP の管理にすでに精通していることを前提としています。これらの手順では、実行する必要のある一般的な手順について説明しますが、詳細は変更される可能性があるため、ユーザーインターフェイスについて詳しくは説明しません。

Googleは、これらのステップの多くに使用できるコマンドラインインターフェイスも提供しています。詳細については、 GCP のドキュメントをご参照ください。

このトピックの内容:

GCPでの外部関数の作成計画

前提条件

前提条件は次のとおりです。

  • Google Cloudプロジェクト ID が必要です。

  • Google Cloud Projectで適切なサービスを有効にする必要があります。詳細な要件については、Google Cloud API Gatewayクイックスタートドキュメント をご確認ください。

ワークシート

外部関数を作成するときは、入力した特定の情報(例: Cloud Functionトリガー URL)を記録して、後続のステップでその情報を使用できるようにする必要があります。以下のワークシートは、この情報を追跡するのに役立ちます。

======================================================================================
======================================= Worksheet ====================================
======================================================================================

--------------- Cloud Function (remote service) Information ---------------

Cloud Function Trigger URL: _______________________________________________


---------------------- API Config File Information ------------------------

Path Suffix ..............: _______________________________________________

Configuration File Name ..: _______________________________________________


----------------- API Gateway (proxy service) Information -----------------

Managed Service Identifier: _______________________________________________

Gateway Base URL .........: _______________________________________________


------------ API Integration Information ------------

API Integration Name .....: _______________________________________________

API_GCP_SERVICE_ACCOUNT ..: _______________________________________________


------------ External Function Information ------------

External Function Name ...: _______________________________________________


--------------------------- Security Information --------------------------

Security Definition Name .: _______________________________________________

ステップ1: リモートサービスを作成する(Google Cloud Function)

このチュートリアルでは、リモートサービスがGoogle Cloud Functionとして実装されています。

  1. Cloud Functionを作成するためのGoogleの手順 に従い、Google Cloud Functionを作成します。Snowflakeが提供するサンプルのPython言語関数を作成する場合は、 Python Quickstart を選択します。それ以外の場合は、必要な言語に基づいて適切な QuickStart を選択してください。Googleの手順に従いながら、次を確認します。

    • 関数のトリガーが HTTP であることを指定します。

    • トリガー URL を上記のワークシートの「Cloud Function Trigger URL」フィールドにコピーします。

    • Authentication セクションで、 Require authentication を選択します。

      GCP の手順では、 Allow unauthenticated invocations を選択するようになっています。これは、Snowflakeが提供するサンプル関数を含むサンプル関数では許容されますが、実稼働システムの大半では認証が必要です。

    • Require HTTPS がまだ有効になっていない場合は、有効にします。

    • Save をクリックします。

    • 適切な Runtime を選択します。Snowflakeが提供するサンプルPython関数を作成する場合は、Pythonランタイム(例: Python 3.7)を選択します。

      注釈

      コードに貼り付ける 前に、適切な Runtime 値を選択します。

    • デフォルトのコードを以下のSnowflakeサンプルコード(Python 3.7で記述)、または独自のカスタムコードに置き換えます。

      このサンプルコードは、入力パラメーター値を単一のリスト(配列)に結合し、そのリストを SQL 型 VARIANT の単一値として返します。

      この関数は、Snowflakeが送信し、読み取る形式と同じ形式(JSON)でデータを受け入れ、返します。(データ形式の詳細については、 リモートサービスの入力形式および出力データ形式 を参照。)

      import json
      
      HTTP_SUCCESS = 200
      HTTP_FAILURE = 400
      
      def echo(request):
          try:
              # The list of rows to return.
              return_value = []
      
              payload = request.get_json()
              rows = payload["data"]
      
              # For each input row
              for row in rows:
                  # Include the row number.
                  row_number = row[0]
                  # Combine the value(s) in the row into a Python list that will be treated as an SQL VARIANT.
                  row_value = row[1:]
                  row_to_return = [row_number, row_value]
                  return_value.append(row_to_return)
      
              json_compatible_string_to_return = json.dumps( { "data" : return_value } )
              return (json_compatible_string_to_return, HTTP_SUCCESS)
      
          except:
              return(request.data, HTTP_FAILURE)
      
    • Entry point が関数の名前(この場合は echo)と一致することを確認します。

  2. クラウド関数の作成が完了したら、 Testing タブを使用して関数を呼び出し、期待どおりに機能することを確認します。

    Snowflakeが提供するサンプルPython関数の場合、次のテストデータを使用します(Testing タブにあるデフォルトのデータを以下のデータで置換)。

    { "data":
      [
        [ 0, 43, "page" ],
        [ 1, 42, "life, the universe, and everything" ]
      ]
    }
    

    実行結果は次のようになります。

    {"data":
      [
        [0, [43, "page"] ],
        [1, [42, "life, the universe, and everything"] ]
      ]
    }
    

    (結果は、上記の例とは異なる方法で表示される場合があります。)

    上記が正しく機能していれば、外部関数のリモートサービスとして使用可能なGoogle Cloud Functionができたことになります。

ステップ2: プロキシサービス(Google Cloud API Gateway)を作成して構成する

Snowflakeは、データ(HTTP POST リクエスト)をリモートサービス(例: GCP Cloud Function)に直接送信しません。代わりに、Snowflakeは、Snowflakeからリモートサービスにデータを中継し、リモートサービスからSnowflakeにデータを中継するプロキシサービスにデータを送信します。GCP では、SnowflakeはプロキシサービスとしてGoogle Cloud API Gatewayをサポートしています。

リクエストをCloud FunctionにルーティングするためのGoogle Cloud API Gatewayを作成する

Google Cloud Consoleを使用する場合、実行する具体的なステップは次のとおりです。

  1. 構成ファイルを作成することにより、 API 定義を作成します。

  2. API Gatewayを作成します。

    1. API を作成します。

    2. API Configを作成します。

    3. API ConfigでGatewayを作成します。

これらのステップについては、以下で詳しく説明します。

API 定義を作成する

ローカルファイルシステムで、作成する API を指定する YAML 形式の構成ファイルを作成してカスタマイズします。ファイルの拡張子は、 .yaml または .yml である必要があります。構成ファイルのテンプレートは次のとおりです。

swagger: '2.0'
info:
  title: API Gateway config for Snowflake external function.
  description: This configuration file connects the API Gateway resource to the remote service (Cloud Function).
  version: 1.0.0
schemes:
  - https
produces:
  - application/json
paths:
  /<PATH>:
    post:
      summary: Echo the input.
      operationId: echo
      x-google-backend:
        address: <HTTP ENDPOINT TO ROUTE REQUEST TO>
        protocol: h2
      responses:
        '200':
          description: <DESCRIPTION>
          schema:
            type: string

次のフィールドに入力または更新します。

  1. < PATH > を一意の名前に置き換えます。これは URLs に組み込まれるため、 URLs で有効な文字のみを使用してください。たとえば、 demo-func-resource と入力します。

    <PATH> の場合は、この構成ファイルの他のフィールドとは異なり、コロンの後ではなく、コロンの前に値を入力する必要があることに注意してください。たとえば、次は適切です。

    paths:
      /demo-func-resource:
    

    パス名には、 パスパラメーター を含めることはできません。(Googleは、 パスを URL に設定する ときに、パスパラメーターをサポートします。ただし、Snowflakeは、 CREATE EXTERNAL FUNCTION ステートメントで指定された対応する URL のパスパラメーターをサポートしていません。)

  2. 直前のステップ(例: demo-func-resource)の path をワークシートの「Path Suffix」フィールドにコピーします。

  3. x-google-backend フィールドの下にある address フィールドを見つけ、 <HTTP ENDPOINT TO ROUTE REQUEST TO> をワークシートの「Cloud Function Trigger URL」フィールドの値に置き換えます。結果は次のようになります。

    x-google-backend:
      address: https:// ...
    

    URL の前後には引用符を付けないでください。

    URL は、Googleがホストするエンドポイントだけでなく、任意の HTTP エンドポイントへのパスにすることができます。

    リモートサービスを作成 したときに Require HTTPS を選択した場合は、 address`フィールドに入力する URL が :code:`https で始まることを確認してください。

  4. オプションで、次のいずれも更新することができます。

    • info セクションにある title

    • info セクションにある description

    • paths セクションの post サブセクションにある operationId

    • paths セクションの post サブセクションにある summary

  5. サンプル構成ファイルを確認します。次のようになります。

    swagger: '2.0'
    info:
      title: "API Gateway config for Snowflake external function"
      description: "This configuration file connects the API Gateway resource to the remote service (Cloud Function)."
      version: 1.0.0
    schemes:
      - https
    produces:
      - application/json
    paths:
      /demo-func-resource:
        post:
          summary: "echo the input"
          operationId: echo
          x-google-backend:
            address: https://my_dev.cloudfunctions.net/demo-cloud-function-01
            protocol: h2
          responses:
            '200':
              description: echo result
              schema:
                type: string
    
  6. この構成ファイルを保存します。

  7. ワークシートの「Configuration File Name」フィールドに、ファイルのパスと名前を記録します。

API 構成ファイルの詳細については、次の GCP ドキュメントをご参照ください。

API Gatewayを作成する

API を作成する

このステップでは、 GCP API を作成します。これは、1つ以上の API Gatewayと1つ以上の構成ファイルを含むことができるコンテナーです。

  1. まだそうしていない場合は、 GCP メニューをクリックして API Gateway を選択し、Google Cloud API Gateway画面に移動します。

  2. CREATE GATEWAY をクリックします。

  3. Display NameAPI ID を入力します(例: demo-api-display-name-for-external-function1demo-api-id-for-external-function1)。

    外部関数の作成では後でこれらを入力する必要がないため、ワークシートに記録する必要はありません。ただし、 API ID を記録して、使い終わったら削除できるようにすることもできます。

API Configを作成する

構成ファイルを GCP にアップロードすると、 API Config が作成されます。

  1. 画面の API Config セクションまでスクロールします。

  2. Upload an API Spec を含むフィールドを検索します。

    BROWSE をクリックして、構成ファイルを選択します。構成ファイルの名前は、ワークシートの「Configuration File Name」フィールドに記録されています。

  3. Display Name を含むフィールドに表示名を入力します。

  4. サービスアカウントを選択します。

    サンプル関数を作成した場合は、 Select a Service Account を含むフィールドで App Engine default service account を選択します。

    (サンプルとしてではなく)実稼働環境で使用する関数を作成している場合は、別のサービスアカウントを選択することもできます。

    選択したサービスアカウントには、クラウド関数を呼び出す権限など、適切な権限が必要です。

API ConfigでGatewayを作成する

  1. 画面の Gateway details セクションまでスクロールします。

  2. 新しい API Gatewayの Display Name を入力します。

  3. Location フィールドをクリックして、適切なリージョン(例: us-central1)を選択します。

  4. CREATE GATEWAY をクリックします。

    これにより、 APIs 画面が表示され、 APIs のリストが表示されます。

    新しい API がすぐに表示されない場合は、数分待ってから Refresh ボタンをクリックします。

  5. API の Managed Service の値をワークシートの「Managed Service Identifier」フィールドにコピーします。

  6. この時点で、 APIs のリストが表示されます。API の名前をクリックします。

    OVERVIEWDETAILSCONFIGS、および GATEWAYS のタブ4つが表示されます。

  7. GATEWAYS タブをクリックします。

  8. Gateway URL をワークシートの「Gateway Base URL」フィールドにコピーします。

ステップ3: Snowflakeに API 統合オブジェクトを作成する

  1. Snowflakeウェブインターフェイスのセッションを開きます(まだ開いていない場合)。

  2. ACCOUNTADMIN 権限を持つSnowflakeロールまたは CREATE INTEGRATION 権限を持つロールを使用するために、 USE ROLE コマンドを実行します。次に例を示します。

    use role has_accountadmin_privileges;
    
  3. CREATE API INTEGRATION コマンドを入力して、 API 統合を作成します。コマンドは次のようになります。

    create or replace api integration <integration_name>
        api_provider = google_api_gateway
        google_audience = '<google_audience_claim>'
        api_allowed_prefixes = ('<url>')
        enabled = true;
    
  4. <統合名> を一意の統合名に置き換えます。

  5. ワークシートの「API Integration Name」フィールドに統合名を記録します。 CREATE EXTERNAL FUNCTION コマンドを実行するときに、 API 統合名が後で必要になります。

  6. google_audience 句で、 <Googleオーディエンスクレーム> をワークシートの「Managed Service Identifier」フィールドの値に置き換えます。

    (認証中に、SnowflakeはGoogleに JWT (JSON ウェブトークン)を提供します。JWT には、Snowflakeが google_audience フィールドの値に設定する「aud」(「オーディエンス」)クレームが含まれています。Googleでの認証の詳細については、Googleサービスアカウント 認証のドキュメント をご参照ください。)

  7. api_allowed_prefixes 句で、 <URL> をワークシートの「Gateway Base URL」フィールドの値に置き換えます。

    (このフィールドでは、この API 統合を適用できる URLs を制限できます。Gateway Base URL よりも制限の厳しい値を使用できます。)

  8. まだ実行していない場合は、上記で入力した CREATE API INTEGRATION コマンドを実行します。

  9. API 統合の API_GCP_SERVICE_ACCOUNT 情報を読み取って記録します。

    1. DESCRIBE INTEGRATION コマンドを実行します。例:

      describe integration my_api_integration_name;
      
    2. ワークシートの「API_GCP_SERVICE_ACCOUNT」フィールドに API_GCP_SERVICE_ACCOUNT の値を記録します。

API 統合の作成の詳細については、 CREATE API INTEGRATION をご参照ください。

ステップ4: Snowflakeに外部関数を作成する

Snowflakeウェブインターフェイスセッションに参加している必要があります。

  1. CREATE EXTERNAL FUNCTION コマンドを貼り付けます。コマンドは次のようになります。

    create or replace external function <external_function_name>(<parameters>)
        returns variant
        api_integration = <api_integration_name>
        as '<function_URL>' ;
    
  2. <外部関数名> を一意の関数名(例: echo)に置き換えます。

  3. ワークシートの「External Function Name」フィールドに関数名を記録します。

  4. <パラメーター> を、パラメーターの名前と SQL データ型(存在する場合)に置き換えます。例: a integer, b varchar

    パラメーターは、リモートサービスが期待するパラメーターに対応している必要があります。パラメーター名は一致する必要はありませんが、データ型には互換性が必要です。

  5. ワークシートの「External Function Name」フィールドにパラメーター名とデータ型を記録します。

  6. api_integration 句で、 <API統合名> をワークシートの「API Integration Name」フィールドの値に置き換えます。

  7. <関数 URL> をワークシートのGatewayBase URL フィールドの値に置き換え、その後にスラッシュ(/)とワークシートのPath Suffixフィールドの値を続けます。

    URL は次のようになります。

    https://<gateway-base-url>/<path-suffix>
    
  8. まだ実行していない場合は、上記で入力した CREATE EXTERNAL FUNCTION コマンドを実行します。

ステップ5: 外部関数を呼び出す

外部関数を呼び出してテストします。たとえば、次のような SQL コマンドを実行します。

select my_external_function(42, 'Life, the Universe, and Everything');

関数名「my_external_function」をワークシートの「External Function Name」フィールドに記録した、実際の外部関数名に置き換えます。

戻り値は、次のようになっている必要があります。

[42, "Life, the Universe, and Everything"]

ステップ6: Google Cloud API Gateway(プロキシサービス)にセキュリティポリシーを設定する

構成ファイルの更新と再ロード

前のステップでは、正しいGoogle Cloud API Gatewayエンドポイントのある人であれば誰でも呼び出すことができる、Google Cloud関数を作成します。エンドポイントを一般に公開する場合を除いて、 API 定義の構成ファイルにカスタマイズされた securityDefinitions セクションを追加してエンドポイントを保護する必要があります。

構成ファイルの名前は、ワークシートの「Configuration File Name」フィールドに記録されます。以下の手順は、構成ファイルに securityDefinitions セクションを追加する方法を示しています。これが追加、カスタマイズ、ロード、および表示された後、Snowflakeのみが API Gatewayを介してCloud Functionを呼び出すことができます。

  1. 次の securityDefinitions セクションを構成ファイルに追加します。これを構成ファイルの schemes: セクションのすぐ上に、同じインデントレベルで追加します。

    securityDefinitions:
      <security-def-name>:
        authorizationUrl: ""
        flow: "implicit"
        type: "oauth2"
        x-google-issuer: "<gmail service account>"
        x-google-jwks_uri: "https://www.googleapis.com/robot/v1/metadata/x509/<gmail service account>"
    
  2. <security-def-name> を一意のセキュリティ定義名(例: snowflakeAccess01)に置き換えます。

  3. この名前をワークシートの「Security Definition Name」フィールドに記録します。

  4. <gmail service account> をワークシートの「API_GCP_SERVICE_ACCOUNT」フィールドにある値に置き換えます。構成ファイルの2つのフィールドに変更を加えます。

    1. x-google-issuer フィールド。

    2. x-google-jwks_uri フィールドの終わり。

  5. 上記で作成したセキュリティ定義を参照するように、構成ファイルの post: セクションを更新します。

    1. operationId フィールドの下に、次を追加します。

      security:
        - <security-def-name>: []
      

      これは、 operationId フィールドと同じレベルでインデントする必要があります。

      <security-def-name> をワークシートの「Security Definition Name」フィールドの値に置き換えます。

      上記のように、セキュリティ定義名の前にハイフンと空白を含めるようにします。

      コロンの後に空の角括弧([])を必ず含めてください。

      例:

      security:
        - snowflakeAccess01: []
      

      更新された構成ファイルは、次のようになります。

      swagger: '2.0'
      info:
        title: API Gateway config for Snowflake external function
        description: This configuration file connects the API Gateway resource to the remote service (Cloud Function).
        version: 1.0.0
      securityDefinitions:
        snowflakeAccess01:
          authorizationUrl: ""
          flow: "implicit"
          type: "oauth2"
          x-google-issuer: "<API_GCP_SERVICE_ACCOUNT>"
          x-google-jwks_uri: "https://www.googleapis.com/robot/v1/metadata/x509/<API_GCP_SERVICE_ACCOUNT>"
      schemes:
        - https
      produces:
        - application/json
      paths:
        /demo-func-resource:
          post:
            summary: Echo the input
            operationId: operationID
            security:
              - snowflakeAccess01: []
            x-google-backend:
              address: <Cloud Function Trigger URL>
              protocol: h2
            responses:
              '200':
                description: <DESCRIPTION>
                schema:
                  type: string
      
  6. 構成ファイルを保存します。

  7. 更新された構成ファイルをアップロードします。

    1. Gateways ページで、ゲートウェイの名前をクリックします。

    2. EDIT をクリックします。

    3. API Config の下で、 Select a Config というタイトルのボックスをクリックします。

    4. オプション Create new API config を選択します。

    5. Upload an API Spec が含まれているボックスで、 BROWSE ボタンをクリックします。

    6. 前に作成した目的の YAML ファイルを選択します。拡張子が「.yaml」または「.yml」であることを確認します。

    7. Display Name を入力します。以前に使用した名前ではなく、新しい一意の名前を使用します。

    8. Select a Service Account を求められた場合は、 App Engine default service account を選択します。

      (サンプルとしてではなく)実稼働環境で使用する関数を作成している場合は、別のサービスアカウントを選択することもできます。

      選択したサービスアカウントには、Google Cloud Functionを呼び出す権限などの適切な権限が必要です。

    9. これで、 API Gatewayのページに戻るはずです。Config フィールドに古い API Configファイルの表示名が表示されている場合は、次のようにします。

      1. EDIT をクリックします。

      2. API Config の下で、もう一度 Select a Config ボックスを見つけて、ボックスをクリックします。

      3. 新しい API Configを選択します。

      4. UPDATE ボタンをクリックします。

        これにより、 API Gatewayのリストに戻ります。

      5. API Gatewayが更新されるまでに数分を必要とする場合があります。

        API Gateway名の左側に、Gatewayが更新されていることを示すアイコンが表示される場合があります。

        Gateway名の上にある REFRESH ボタンをクリックして、更新がまだ進行中であるかどうかを確認できます。Gateway名の左側にあるアイコンが消えたら、Gatewayを包括的に更新する必要があります。そうすると、次のステップに進むことができます。

  8. 再度 外部関数を呼び出して、新しいセキュリティ制限で機能することを確認します。

関連するGoogleドキュメントへのリンク

これらのステップについて、Cloud Consoleに関するGoogleのドキュメントを読みたい場合は、以下のリンクをご参照ください。

一部の読者には、次のGoogleドキュメントが役立つ場合があります。

トラブルシューティング

プラットフォームに依存しない症状

データ型の実際の戻り値が期待される戻り値と一致しない

外部関数との間で引数を渡すときは、データ型が適切であることを確認してください。送信された値が受信中のデータ型に適合しない場合、値は切り捨てられるか、他の方法で破損する可能性があります。

詳細については、 外部関数の引数がリモートサービスにより解析される引数に対応していることを確認 をご参照ください。

SQL から関数を呼び出すと、行番号が故障しているというメッセージを表示

考えられる原因

各バッチ内で返される行番号は、0から始まる単調な昇順の整数でなければならないことに注意してください。入力行番号もその規則に従う必要があり、各出力行は対応する入力行と一致する必要があります(例: 出力行0の出力は、入力行0の入力に対応する必要あり)。

考えられる解決策
  1. 返される行番号が受け取った行番号と同じであること、および各出力値が対応する入力の行番号を使用していることを確認してください。これで うまくいくはずです。解決できない場合は、入力行番号が正しくなかったか、行を正しい順序で返していない可能性があるため、以下のステップ2に進みます。

  2. 出力行番号が0から始まり、1ずつ増加し、順番に並んでいることを確認します。

データの入力形式および出力形式の詳細については、 リモートサービスの入力および出力データ形式 をご参照ください。

外部関数を呼び出そうとすると、「エラー解析 JSON: 無効な応答」というメッセージを表示

考えられる原因

最も可能性の高い原因は、リモートサービスから返された JSON (例: AWS Lambda関数)が正しく構築されていないことです。

考えられる解決策

配列中の配列1つを返すとともに、受け取った入力行ごとに1つの内部配列が返すことを確認します。 Snowflakeが受信するデータ形式 で出力形式の説明を確認します。

戻り値の形式が JSON ではないことを示すエラーメッセージ

考えられる原因

考えられる原因の1つは、戻り値の中に二重引用符が含まれていることです。

考えられる解決策

JSON 文字列は二重引用符で区切られますが、ほとんどの場合、文字列自体は引用符で開始および終了できません。埋め込まれた二重引用符が正しくない場合は、削除してください。

関数が間違った行数を受け取ったことを示すエラーメッセージ

考えられる原因

リモートサービスが受信した行よりも多いか少ない行を返そうとした可能性があります。(関数は名目上スカラーではあるものの、「イベント」パラメーターの「本体」フィールドに複数の行を受け取る可能性があり、受け取ったのとまったく同じ数の行を返す必要あり。)

考えられる解決策

リモートサービスが、受信する行ごとに1行を返すことを確認します。

プラットフォーム固有の症状

'{"message":"Audiences in Jwt are not allowed","code":403} ' が表示され、リクエストに失敗

考えられる原因
  • この失敗は、 API 統合の google_audience フィールドの値が許可されていないことを示しています。

考えられる解決策
  • API 統合の google_audience 値が、 API のマネージドサービス名と一致することを確認してください。この名前は、ワークシートの「Managed Service Identifier」フィールドに記録する必要があります。

  • API Configファイルの securityDefinitions セクションに x-google-audiences フィールドを追加した場合は、 x-google-audiences の値が API 統合の google_audience フィールドの値と一致することを確認してください。

Googleでの認証の詳細については、Googleサービスアカウント 認証のドキュメント をご参照ください。

'{"message":"Jwt is missing","code":401} ' が表示され、リクエストに失敗

考えられる原因
  • 構成ファイルの securityDefinitions フィールドにある x-google-issuer フィールドの値が、 API 統合(ワークシートに記録されている)にある API_GCP_SERVICE_ACCOUNT の値と一致しない場合があります。

  • x-google-issuer の値には、余分な空白が含まれている可能性があります。

考えられる解決策
  • API_GCP_SERVICE_ACCOUNT と一致するように x-google-issuer を更新します。

  • 不要な空白を削除します。

'403 Forbidden' が表示され、リクエストに失敗

考えられる原因

この失敗で考えられる原因の1つは、Configを使用しているサービスアカウントに、バックエンドに対する適切なアクセス許可がないことです。

考えられる解決策

サービスアカウントの権限を更新します。