すべてのプロダクト
Search
ドキュメントセンター

Function Compute:HTTP トリガーで gRPC を使用する

最終更新日:Nov 09, 2025

Function Compute は gRPC プロトコルをサポートしています。HTTP トリガーを使用して gRPC サービスを呼び出すことができます。この場合、関数は gRPC サーバーとして機能し、クライアント側のストリーミングおよび非ストリーミングリクエストを処理します。これにより、サーバーレスアーキテクチャの弾力的なスケーリングと O&M フリーの機能を利用できます。

使用上の注意

呼び出しメソッド

  • ドメイン名: fcapp.run サブドメインまたはカスタムドメイン名を使用して gRPC 関数を呼び出すことができます。

    説明

    カスタムドメイン名を使用する場合は、リクエストパスと関数の間のマッピングを構成する必要があります。リクエストパスを /* に設定することをお勧めします。この設定により、すべての gRPC リクエストが対応する gRPC 関数に転送され、その関数がリクエストをクライアントで定義された gRPC メソッドにルーティングします。

  • ポート: gRPC リクエストのポートは 8089 です。

伝送セキュリティ

  • gRPC リクエストのセキュリティを確保するため、Function Compute のオンライン環境では、Transport Layer Security (TLS) プロトコルを使用するクライアントのみがサポートされます。TLS クライアントを使用しない場合、rpc error: code = Unavailable desc = connection closed before server preface received エラーが報告されます。

  • カスタムドメイン名は、カスタム HTTPS 証明書をサポートします。gRPC サーバーは TLS 証明書の検証を定義する必要はありません。Function Compute ゲートウェイレイヤーが TLS 検証を実行します。

リクエストタイムアウト制御

gRPC リクエストの最大タイムアウトは、関数の [実行タイムアウト] を超えることはできません。 デフォルトの [実行タイムアウト] は 60 秒で、最大 86,400 秒です。

リクエスト同時実行制御

Function Compute の同時実行数は gRPC リクエストを制御します。各 gRPC リクエストは 1 単位の同時実行数を消費します。gRPC プロトコルは HTTP/2 に基づいています。Function Compute では、関数インスタンスに割り当てられた gRPC リクエストは同じ HTTP/2 接続を共有します。この HTTP/2 接続の同時ストリーム数は、インスタンスの同時実行数と同じです。関数のインスタンスごとの同時実行数を設定して、インスタンス上の同時ストリーム数を制御できます。詳細については、「インスタンスごとの同時実行数の設定」をご参照ください。

負荷分散

Function Compute は、gRPC リクエストを異なる関数インスタンスに分散させることで、自動的に負荷分散を実行します。

課金方法

gRPC リクエストは、次のタイプに分類されます。

  • 通常の gRPC リクエスト

  • クライアント側のストリーミングリクエスト

  • サーバー側のストリーミングリクエスト

  • 双方向ストリーミングリクエスト

Function Compute では、リソース使用量 = 仕様 × 課金期間 となります。課金期間は、以下で説明するように、通常の gRPC リクエストとストリーミング gRPC リクエストで異なります。

  • 通常の gRPC リクエスト:

    • 同時実行数が 1 の関数の場合、課金期間はリクエストの開始から終了までです。

    • 同時実行数が 1 より大きい関数の場合、課金期間は最初のリクエストの開始から最後のリクエストの終了までです。インスタンスが複数のリクエストを同時に処理する場合、繰り返し課金されることはありません。

      次の図に示すように、関数の同時実行数は 2 です。最初のリクエストは T1 に到着し、T3 に終了します。2 番目のリクエストは T2 に到着し、T4 に終了します。課金期間は T1 から T4 までです。T2 から T3 までの期間は 1 回だけ課金され、繰り返し課金されることはありません。

  • クライアント側のストリーミング、サーバー側のストリーミング、および双方向ストリーミングリクエスト: 課金期間は、最初の gRPC 接続の開始から最後の gRPC 接続が閉じられるまでです。

前提条件

  • ローカルに Go 言語環境をインストールする必要があります。Function Compute は Go 1.x バージョンをサポートしています。最新バージョンを使用することをお勧めします。

  • ローカルに Serverless Devs ツールをインストールして設定する必要があります。詳細については、「クイックスタート」をご参照ください。

手順

  1. 次のコマンドを実行してプロジェクトを初期化します。

    sudo s init fc-custom-golang-grpc -d fc-custom-golang-grpc
  2. 次のコマンドを実行して、プロジェクトディレクトリ fc-custom-golang-grpc に移動します。

    cd fc-custom-golang-grpc
  3. 現在のプロジェクトディレクトリで、s.yaml ファイルを編集します。

    以下は例です。

    edition: 3.0.0
    name: hello-world-app
    # 現在のアプリケーションに必要なキー情報を設定します。
    # キー設定の詳細については、https://www.serverless-devs.com/serverless-devs/command/config を参照してください
    # キーが使用される順序の詳細については、https://www.serverless-devs.com/serverless-devs/tool#密钥使用顺序与规范 を参照してください
    access: default  # キーのエイリアス。必要に応じて変更してください。
    
    resources:
      helloworld: # ビジネス名またはモジュール名。
        component: fc3
        actions: # カスタム実行ロジック。アクションの詳細については、https://www.serverless-devs.com/serverless-devs/yaml#行为描述 を参照してください
          pre-deploy: # デプロイ前に実行します。
            - run: go mod tidy
              path: ./code
            - run: GOOS=linux GOARCH=amd64 CGO_ENABLED=0 go build -o target/main main.go
              path: ./code
        props:
          region: cn-shanghai  # アプリケーションがデプロイされるリージョン。必要に応じて変更してください。
          functionName: "fc-custom-golang-grpc"
          handler: index.handler
          role: ''
          description: 'hello world by serverless devs'
          timeout: 60
          diskSize: 512
          internetAccess: true
          layers:
            - acs:fc:cn-shanghai:official:layers/Go1/versions/1
          customRuntimeConfig:
            port: 8089
            command:
              - ./main
          runtime: custom.debian10
          cpu: 0.35
          instanceConcurrency: 2
          memorySize: 512
          environmentVariables:
            PATH: >-
              /opt/Go1/bin:/usr/local/bin/apache-maven/bin:/usr/local/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/ruby/bin:/opt/bin:/code:/code/bin
            LD_LIBRARY_PATH: >-
              /code:/code/lib:/usr/local/lib:/opt/lib:/opt/php8.1/lib:/opt/php8.0/lib:/opt/php7.2/lib
          code: ./code/target
  4. sudo s deploy -y を実行して関数をデプロイします。

    コマンドが実行されると、関数は Function Compute にデプロイされます。Function Compute は、関数のテストに使用できるパブリックにアクセス可能な URL を生成します。

  5. HTTP トリガーを作成し、そのパブリック URL を取得します。詳細については、「トリガーの作成」をご参照ください。

    trigger

  6. 次のコマンドを実行して、gRPC クライアントの実行に必要な依存関係をインストールします。

    go mod vendor
  7. 次のコマンドを実行して gRPC クライアントを呼び出します。これにより、gRPC 呼び出しが開始され、関数がテストされます。

    fc-custang-grpc-*****.cn-shanghai.fcapp.run は、ステップ 5 で取得したトリガーのパブリック URL です。

    go run ./greeter_client -addr  fc-custang-grpc-*****.cn-shanghai.fcapp.run:8089
説明

gRPC 関数にカスタムドメイン名を設定し、そのカスタムドメイン名を使用して gRPC リクエストを送信することもできます。詳細については、「カスタムドメイン名は gRPC プロトコルをサポートします」をご参照ください。

よくある質問

関数のエラー

クライアントがエラー rpc error: code = Internal desc = server closed the stream without sending trailers を返した場合、Function Compute サーバーが gRPC リクエストを異常に早期終了したことを示します。このタイプのエラーは関数のエラーです。たとえば、関数がタイムアウトする、関数プロセスが異常終了する、またはメモリ不足 (OOM) エラーが発生するなどです。関数のログでエラーの原因を確認し、エラーのトラブルシューティングを行うことができます。詳細については、「呼び出しログの表示」をご参照ください。

TLS プロトコルクライアントを使用しない GRPC リクエスト

gRPC リクエストを呼び出すには、TLS プロトコルクライアントを使用する必要があります。そうしないと、エラー rpc error: code = Internal desc = server closed the stream without sending trailers が返されます。たとえば、Golang の場合、次のサンプルコードを使用できます。

var opts []grpc.DialOption
    cred := credentials.NewTLS(&tls.Config{
        InsecureSkipVerify: false,
    })
    opts = append(opts, grpc.WithTransportCredentials(cred))
    conn, err := grpc.Dial(*addr, opts...)

InsecureSkipVerify の値は、TLS 証明書の検証をスキップする場合は true に、TLS 証明書の検証をスキップしない場合は false に設定できます。