オンプレミス(on-premises)環境のfluentdからStackdriver Loggingにログを送る

fluent-plugin-google-cloudを利用して、オンプレミス環境からStackdriver Loggingにログ送信する際に少しはまったので、本記事にまとめます。

背景

Googleの公式ドキュメントでは、こちらに記載があるように、BindPlane agentを利用する方法と、Loggigng APIをアプリケーションから直接指定する方法が提示されています。

BindPlaneを一言で表すと、オンプレ/クラウド環境のメトリクスとログを一元管理するクラウドサービスです。BindPlaneのGUI画面から、収集対象の環境/製品にあったBindPlaneエージェントを選び収集対象にインストールすることで、ログを収集することができます。しかも、2020年3月時点で送信先がGCPの場合は無料(GCPの利用料のみ)です。

BindPlaneを利用すると、非常に簡単にオンプレミス環境からStackdriver Loggingにログ送信できますが、BindPlaneにロックインされてしまいます。fluentdを利用すると、保存先をプラガブルに設定でき、BindPlaneにロックインされないため、万が一、改悪された場合にも柔軟に対応できます。そのため、fluentdネイティブで、Stackdriver Loggingに送信できる方法を調べていました。

fluent-plugin-google-cloudを利用すると、オンプレミス環境からネイティブなfluentdを利用して、Stackdriver Loggingにログを送信できました。設定方法を以降に記述します。

設定方法

前提

 ・fluentdとfluent-plugin-google-cloudがインストールされていること

設定手順

(1) ログ収集対象サーバにGOOGLE_APPLICATIONクレデンシャル設定します。

こちらに記載の手順で、サービスアカウントを作成し、ログ収集対象に秘密鍵の配置を行います。

Stackdriver Loggingだけの利用の場合は、”ログ書き込み”の権限だけ付与します。

サービスアカウントの秘密鍵(json)をダウンロードし、ログ収集対象のドキュメント記載のパスに配置します。(Linuxの場合は、/etc/google/auth/application_default_credentials.json)

(2) READMEに記載のあるmatchディレクティブに、project_id, vm_id, zoneを記載します。

<match **>
  @type google_cloud
  project_id XXX
  vm_id my-machine-name
  zone asia-northeast1-a
</match>

上記設定をすることで、オンプレミス環境のfluentdからStackdriver Loggingにログを送信することができるようになりました。GCEインスタンスとして(※1)、ログを確認することができます。

※1 fluent-plugin-google-cloudは、公式にはGCPとAWS環境のみサポートしています。詳細はこちらのissueを参照してください。

あとがき

設定は非常にシンプルなのですが、非公式ゆえにissueを漁らないと、オンプレミス環境からログを送信できませんでした。

現在、オープンになっているこのissueに記載されているように、”GCEインスタンス”としてログが収集されてしまいます。”汎用ノード”として収集できるようになれば良いですね。BindPlaneのログは、汎用ノードとして収集されるようです。