elastic beanstalkのログをcloud watch logsに飛ばす


基本

ここに基本的なことはまとまってる
ぽちぽちすればストリーミングできることが分かる。
監視対象が足らないことも分かる。
rubyだとこんな感じ。
Image from Gyazo
railsのproduction.logとかの面倒は見てくれないのがわかる。

production.logもストリーミングしたい

fluentdの方法はすぐ出てくるけど、CWLogsでもS3に吐ける(らしい)し、kibanaとかにも出せる(らしい)し、まずはAWSにあるものでやりたいじゃん。

参考

本家
https://github.com/awsdocs/elastic-beanstalk-samples/blob/master/configuration-files/aws-provided/instance-configuration/logs-streamtocloudwatch-linux.config

やりかた

1. ファイル作る

こんなファイル.ebextensionsディレクトリの下に作る。

/etc/awslogs/config/logs.conf を作ってそうなとこと commands: があればOK。

こんなかんじ。

.ebextensions/001my-logs-streamtocloudwatch-linux.config
packages:
  yum:
    awslogs: []

files:
  "/etc/awslogs/config/logs.conf" :
    mode: "000600"
    owner: root
    group: root
    content: |
      [/var/log/app.log]
      log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/log/app.log"]]}`
      log_stream_name = {instance_id}
      file = /var/log/app.log

  "/var/log/app.log" :
    mode: "000666"
    owner: root
    group: root
    content: |
      created by .ebextensions

commands:
  "01":
    command: chkconfig awslogs on
  "02":
    command: service awslogs restart

ついでに、logファイルも作ってます。webappユーザーでは/var/logにファイル作れないので。
たぶん、webappユーザーが書き込めるディレクトリを作ってあげるほうが正しいはず。

2. 狙った場所にログを吐く

Railsならbroadcastとかで吐くと良いんだと思う。

3. デプロイ

eb deploy
自分はコミットしてない修正がeb deployに乗っからないことを知らず、時間を溶かしました。悲しい。

4. 確認

/var/log/awslogs.logapp.logをpublishしてそうな痕跡が見れるかと思います。
実際にcloud watch logsで見れたらおk。

感想

古い記事だと/var/awslogs/config/...みたいなファイルを修正してたり、/etc/awslogs/awslogs.confを上書きしてたりするけど、本家のGithubみると、/etc/awslogs/config/logs.confに書くのが正しいみたい。
でも古い記事も当時の正義だったはずなので、この記事もいつまで正義か分からないです。そのうちポチポチで設定してeb saveで落としてこれる世界が来るはず。はよこい。

というか記事少ないよー