スケーリング動作の制御

Cloud Functions の最大インスタンス数は、関数が受信リクエストに応じてどの程度スケーリングされるかを制限する機能です。

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

これは一般的には望ましい動作ですが、場合によっては、同時に存在しうるインスタンスの総数を制限したいことがあります。たとえば、関数が同時接続数に制限のあるデータベースを処理する場合です。

最大インスタンス数を使用する

個別の関数に対する最大インスタンス数をデプロイ時に設定できます。関数ごとに最大インスタンス数を設定できます。関数は互いに独立してスケーリングされます。

最大インスタンス数の制限を設定する

gcloud コマンドライン ツールを使用して最大インスタンス数の上限を設定するには、デプロイ時に --max-instances フラグを使用します。

gcloud functions deploy FUNCTION_NAME --max-instances 10 FLAGS...

上の例で、FLAGS... は関数のデプロイ時に渡す他のオプションです。deploy コマンドの詳細については、gcloud functions deploy をご覧ください。

また、Cloud Console で関数を作成するときに、インスタンスの最大数を設定できます。手順は次のとおりです。

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

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

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

  4. [詳細] をクリックして詳細設定を表示します。

  5. [関数インスタンスの最大数] セクションに、希望の値を入力します。

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

関数の制限をクリアするには、デプロイ時に --clear-max-instances フラグを使用します。

gcloud functions deploy FUNCTION_NAME --clear-max-instances

Cloud Console で最大インスタンス数の上限をクリアすることもできます。

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

  2. 既存の関数をクリックして、その詳細ページに移動します。

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

  4. [詳細] をクリックして詳細設定を表示します。

  5. [関数インスタンスの最大数] セクションで、「0」を入力するか、フィールドを空白にします。

制限とおすすめの方法

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

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

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

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

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

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

このような場合、Cloud Functions は最大 30 秒間新しい受信リクエストを処理しようとします。

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

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

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

また、最大インスタンス数の上限を設定すると、Cloud Functions がトラフィックの需要に対応するためのスケーリング戦略に影響する場合があります。一般に、Cloud Functions は指定された上限を優先的に使用するため、この上限を上回ることはありません。

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

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

デプロイ

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

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

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

このため、新しいバージョンのデプロイ後、この関数は一時的に最大で 10 個のインスタンスを使用できる可能性があります。前の関数のインスタンスが終了するまでの時間は、アクティブなリクエストの処理が完了するまでの時間によって異なります。インスタンス数に適切な上限を選択する際に、この点を考慮する必要があります。

インスタンスをアイドル状態にしてコールド スタートを最小限に抑える

コールド スタートの影響を最小限に抑えるために、Cloud Functions は多くの場合、関数のインスタンスをアイドル状態で予約しておきます。このようなインスタンスは、トラフィックが急増した場合にすぐリクエストを処理できます。

たとえば、インスタンスがリクエストの処理を終了したとき、受信リクエストの処理に備えて一定期間アイドル状態のままになることがあります。アイドル状態のインスタンスは、別のリクエストの処理に備えてオープン中のデータベース接続などのリソースを残すことがあります。これらのインスタンスは、関数の特定のバージョンの最大インスタンス数の上限にカウントされます。アイドル状態のインスタンスに対して料金は発生しません。

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

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