Google Cloud Functionsのログ出力(とハマったこと)


やりたいこと

やったこと

  • google-cloud-loggingを使う
    • requirements.txtに google-cloud-logging==1.14.0 を追記
# Imports the Google Cloud client library
import logging
from google.cloud import logging as glogging

client = glogging.Client(project=os.environ['PROJECT_ID'])
handler = client.get_default_handler()
cloud_logger = logging.getLogger('cloudLogger')
cloud_logger.setLevel(logging.INFO)
cloud_logger.addHandler(handler)

def test_method(request):

  print('== start ==')

  try:
    cloud_logger.info('Info Message')
    cloud_logger.warn('Warn Message')
    raise Exception
  except Exception:
    cloud_logger.error('Error Message')
    raise Exception

  print('== finish ==')

実行、しかしログが出ない

  • なんにも出ない。

原因(想像)

  • print にしても結果は変わらず・・・
  • どうやらGoogle Cloud Functionsはcrash(=異常終了)するとそこまでのログを出力してくれない
    • ドキュメントのどこかに記述があるのだろうか・・・・
  • なのでExceptionが出たらcatchして最終的に sys.exit() するように変更
import sys
# 中略
  try:
    cloud_logger.info('Info Message')
    cloud_logger.warn('Warn Message')
    raise Exception
  except Exception:
    cloud_logger.error('Error Message')
    sys.exit()

  print('== finish ==')

再実行、そしてエラー

  • Failed to submit 3 logs.
  • google.api_core.exceptions.PermissionDenied: 403 The caller does not have permission

とな

Google Cloud Functionsのサービスアカウント

  • ドキュメントを見るとGoogle Cloud Functionsのデフォルトサービスアカウントは [email protected] (App Engine default service account)になると記載がある。どうやらプロジェクト編集者のロールを持っているらしい。
  • 自分の環境を見ると・・・・ない!
    • なぜか無くなっていた模様

解決策

  • 専用のSAを作成してGoogle Cloud Functionsへ紐付け。
  • ちゃんとログが出るようになりました
    • エラーレベルがinfoとerrorしかないのはなぜだろう・・・

振り返り

  • ドキュメントはちゃんと読もう
    • 書いてなかったかもしれないけど
  • 横着してデフォルトのSAを使わず、ちゃんと必要な権限をもったSAを作成して利用しよう
  • Cloud Functionsは落とさない。正常終了させる
  • 稼働状況をモニタリングするならerror件数ではなくログのerrorメッセージ数を見る(しかないのだろうか・・・?)