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 回のみ課金されます。
クライアントサイドストリーミング、サーバーサイドストリーミング、および双方向ストリーミングリクエスト:インスタンスの課金は、最初の 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.yamlZIP パッケージの準備
fc-custom-golang-grpc プロジェクトディレクトリで make deploy を実行します。これにより、./code ディレクトリにバイナリファイル bootstrap が生成されます。これを bootstrap.zip としてパッケージ化します。
依存関係のインストール
fc-custom-golang-grpc プロジェクトディレクトリで go mod vendor を実行して、gRPC クライアントの依存関係をインストールします。
コンソールを使用した関数のデプロイ
前提条件
操作手順
Function Compute コンソールにログインします。左側のナビゲーションウィンドウで、[サービス & 関数] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。[サービス] ページで、目的のサービスをクリックします。
- [関数] ページで、[関数の作成] をクリックします。
関数の作成 ページで、カスタムランタイムを使い作成する を選択し、関連するパラメーターを設定してから、作成 をクリックします。
以下の必須パラメーターを設定し、その他のパラメーターはデフォルトのままにします。詳細については、「関数の作成」をご参照ください。
関数名:grpc-demo など、関数の名前を入力します。
リクエストタイプ:HTTP リクエスト を選択します。
ランタイム環境:Debian 9 を選択します。
コードのアップロード方法: ZIP パッケージでコードをアップロードします を選択します。
コードパッケージ:パッケージ化した
bootstrap.zipファイルを選択してアップロードします。起動コマンド:空のままにすると、デフォルトで
./bootstrapが実行されます。リスニングポート:サーバーがリッスンするポートと同じポートに設定します。この例では、値は 8089 です。
関数詳細ページで、トリガー タブをクリックし、トリガーのパブリックエンドポイントを表示します。

次のコマンドを実行して gRPC クライアントを呼び出し、gRPC リクエストを送信して関数をテストします。
go run ./greeter_client -addr grpc-demo-service-*********.cn-qingdao.fcapp.run:8089
gRPC 関数にカスタムドメイン名を設定し、それを使用して呼び出すこともできます。
Serverless Devs を使用した関数のデプロイ
前提条件
操作手順
次のコマンドを実行してプロジェクトを初期化します:
s init fc-custom-golang-grpc -d fc-custom-golang-grpc次のコマンドを実行して
fc-custom-golang-grpcプロジェクトディレクトリに移動します:cd fc-custom-golang-grpc任意: 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: ./privatekeys deploy -yを実行して関数をデプロイします。実行が完了すると、関数は Function Compute にデプロイされます。さらに、Function Compute は直接アクセス可能な URL を生成します。この URL を使用して関数を呼び出し、テストすることができます。
次のコマンドを実行して、gRPC クライアントの依存関係をインストールします:
go mod vendor次のコマンドを実行して gRPC クライアントを呼び出し、gRPC リクエストを送信して関数をテストします。
HTTP トリガーのパブリックエンドポイントを使用します。次の例はコマンドを示しています:
go run ./greeter_client -addr golang-grpc-grpc-demo-torcawakky.cn-qingdao.fcapp.run:8089
その他の例
カスタムランタイム | カスタムコンテナ |
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...)InsecureSkipVerify を true に設定して TLS 証明書検証をスキップするか、false に設定して強制することができます。
詳細情報
Function Compute コンソールに加えて、SDK を使用してトリガーを設定することもできます。詳細については、「SDK リファレンス (2021-04-06 推奨)」をご参照ください。
トリガーを変更または削除するには、「トリガーの管理」をご参照ください。