タイトルが全て
事象
Cloud RunにDockerコンテナをデプロイしたが、gcloud run deploy --allow-unauthenticated
*1 で全公開にしてるにも関わらず /_ah/health
(コンテナ内で動いてるアプリのヘルスチェック用のエンドポイント)を呼ぼうとして401エラーになっていた。
$ curl -s https://xxxxxxxxxxxx.a.run.app/_ah/health <html><head> <meta http-equiv="content-type" content="text/html;charset=utf-8"> <title>401 Unauthorized</title> </head> <body text=#000000 bgcolor=#ffffff> <h1>Error: Unauthorized</h1> <h2>Your client does not have permission to the requested URL <code>/_ah/health</code>.</h2> <h2></h2> </body></html>
原因
別のパスだと呼べたのでおそらくGCP側の仕様。
ググった範囲だとCloud Runの公式ドキュメントにはどこにも書かれていなかったが、Google App Engineだと /_ah/start
や /_ah/warmup
が特別なパスとして予約されていてIAMの権限がないとアクセスできない仕様になっていたので*2、おそらく同じ仕様がCloud Runでも適用されていると思われる。
Dockerizeする前の元のアプリで /_ah/health
が実装済だったのでそれを使っていたのだが、まさか --allow-unauthenticated
が効かないとは思わなかった、、、
公式ドキュメントに書いてないのはハマるのでこの事象はフィードバックで報告しています。