関数にカスタムドメイン名をバインドすると、gRPC クライアントを使用して gRPC リクエストを送信できます。関数は gRPC サーバーとして機能し、これらのリクエストを処理して結果を返します。このトピックでは、Go を例として、Serverless Devs を使用して関数をデプロイし、gRPC リクエストで関数をトリガーする方法を説明します。
使用方法
呼び出し方法
gRPC 関数を呼び出すには、カスタムドメイン名を使用する必要があります。
説明関数にカスタムドメイン名をバインドする際、リクエストパスと関数の間にパスマッピングを設定する必要があります。リクエストパスを
/*に設定することを推奨します。この設定により、すべての gRPC リクエストがターゲットの gRPC 関数に転送され、その後、クライアントによって定義された特定の gRPC メソッドにルーティングされます。ポート:gRPC リクエストはポート
8089に送信されます。
トランスポートセキュリティ
gRPC リクエストのセキュリティを確保するため、Function Compute の本番環境では、Transport Layer Security (TLS) プロトコルを使用するクライアントのみがサポートされます。そうでない場合、リクエストは
rpc error: code = Unavailable desc = connection closed before server preface receivedというエラーで失敗します。カスタムドメイン名は、カスタム HTTPS 証明書をサポートしています。Function Compute のゲートウェイレイヤーが TLS ハンドシェイクを処理するため、gRPC サーバー側で TLS 証明書の検証を定義する必要はありません。
リクエストのタイムアウト制御
gRPC リクエストの最大タイムアウトは、関数の [実行タイムアウト] を超えることはできません。デフォルトでは、[実行タイムアウト] は 60 秒で、最大 86,400 秒です。
リクエストの同時実行制御
gRPC リクエストは、Function Compute の同時実行制御の対象となります。各 gRPC リクエストは、1 単位の同時実行数を消費します。gRPC プロトコルは HTTP/2 上に構築されています。Function Compute では、同じ関数インスタンスにルーティングされる gRPC リクエストは、単一の HTTP/2 接続を共有します。この接続上の同時ストリーム数は、設定可能なインスタンスの同時実行数によって決まります。詳細については、「インスタンスの同時実行数の設定」をご参照ください。
負荷分散
Function Compute は、gRPC リクエストをインスタンス間で自動的に分散することにより、組み込みの負荷分散を提供します。
課金
gRPC には、次の 4 種類のリクエストがあります:
単項 gRPC リクエスト
クライアントストリーミングリクエスト
サーバーストリーミングリクエスト
双方向ストリーミングリクエスト
Function Compute では、リソース使用量は「仕様 × 課金期間」として計算されます。課金期間は、単項 gRPC リクエストとストリーミング gRPC リクエストで異なります:
単項 gRPC リクエスト:
インスタンスの同時実行数が 1 の関数の場合、課金期間はリクエストの開始から終了までです。
インスタンスの同時実行数が 1 より大きい関数の場合、課金期間は最初のリクエストが開始した時点から始まり、最後のリクエストが終了した時点で終わります。単一インスタンス上の同時リクエストの重複期間は一度しか課金されません。
次の図に示すように、インスタンスの同時実行数は 2 に設定されています。最初のリクエストは T1 に到着し、T3 で終了します。2 番目のリクエストは T2 に到着し、T4 で終了します。合計の課金期間は T1 から T4 までです。T2 から T3 までの重複期間は一度しか課金されません。
クライアントストリーミング、サーバーストリーミング、および双方向ストリーミングリクエスト:課金期間は、最初の gRPC 接続が確立された時点から始まり、最後の gRPC 接続が閉じられた時点で終わります。
前提条件
操作手順
次のコマンドを実行して、プロジェクトを初期化します。
sudo s init fc-custom-golang-grpc -d fc-custom-golang-grpc次のコマンドを実行して、
fc-custom-golang-grpcプロジェクトディレクトリに移動します。cd fc-custom-golang-grpc現在のプロジェクトディレクトリで、s.yaml ファイルを編集します。
以下はサンプルです:
edition: 3.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 # アクセス認証情報エイリアス。実際の要件に基づいて変更してください。 resources: helloworld: # サービスまたはモジュールの名前。 component: fc3 actions: # 実行ロジックをカスタマイズします。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/targetsudo s deploy -yを実行して関数をデプロイします。コマンドが完了すると、関数は Function Compute にデプロイされます。Function Compute はその後、テストに使用できるパブリック URL を生成します。
次のコマンドを実行して、gRPC クライアントの依存関係をインストールします。
go mod vendor関数にカスタムドメイン名をバインドします。詳細については、「カスタムドメイン名の設定」をご参照ください。
次のコマンドを実行して gRPC クライアントを呼び出し、gRPC リクエストを送信して、関数が期待どおりに動作することを確認します。
コマンドを実行する前に、
${your-custom-domain}をご利用のカスタムドメイン名に置き換えてください。go run ./greeter_client -addr ${your-custom-domain}:8089
その他の例
カスタムランタイム
カスタムコンテナ
よくある質問
関数のエラー
クライアントが 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 というエラーで失敗します。たとえば、Go で次のサンプルコードを使用できます:
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 に設定すると検証を強制できます。