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

Function Compute:gRPC 呼び出し用の HTTP トリガーの設定

最終更新日:Mar 27, 2026

Function Compute は HTTP トリガーをサポートしており、gRPC リクエストを使用して関数を呼び出すことができます。この場合、関数は gRPC サーバーとして機能し、gRPC リクエストを処理して結果をクライアントに返します。このトピックでは、Function Compute コンソールで HTTP トリガーを設定し、gRPC リクエストを使用して関数を呼び出す方法について説明します。

注意事項

呼び出しメソッド

  • ドメイン名:fcapp.run のサブドメインまたはカスタムドメイン名を使用して gRPC 関数を呼び出すことができます。古いドメイン名 fc.aliyuncs.com はサポートされていません。

    説明

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

  • ポート:gRPC リクエストはポート 8089 を使用します。

トランスポートセキュリティ

  • gRPC リクエストのセキュリティを確保するため、Function Compute の本番環境では TLS を使用するクライアントのみがサポートされます。それ以外の場合、リクエストは rpc error: code = Unavailable desc = connection closed before server preface received というエラーで失敗します。

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

リクエストタイムアウト

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

並行性制御

gRPC リクエストは、Function Compute の同時実行数によって制御されます。1 つの gRPC リクエストは、1 つの同時リクエストとしてカウントされます。gRPC は HTTP/2 プロトコルに基づいています。Function Compute では、関数インスタンスにルーティングされる gRPC リクエストは同じ HTTP/2 接続を再利用します。この接続の同時ストリーム数は、インスタンスの同時実行数と同じです。関数のインスタンスごとの同時実行数を設定して、インスタンス上の同時ストリーム数を制御できます。詳細については、「インスタンスの同時実行数の設定」をご参照ください。

負荷分散

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

課金

gRPC リクエストには 4 つのタイプがあります:

  • 単項 gRPC リクエスト

  • クライアントサイドストリーミングリクエスト

  • サーバーサイドストリーミングリクエスト

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

課金方法はリクエストタイプによって異なります:

  • 単項 gRPC リクエスト:課金方法は標準の HTTP リクエストと同じです。

    • 同時実行数が 1 の関数の場合、課金は gRPC 接続が確立されたときに開始され、終了したときに終了します。

    • 同時実行数が 1 より大きい関数の場合、インスタンスの課金は最初の gRPC 接続が確立されたときに開始され、最後の gRPC 接続が終了したときに終了します。同じインスタンス内の同時接続に対して複数回課金されることはありません。

      たとえば、同時実行数が 2 の関数を考えます。最初のリクエストが T1 に到着して T3 に終了し、2 番目のリクエストが T2 に到着して T4 に終了します。合計課金期間は T1 から T4 までです。T2 から T3 までの重複期間は 1 回のみ課金されます。

      image
  • クライアントサイドストリーミング、サーバーサイドストリーミング、および双方向ストリーミングリクエスト:インスタンスの課金は、最初の gRPC 接続が確立されたときに開始され、最後の gRPC 接続が終了したときに終了します。

事前準備

gRPC 関数コードの準備

Serverless Devs ツールをインストールして設定した後、s init fc-custom-golang-grpc コマンドを実行して、Function Compute で gRPC サービスを実行するための Go 言語で書かれた完全なサンプルコードをダウンロードするか、自分でコードを作成することができます。コードの完全なディレクトリ構造は次のとおりです。./greeter_client ディレクトリはクライアント側のコードで、./code ディレクトリはサーバー側のコードです。

fc-custom-golang-grpc
├── build-image
│   └── Dockerfile
├── certificate
├── code
│   ├── bootstrap
│   └── main.go
├── go.mod
├── greeter_client
│   ├── main
│   └── main.go
├── Makefile
├── privatekey
├── proto
│   ├── helloworld_grpc.pb.go
│   ├── helloworld.pb.go
│   └── helloworld.proto
├── readme.md
├── s_en.yaml
└── s.yaml

ZIP パッケージの準備

fc-custom-golang-grpc プロジェクトディレクトリで make deploy を実行します。これにより、./code ディレクトリにバイナリファイル bootstrap が生成されます。これを bootstrap.zip としてパッケージ化します。

依存関係のインストール

fc-custom-golang-grpc プロジェクトディレクトリで go mod vendor を実行して、gRPC クライアントの依存関係をインストールします。

コンソールを使用した関数のデプロイ

前提条件

サービスの作成

操作手順

  1. Function Compute コンソールにログインします。左側のナビゲーションウィンドウで、[サービス & 関数] をクリックします。

  2. 上部のナビゲーションバーで、リージョンを選択します。[サービス] ページで、目的のサービスをクリックします。

  3. [関数] ページで、[関数の作成] をクリックします。
  4. 関数の作成 ページで、カスタムランタイムを使い作成する を選択し、関連するパラメーターを設定してから、作成 をクリックします。

    以下の必須パラメーターを設定し、その他のパラメーターはデフォルトのままにします。詳細については、「関数の作成」をご参照ください。

    • 関数名grpc-demo など、関数の名前を入力します。

    • リクエストタイプHTTP リクエスト を選択します。

    • ランタイム環境Debian 9 を選択します。

    • コードのアップロード方法: ZIP パッケージでコードをアップロードします を選択します。

    • コードパッケージ:パッケージ化した bootstrap.zip ファイルを選択してアップロードします。

    • 起動コマンド:空のままにすると、デフォルトで ./bootstrap が実行されます。

    • リスニングポート:サーバーがリッスンするポートと同じポートに設定します。この例では、値は 8089 です。

  5. 関数詳細ページで、トリガー タブをクリックし、トリガーのパブリックエンドポイントを表示します。

    grpc-demo

  6. 次のコマンドを実行して gRPC クライアントを呼び出し、gRPC リクエストを送信して関数をテストします。

    go run ./greeter_client -addr  grpc-demo-service-*********.cn-qingdao.fcapp.run:8089
