Firebase FunctionsにPubSubイベントを追加したらデプロイが通らなくなった

2 min read読了の目安(約1900字

Cloud Functions for Firebase で、今までHTTPイベントをデプロイできていたのにPubSubイベントを追加した途端 Functions did not deploy properly. と言われるようになってしまった

TL; DR

Cloud Scheduler にアクセスして手動でPubSubジョブを作ると直る、以降のデプロイも落ちなくなる

調査

PubSubイベントを含め一見すべて成功していて、何度リトライしてもエラーになる

Functions deploy had errors with the following functions:
	<PubSub関数名>(us-central1)

とあるのでPubSubになにか問題がありそう

よくわからないので verbose した

$ firebase deploy --only "functions:<PubSub関数名>" --debug

おせっかいを言うと、ログが結構たくさん出るので

$ firebase deploy --only "functions:<PubSub関数名>" --debug >> ~/Desktop/debug.log

とかするとファイルになって便利

ログを error で検索すると、

{
  "error": {
    "code": 404,
    "message": "The project <firebase-project> does not contain an App Engine application. Please visit https://console.developers.google.com/appengine?project=<firebase-project> to to add an App Engine application.",
    "status": "NOT_FOUND",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.Help",
        "links": [
          {
            "description": "Create App Engine application",
            "url": "https://console.developers.google.com/appengine?project=<firebase-project>"
          }
        ]
      }
    ]
  }
}

こんなレスポンスが見つかった
過去に同じような構成で作ったプロジェクトがあったが、そっちにも App Engine インスタンスは作られていないし firebase-tools のバグかな?と思ったが、たしかに指定した時刻になっても関数が動かない
そこで試しに Cloud Functions から実行すると動いた

💡

Cloud Scheduler から手動でPubSubジョブを作ってみる

Firebaseによって作られるPubSubは名前・トピックともに firebase-schedule-<PubSub関数名>-us-central1 という形式になる
たぶんペイロードはなんでもいいので自分はペイロードにもこれを入力した (たぶん hoge でも動く)
タイムゾーンと頻度はソースコードに記述したものと揃える

指定時刻に動くようになり、以降のデプロイもエラーを吐かなくなった

たぶん

Cloud Scheduler は App Engine の管轄 (APIとサービス 的な意味で) なので、そのへんのアレで App Engine のエラーが出てたんだろう
以前はこんなことしなくても初回からデプロイできてたと思うんだが、たまにGCPが勘違いしちゃうのかもしれない