ドメイン名を関数にバインドすると、gRPC クライアントを介して gRPC リクエストを送信できます。関数は、リクエストを処理し、呼び出し元に結果を返す gRPC サーバーとして機能します。このトピックでは、Golang を使用して Serverless Devs を使用して関数をデプロイし、gRPC リクエストを使用して関数をトリガーする方法を示します。
使用上の注意
呼び出し方法
ドメイン名: サブドメイン
*.<region_id>fcapp.runまたはカスタムドメイン名を使用して gRPC 関数を呼び出すことができます。レガシードメイン名fc.aliyuncs.comは gRPC 関数の呼び出しをサポートしていません。説明カスタムドメイン名を関数にバインドする場合、リクエストパスと関数のマッピング関係を設定する必要があります。リクエストパスを
/*として設定することをお勧めします。これにより、すべての gRPC リクエストが対応する gRPC 関数に転送されます。 gRPC 関数は、クライアントによって定義された gRPC メソッドにリクエストをルーティングします。ポート: gRPC リクエストのポートは
8089です。
トランスポートセキュリティ
gRPC リクエストのセキュリティを確保するため、Function Compute のオンライン環境では、TLS プロトコルを使用するクライアントのみがサポートされています。そうでない場合、リクエストはエラー
rpc error: code = Unavailable desc = connection closed before server preface receivedを返します。カスタムドメイン名は、カスタム HTTPS 証明書をサポートしています。 Function Compute ゲートウェイ層で TLS 検証が実行されるため、gRPC サーバーで TLS 証明書の検証を定義する必要はありません。
リクエストタイムアウト制御
gRPC リクエストの最大タイムアウト期間は、関数の [実行タイムアウト] を超えることはできません。 デフォルトの [実行タイムアウト] は 60 秒で、最大値は 86400 秒です。
リクエストの同時実行制御
gRPC リクエストは、Function Compute の同時実行制御の対象となります。 gRPC リクエストは、同時実行クォータを消費します。 gRPC プロトコルは HTTP/2 に基づいています。 Function Compute では、関数インスタンスの場合、この関数インスタンスに割り当てられた gRPC リクエストは同じ HTTP/2 接続を再利用します。したがって、この HTTP/2 接続での同時フローの数は、インスタンスの同時実行数と同じです。関数インスタンスの同時実行数を設定して、インスタンスごとの最大同時リクエスト数を制御できます。詳細については、「インスタンスの同時実行数を設定する」をご参照ください。
負荷分散
Function Compute は、gRPC リクエストを異なるインスタンスに分散し、gRPC リクエストを自動的に負荷分散することをサポートしています。
課金方法
gRPC リクエストは、次のタイプに分類されます。
一般的な gRPC リクエスト
クライアント側ストリーミングリクエスト
サーバー側ストリーミングリクエスト
双方向ストリーミングリクエスト
Function Compute では、リソース使用量 = 仕様 × 課金対象期間 です。課金対象期間は、以下で説明するように、一般的な gRPC リクエストとストリーミング gRPC リクエストで異なります。
一般的な gRPC リクエスト:
同時実行数が 1 の関数の場合、課金対象期間はリクエストの開始から終了までです。
同時実行数が 1 より大きい関数の場合、課金対象期間は最初のリクエストの開始から最後のリクエストの終了までです。インスタンスが複数のリクエストを同時に処理する場合、繰り返し課金されることはありません。
次の図に示すように、関数の同時実行数は 2 です。最初のリクエストは T1 に到着し、T3 に終了します。 2 番目のリクエストは T2 に到着し、T4 に終了します。課金対象期間は T1 から T4 までです。 T2 から T3 までの期間は 1 回だけ課金され、繰り返し課金されることはありません。
クライアント側ストリーミング、サーバー側ストリーミング、および双方向ストリーミングリクエスト: 課金対象期間は、最初の 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: # カスタム実行ロジック。アクションの詳細については、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/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
その他の例
カスタムランタイム | カスタムコンテナー |
なし |
FAQ
関数のエラー
クライアントが 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 の値は、true に設定して TLS 証明書の検証をスキップするか、false に設定して TLS 証明書の検証をスキップしないようにすることができます。