queue.yaml を使用してキューを管理する

queue.yaml ファイルを使用してキューを管理できますが、キュー管理メソッドを混在させると、予期しない結果が生じる可能性があります。このガイドでは、これらの方法を混在させることのリスクと、一般的な構成の問題を解決する方法について説明します。

Cloud Tasks API は、App Engine Task Queue サービスへの独立したインターフェースを提供します。このインターフェースを使用すると、 Google Cloud コンソールまたは Google Cloud CLI を介してキューを管理できます。Cloud Tasks API で作成したキューには App Engine SDK(プラットフォーム固有の API、スタンドアロン ツール、ランタイム ファイルのコレクション)からアクセスできます。また、App Engine SDK で作成したキューには Cloud Tasks API からアクセスできます。

互換性を維持するため、App Engine SDK の構成ファイルである queue.yaml を使用して、Cloud Tasks API のキューを作成して構成できます。ただし、このファイルと Cloud Tasks API を使用してキューを管理すると、このガイドで説明する問題が発生する可能性があります。

始める前に

Cloud Tasks または App Engine を初めて使用する場合は、Cloud Tasks API だけを使用してキューを管理し、queue.yaml の使用は避けてください。Cloud Tasks のキュー管理メソッドを使用すると、キューの作成、更新、削除を行うときの選択肢が増えます。

queue.yaml をすでに利用している場合は、キュー管理メソッドを混在させるリスクを理解している場合に限り、Cloud Tasks のキュー管理メソッドへの切り替えを検討してください。

キュー管理方法を適用する

キュー管理メソッドの混在を防ぐには、キューの作成、更新、削除を行うウェブ アプリまたはコマンドライン ツールを作成します。そのツールが Cloud Tasks のキュー管理メソッドまたは queue.yaml を使用するかどうかは、ユーザーが気にする必要のない実装の詳細です。ツールの使用を強制することで、メソッドの不注意な混在を防ぐことができます。Cloud Tasks キュー管理者 Identity and Access Management(IAM)ロールをツールに付与し、ユーザーに認証を要求します。アクセス管理の詳細については、キュー構成の保護をご覧ください。

キュー構成の遅延

キュー構成の変更は、数分かかることがあります。たとえば、CreateQueue または UpdateQueue を呼び出すと、そのキューの CreateTask が呼び出されるまでに数分かかることがあります。

App Engine default キュー

default という名前の App Engine キューに対しては、App Engine SDK でも Cloud Tasks API でも特殊な処理が行われます。

default キューはいつ作成されますか?

default キューが存在しない場合は、次の状況で作成されます。

  • App Engine SDK を使用して、タスクが最初に default キューに追加されたとき
  • default キューを指定する queue.yaml ファイルがアップロードされたとき
  • default キューを作成する CreateQueue または UpdateQueue が呼び出されたとき
Cloud Tasks にはどのような制限がありますか?

App Engine との互換性を維持するため、Cloud Tasks では default キューに関して次の制限が適用されます。

  • Cloud Tasks API は、default キューまたはその他のキューを自動的に作成しません。
  • default という名前のキューが作成された場合、そのキューは App Engine タスクを使用するキューになります。
  • default キューで GetQueue を呼び出すと、キューがまだ存在しない場合は not found エラーが返されます。
  • default キューは、作成されるまで ListQueues の出力に表示されません。
  • UpdateQueue 呼び出しを使用して default キュー構成を変更できます。
  • 作成した default キューは削除できません。

キュー管理メソッドが混在した場合のリスク

基になるサービスとしては、queue.yaml ファイルは確実な方法です。作成方法に関係なく、プロジェクト内の既存のキューを省略した queue.yaml ファイルをアップロードすると、これらのキューが無効になるか、一時停止されます。たとえば、Cloud Tasks API を使用して CreateQueue または UpdateQueue を呼び出し、それらのキューを省略した queue.yaml ファイルをアップロードすると、キューは無効になります。その後、無効にしたキューを再開する必要があります。

キュー管理メソッドを混在させると、予期しない動作が発生する可能性があります。たとえば、次のシナリオについて考えてみましょう。

シナリオ 1

CreateQueue を呼び出して cloud-tasks-queue という名前のキューを作成し、次の内容を含む queue.yaml ファイルをアップロードします。

queue:
- name: queue-yaml-queue

これにより、キューの状態は次のようになります。

  • cloud-tasks-queue という名前のキューと、それ以前に存在していた他のキューは DISABLED 状態です。
  • queue-yaml-queue という名前のキューが RUNNING 状態になっています。

シナリオ 2

Cloud Tasks API を使用してキューを無効にしたが、後でアップロードされた queue.yaml ファイルに表示された。キューが再開されます。

シナリオ 3

DeleteQueue メソッドでキューを削除すると、後で queue.yaml ファイルに表示されます。削除後、キュー名を数日間再利用できないため、queue.yaml アップロードが失敗することがあります。

監査ログを使用してデバッグする

プロジェクトの管理アクティビティ監査ログを調べると、キューの作成、更新、削除など、キューの設定変更の履歴を確認できます。

たとえば、queue.yaml アップロードによって既存のキューが無効になった場合、次のコマンドを実行すると、com.google.appengine.legacy.queue_updated メソッドを介して Disabled queue QUEUE_NAME ログメッセージが返されます。

gcloud logging read \
  'protoPayload.methodName=
   (com.google.appengine.legacy.queue_created OR
    com.google.appengine.legacy.queue_updated OR
    google.cloud.tasks.v2.CloudTasks.CreateQueue OR
    google.cloud.tasks.v2.CloudTasks.UpdateQueue OR
    google.cloud.tasks.v2.CloudTasks.DeleteQueue)'

詳細については、ログエントリの読み取りをご覧ください。

queue.yaml のアップロードで無効になったキューを再開する

キュー管理メソッドを混在させている場合、queue.yaml ファイルをアップロードすると、Cloud Tasks API で作成されたキューが誤って無効になることがあります。キューを再開するには、キューで ResumeQueue を呼び出すか、queue.yaml に追加してアップロードします。

以前に queue.yaml 構成でカスタム処理 rate を設定していた場合、ResumeQueue を呼び出すとデフォルトの rate にキューがリセットされます。これは ResumeQueue への応答の maxDispatchesPerSecond フィールドに反映されます。

割り当ての問題を解決する

queue.yaml を使用してキューを作成する場合、プロジェクトには作成できるキューの最大数のデフォルトの割り当てがあります。Cloud Tasks API を使用して作成されたキューにもデフォルトの割り当てがあります。他の場合と同様に、queue.yaml と Cloud Tasks API メソッドを混在させると、予期しない結果が生じる可能性があります。

たとえば、queue.yaml を使用してキューを作成し、割り当ての増加を受け取った後に、Cloud Tasks API を使用して追加のキューを作成すると、割り当てエラーが発生する可能性があります。この問題を解決するには、 Google Cloud コンソールを使用して割り当てを管理します。詳細については、コンソールを使用して割り当てを管理するをご覧ください。

次のステップ