BashシェルスクリプトでCloud Loggingへのログ出力をシンプルに実装する方法

Bash,GCP

はじめに

既存のシェルスクリプトから GCPCloud Logging にログ出力させる必要がありました。
時間をかけずに実装できないか考え、 Bashシェルスクリプトでログ出力をシンプルに実現する方法 に多少手を加えて実現できたので紹介します。

検証環境

$ uname -moi
x86_64 MacBookPro16,1 Darwin

$ bash -version | head -n 1
GNU bash, version 5.0.18(1)-release (x86_64-apple-darwin19.5.0)

事前準備(GCP上の設定)

今回は Cloud Run 上でシェルスクリプトを実行させましたが、 Compute EngineGKE 上でも同じ方法で容易に実現できました。

事前に1つだけ必要な設定があります。
サービスアカウントLogging に書き込みを行う権限を設定する必要があります。


Cloud Runのサービスアカウント

Compute Engineのサービスアカウント


上記に記載されている サービスアカウント@ で区切られていて、メールアドレスのようになっています。)をメモし、IAM設定ページから見つけましょう。
見つけたら、そちらのサービスアカウントに Logging 書き込みの権限を付与しておきます。

スクリプトでログを出力

Bashシェルスクリプトでログ出力をシンプルに実現する方法 を事前に一読しておくと良いです。

シェルスクリプト全体の標準出力、標準エラー出力をすべてGCPの Logging に流し込むためには、以下のような記述を行います。

#!/usr/bin/env bash
set -o errexit
set -o nounset

# 標準出力、標準エラー出力をログ送信

# ***こちらはご自分が書き出しを行いたいロギング名に書き換えてください!***
GCP_LOGGING_NAME=YOUR-LOGGING-NAME

exec 1> >(
  while read -r LOG; do
    gcloud logging write "${GCP_LOGGING_NAME}" --payload-type=text --severity=INFO "$LOG"
  done
)
# 標準エラー出力をログ送信
exec 2> >(
  while read -r LOG; do
    gcloud logging write "${GCP_LOGGING_NAME}" --payload-type=text --severity=ERROR "$LOG"
  done
)

# ...(以下省略)...

exec 1> >(...) の中の処理には、スクリプト全体の標準出力が流れて来ます。

exec 2> >(...) の中の処理には、スクリプト全体の標準エラー出力が流れて来ます。

これらを1行ずつ読み込んで gcloud コマンドで Logging に書き込みます。

ここからおわかりと思いますが、 gcloud コマンドがインストールされていることが前提です。「事前準備」でサービスアカウントに正しく設定が行われていれば権限エラーは発生しないはずです。

ひとこと

今回はやや説明が優しくなく申し訳有りません。
時間があったらもう少しわかりやすく手直しします。

Bash,GCP