説明

gRPC 関数にカスタムドメイン名を設定し、それを使用して呼び出すこともできます。

Serverless Devs を使用した関数のデプロイ

前提条件

操作手順

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

    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: 1.0.0
    name: hello-world-app
    # access は、現在のアプリケーションで必要なキー情報を指定します。
    # キーの設定方法については、https://www.serverless-devs.com/serverless-devs/command/config をご参照ください。
    # キーが使用される順序については、https://www.serverless-devs.com/serverless-devs/tool# をご参照ください。
    access: "default"
    
    vars: # グローバル変数
      region: "cn-hangzhou" # 関数をデプロイするリージョン。
      service:
        name: "grpc-demo"  # 関数が配置されているサービスの名前。
        description: 'hello world by serverless devs'
        internetAccess: true
    
    services:
      helloworld: # カスタムサービスまたはモジュール名。
        # helloworld モジュールのみで操作を実行するには、's helloworld build' のようにコマンドに helloworld を追加します。
        # モジュールを指定せずに 's build' を実行すると、ツールは YAML ファイル内の helloworld と同じレベルのすべてのモジュールを順次ビルドします。
        component: fc
        actions: # カスタム実行ロジック (actions) の使用方法については、https://www.serverless-devs.com/serverless-devs/yaml をご参照ください。
          pre-deploy: # デプロイ前に実行します。
            - run: make build
              path: ./
        #        - component: fc build --use-docker --dockerfile ./code/Dockerfile  # 実行するコンポーネント。フォーマット:[component: ComponentName Command Arguments]。's cli registry search --type Component' を実行してコンポーネントのリストを取得できます。
        #        - run: docker build xxx          # 実行するシステムコマンド。フックに似ています。
        #          path: ./src                    # システムコマンド/フックが実行されるパス。
        #        - plugin: myplugin               # 実行するプラグイン。's cli registry search --type Plugin' を実行してプラグインのリストを取得できます。
        #          args:                          # プラグインの引数。
        #            testKey: testValue
        #      post-deploy: # デプロイ後に実行します。
        #        - component: fc versions publish # 実行するコマンド。
        props:
          region: ${vars.region}
          service: ${vars.service}
          #        logConfig:
          #          project: mypro-dev
          #          logstore: function-log
          function:
            name: "golang-grpc"  # デプロイする関数の名前。
            description: 'hello world by serverless devs'
            timeout: 30
            memorySize: 512
            runtime: custom
            codeUri: ./code
            instanceConcurrency: 3
            caPort: 8089
          triggers:
            - name: http2Trigger
              type: http
              config:
                authType: anonymous
                # HTTP トリガーのトリガーメソッド。POST メソッドを設定する必要があります。
                methods: 
                  - GET
                  - POST
    #      customDomains:
    #        - domainName: auto
    #          protocol: HTTP,HTTPS
    #          routeConfigs:
    #            - path: /*
    #              serviceName: "grpc-demo"
    #              functionName: "golang-grpc"
    #          certConfig:
    #            certName: certtest
    #            certificate: ./certificate
    #            privateKey: ./privatekey
  4. s deploy -y を実行して関数をデプロイします。

    実行が完了すると、関数は Function Compute にデプロイされます。さらに、Function Compute は直接アクセス可能な URL を生成します。この URL を使用して関数を呼び出し、テストすることができます。

  5. 次のコマンドを実行して、gRPC クライアントの依存関係をインストールします:

    go mod vendor
  6. 次のコマンドを実行して gRPC クライアントを呼び出し、gRPC リクエストを送信して関数をテストします。

    HTTP トリガーのパブリックエンドポイントを使用します。次の例はコマンドを示しています:

    go run ./greeter_client -addr golang-grpc-grpc-demo-torcawakky.cn-qingdao.fcapp.run:8089

その他の例

カスタムランタイム

カスタムコンテナ

Golang

Golang

Python

N/A

よくある質問

関数のエラー

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

非 TLS gRPC リクエスト

TLS 対応のクライアントを使用して gRPC リクエストを送信する必要があります。そうしないと、リクエストは rpc error: code = Unavailable desc = connection closed before server preface received というエラーで失敗します。次のコードは Golang での例を示しています:

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

InsecureSkipVerifytrue に設定して TLS 証明書検証をスキップするか、false に設定して強制することができます。

詳細情報

Function Compute コンソールに加えて、SDK を使用してトリガーを設定することもできます。詳細については、「SDK リファレンス (2021-04-06 推奨)」をご参照ください。

トリガーを変更または削除するには、「トリガーの管理」をご参照ください。