Function ComputeはHTTPトリガーをサポートしています。 HTTPトリガーが設定されている関数は、gRPCリクエストによってトリガーできます。 このような関数は、gRPC要求を処理して呼び出し元に応答を返すgRPCサーバーとして機能します。 このトピックでは、function ComputeコンソールでgRPCリクエストによって関数を呼び出すHTTPトリガーを設定する方法について説明します。
使用上の注意
呼び出しメソッド
ドメイン名: サブドメイン名
fcapp.ru n
またはカスタムドメイン名を使用して、gRPC関数をトリガーできます。 元のドメイン名fc.aliyuncs.com
を使用してgRPC関数を呼び出すことはできません。説明カスタムドメイン名を使用する場合は、カスタムドメイン名のリクエストパスと関数の間のマッピングを設定する必要があります。 リクエストパスを
/*
に設定することを推奨します。 これにより、すべてのgRPCリクエストを対応するgRPC関数に転送できます。 gRPC関数は、クライアントによって定義されたgRPCメソッドに要求をルーティングします。ポート: gRPCリクエストのポートが
8089
です。
伝送セキュリティ
gRPCリクエストのセキュリティを確保するために、Function Computeのオンライン環境は、Transport Layer security (TLS) プロトコルを使用するクライアントのみをサポートしています。 別のプロトコルのクライアントを使用する場合、エラー
rpc error: code = Unavailable desc = connection closed before server prefaces received
が報告されます。カスタムドメイン名は、カスタムHTTPS証明書を使用できます。 TLS証明書の検証は、gRPCサーバーで設定する必要はありません。 TLS証明書の検証は、Function Computeゲートウェイレイヤーで実行されます。
リクエストタイムアウト制御
gRPCリクエストの最大タイムアウト期間は、関数の [実行タイムアウト期間] の値を超えることはできません。 デフォルトでは、[実行タイムアウト期間] の値は60秒です。 最大値は86,400秒です。
同時実行制御の要求
gRPCリクエストは、Function Computeの同時実行設定に基づいて同時に処理できます。 gRPCリクエストは同時実行クォータを消費します。 gRPCプロトコルはHTTP/2に基づいています。 Function Computeでは、関数インスタンスに割り当てられたgRPCリクエストは同じHTTP/2接続を再利用します。 このHTTP/2接続上の同時ストリームの数は、インスタンスの同時実行性です。 関数のインスタンス同時実行性を設定して、インスタンスごとの最大同時リクエストを制御できます。 詳細については、「インスタンス同時実行の設定」をご参照ください。
負荷分散
Function Computeは、負荷分散のためにgRPCリクエストをさまざまなインスタンスに分散できます。
課金方法
gRPCリクエストは、次のタイプに分類されます。
一般的なgRPCリクエスト
クライアント側のストリーミング要求
サーバー側のストリーミング要求
双方向ストリーミング要求
次の項目は、さまざまなタイプのリクエストの課金方法を示しています。
一般的なgRPCリクエスト: 課金方法はHTTPリクエストと同じです。
インスタンスの同時実行性が1の関数の場合、課金はgRPC接続が確立された時点で開始され、gRPC接続が終了した時点で終了します。
インスタンスの同時実行性が1を超える関数の場合、課金は最初のgRPC接続が確立された時点で開始され、最後のgRPC接続が終了した時点で終了します。 ある期間内に複数の接続が存在する場合、システムはその期間に対する課金を1回だけ実施する。
次の図は、インスタンスの同時実行性が2の関数の課金例を示しています。 第1の要求はT1に到着し、T3で終了する。 第2の要求はT2に到着し、T4で終了する。 課金はT1からT4に始まります。 T2からT3までの期間は1回だけ請求されます。
クライアント側ストリーミングリクエスト、サーバー側ストリーミングリクエスト、および双方向ストリーミングリクエスト: インスタンスの課金は、最初のgRPC接続が確立された時点で開始され、最後のgRPC接続が終了した時点で終了します。
準備
gRPC関数コードの準備
独自のコードを記述するか、s init fc-custom-golang-grpc
を実行してServerless Devsをインストールして構成し、Function ComputeでgRPCサービスを実行するGolangサンプルコードの完全なセットをダウンロードします。 次のサンプルコードは、完全なコード構造を示しています。 . /greeter_client
ディレクトリには、クライアント側のコードと. /コード
ディレクトリには、サーバー側のコードが格納されます。
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
郵便番号パッケージの準備
fc-custom-golang-grpc
プロジェクトディレクトリで、make deploy
を実行します。 バイナリファイルブートストラップ
で生成されます。. /コード
ディレクトリに格納され、bootstrap.zip
.
依存関係のインストール
fc-custom-golang-grpc
プロジェクトディレクトリでgo mod vendor
を実行し、gRPCクライアントの実行に必要な依存関係をインストールします。
Function Computeコンソールを使用して関数をデプロイする
前提条件
サービスが作成されていること。 詳しくは、「サービスの作成」をご参照ください。
手順
Function Computeコンソールにログインします。 左側のナビゲーションウィンドウで、[サービスと機能] をクリックします。
上部のナビゲーションバーで、リージョンを選択します。 [サービス] ページで、目的のサービスをクリックします。
関数ページで、関数の作成をクリックします。
関数の作成ページで、カスタムランタイムの使用を選択し、パラメーターを設定し、作成をクリックします。
説明に従って、次のパラメーターを設定します。 他のパラメーターのデフォルト値を保持します。 詳細については、「関数の作成」をご参照ください。
関数名: 関数の名前を入力します。たとえば、grpc-demoです。
ハンドラータイプ: [HTTPハンドラー] を選択します。
ランタイム: [Debian 9] を選択します。
コードのアップロード方法: [ZIPのアップロード] を選択します。
コードパッケージ: パッケージ化された
bootstrap.zip
ファイルを選択してアップロードします。Startupコマンド: デフォルトでは、このパラメーターを指定しないと、
. /ブートストラップ
は実行されます。リスニングポート: リスニングポートは、サーバーがリスニングするポートと同じです。 この例では、値は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 specifies the key information required by the current application. # For more information about how to configure keys, visit https://www.serverless-devs.com/serverless-devs/command/config. # For more information about the sequence in which keys are used, visit https://www.serverless-devs.com/serverless-devs/tool#. access: "default" vars: # Global variables region: "cn-hangzhou" # The region where you want to deploy the function service: name: "grpc-demo" # The name of the service to which the function you want to deploy belongs. description: 'hello world by serverless devs' internetAccess: true services: helloworld: # The name of the service or module that you define # If you want to perform operations only on the helloworld module, you can add helloworld to the command line. For example, s helloworld build specifies that only the helloworld module is built. # If helloworld is not contained in the command line and s build is run, Serverless Devs builds all the business modules that are in the same level with helloworld in the YAML file, such as next-function in the annotation, in a certain order. component: fc actions: # The custom execution logic. For more information about actions, visit https://www.serverless-devs.com/serverless-devs/yaml. pre-deploy: # Run before the deployment. - run: make build path: ./ # - component: fc build --use-docker --dockerfile ./code/Dockerfile # The component to run. The format is component: Component name Command Parameter. You can run the s cli registry search --type Component command to obtain the component list. # - run: docker build xxx # The system command to run, which is similar to a hook. # path: ./src # The path in which you run the system command or hook. # - plugin: myplugin # The plug-in to run. You can run the s cli registry search --type Plugin command to obtain the list of plug-ins. # args: # The parameters of the plug-in. # testKey: testValue # post-deploy: # Run after the deployment. # - component: fc versions publish # The command line to run. props: region: ${vars.region} service: ${vars.service} # logConfig: # project: mypro-dev # logstore: function-log function: name: "golang-grpc" # The name of the function that you want to deploy. 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 # The trigger method of the HTTP trigger. The POST method must be configured. methods: - GET - POST # customDomains: # - domainName: auto # protocol: HTTP,HTTPS # routeConfigs: # - path: /* # serviceName: "grpc-demo" # functionName: "golang-grpc" # certConfig: # certName: certtest # certificate: ./certificate # privateKey: ./privatekey
s 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
例
カスタムランタイム | カスタムコンテナランタイム |
非該当 |
よくある質問
関数エラー
エラーメッセージrpc error: code = Internal desc = server closed The stream without sending trailer
は、gRPCリクエストがFunction Computeサーバーによって異常終了したことを示しています。 このタイプのエラーは関数エラーです。 たとえば、関数がタイムアウトしたり、関数プロセスが予期せず存在したり、メモリ不足 (OOM) エラーが発生したりします。 関数ログでエラーの原因を確認し、エラーのトラブルシューティングを行うことができます。 詳細については、「関数呼び出しログの表示」をご参照ください。
gRPCリクエストに使用されないTLSクライアント
gRPC要求を呼び出すには、TLSクライアントを使用する必要があります。 それ以外の場合、エラーrpc error: code = Internal desc = server closed the stream without sending trailer
が報告されます。 たとえば、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証明書の検証はスキップされます。 InsecureSkipVerifyをfalseに設定した場合、TLS証明書の検証はスキップされません。
詳細情報
Function Computeコンソールとは別に、SDKを使用してトリガーを設定できます。 詳細については、「SDKリファレンス (2021-04-16、推奨) 」をご参照ください。
トリガーを変更または削除するには、「トリガーの管理」をご参照ください。