最大インスタンス数を構成する

Cloud Functions インスタンスの最大数を設定することで、関数のスケーリング動作を制御できます。 最大インスタンス数を設定すると、コストが制御され、ダウンストリーム リソースがトラフィックに圧倒されるのを防ぐことができます。

Cloud Functions では、関数の新しいインスタンスを作成してスケーリングを行います。各インスタンスは一度に 1 つのリクエストしか処理できないため、リクエスト量が急増すると多数のインスタンスが作成される可能性があります。

自動スケーリングはほとんどの場合有益ですが、場合によっては、ある時点で存在できるインスタンスの総数を制限する必要があります。たとえば、関数が同時接続数に制限のあるデータベースを処理する場合です。

最大インスタンス数の上限の設定とクリア

デプロイ時に、関数のインスタンスの最大数を設定できます。関数ごとに独自の最大インスタンスを設定できます。関数は互いに独立してスケールされます。

最大インスタンス数の上限の設定

最大インスタンス数の上限を設定するには、Google Cloud CLI または Google Cloud コンソールを使用します。

コンソール

新しい関数に最大インスタンス数の上限を設定するには:

  1. Cloud Functions の概要ページに移動します。

  2. [関数の作成] をクリックします。

  3. 関数の必須フィールドを入力します。

  4. ページの最後にある [ランタイム、ビルド...] セクションを開き、[ランタイム] タブをクリックします。

  5. [自動スケーリング] セクションの [インスタンスの最大数] フィールドに、目的の値を入力するか、提案されたデフォルト値を使用します。

gcloud

最大インスタンス数の上限を設定するには、--max-instances フラグを指定して deploy コマンドを実行します。

gcloud functions deploy FUNCTION_NAME --max-instances MAX_INSTANCE_LIMIT

次のように置き換えます。

  • FUNCTION_NAME: 関数名。

  • MAX_INSTANCE_LIMIT: 最大インスタンス上限として設定する数値。例: 3000。

最大インスタンス数の上限が設定されます。

最大インスタンス数の上限のクリア

最大インスタンス数の上限をクリアするには、gcloud コマンドライン ツールまたは Google Cloud コンソールを使用します。

コンソール

最大インスタンス数の上限をクリアするには:

  1. Cloud Functions の概要ページに移動します。

  2. 既存の関数をクリックして、その詳細ページに移動します。関数の現在の最大インスタンス数の制限は、[詳細] タブで確認できます。

  3. [編集] をクリックします。

  4. ページの最後にある [ランタイム、ビルド...] セクションを開き、[ランタイム] タブをクリックします。

  5. [自動スケーリング] セクションの [インスタンスの最大数] フィールドに「0」と入力します。

gcloud

最大インスタンス数の上限をクリアするには、--clear-max-instances フラグを指定して deploy コマンドを実行します。

gcloud functions deploy FUNCTION_NAME --clear-max-instances

最大インスタンス数の上限がクリアされます。

上限とベスト プラクティス

このセクションでは、最大インスタンス数を使用するためのガイドラインを説明します。

過剰なスケールアップから保護する

--max-instances の上限を指定しない場合、Cloud Functions はスループットの制限よりも需要を満たすためのスケールアップを優先するように設計されています。つまり、この上限を構成していないと、関数の同時インスタンス数は無制限になる場合があります。

スループットの制約のあるサービス、またはスケーラビリティの低いダウンストリーム サービスにリクエストを送信する関数には、--max-instances の上限を割り当てることをおすすめします。最大インスタンス上限は、システム全体の安定性を高め、リクエスト レベルが異常に高くなるのを防止するのに役立ちます。

すべてのインスタンスがビジー状態の場合のリクエストの処理

通常の状況では、関数は、受信トラフィックの負荷を処理するために新しいインスタンスを作成してスケールアップします。ただし、最大インスタンス数の上限を設定した場合、受信トラフィックの負荷を処理できるインスタンス数を確保できないことがあります。

その場合、Cloud Functions は最大 30 秒間、新しい受信リクエストの処理を試みます。

  • インスタンスがこの期間内にリクエストの処理を完了した場合、新しい受信リクエストの処理を開始します。
  • 使用可能なインスタンスがなくなると、リクエストは失敗します。

Cloud Functions のスケーリング能力を超える最大インスタンス数の上限

最大インスタンス数を制限するということは、その上限を指定するということです。上限を大きく設定しても、指定した数だけインスタンスがスケールアップされるわけではありません。これは、任意の時点で共存するインスタンス数が上限を超えないようにするための制限です。

また、最大インスタンス上限を設定すると、Cloud Functions がトラフィックの需要に対応するためのスケーリング戦略に影響する場合があります。一般に、Cloud Functions はスケールアップよりも指定された上限を優先しますが、この上限を上回る可能性はあります。

トラフィックの急増への対応

トラフィックが急増した場合など、Cloud Functions が、指定された最大インスタンス数の上限よりも多いインスタンスを一時的に作成する場合があります。関数がこの一時的な動作に対応できない場合は、安全マージンをとり、関数が対応できるインスタンス数よりも少ない最大インスタンス数を設定することをおすすめします。

デプロイ

関数の新しいバージョンをデプロイすると、Cloud Functions は古いバージョンから新しいバージョンにトラフィックを移行します。最大インスタンス数の上限は、関数のバージョンごとに設定されるため、デプロイ後、一時的に指定された上限を超えることがあります。

たとえば、関数の最大インスタンス数の上限が 5 に設定されているとします。通常、この関数はリクエストを処理する際に最大で 5 つのインスタンスを使用します。 関数の新しいバージョンをデプロイすると、新しいバージョンのインスタンスの上限は 5 になります。

関数の新しいバージョンがデプロイされるときに、関数の前のバージョンですでに処理中のリクエストの数は考慮されません。これらのリクエストは引き続き処理されます。新しい受信リクエストは、新たにデプロイされた関数のバージョンで処理されます。

したがって、前の例の関数では、新しいバージョンをデプロイした後に、インスタンス数の合計が最大 10 個(関数のバージョンごとに 5 つ)になる場合があります。前の関数のインスタンスが終了するまでの時間は、アクティブなリクエストの処理が完了するまでの時間によって異なります。インスタンス数に適切な上限を選択する際に、この点を考慮する必要があります。

最大インスタンス上限のクリア

最大インスタンス数を 0 に設定すると、既存の最大インスタンス上限がクリアされます。0 値を設定しても関数を一時停止しません。