AWS Elastic BeanstalkでアプリのカスタムログをCloudWatchにも送ろう(ebextensions)

2018-06-08

今回はAWSのElastic Beanstalk(以下、EB)ことを書いてみます。

他の連載でGoogle Cloud Platform(以下、GCP)のことを中心に書いたので、GCPをメインに使う人だと思われるかも知れませんがAWSのヘビーユーザーです。
GCPはGCPの魅力があるので使い分けているところです。

このポストに辿り着いた人はきっとEBを使っている人乃至はEBを知っている人だと思うのでEB自体のことは割愛して本題に入ります。

EBを使ってサービスを展開した時にログをどうするか悩んでいる人結構いると思います。
一応、「EBの設定->ソフトウェア->CloudWatch Logs へのインスタンスログのストリーミング」にログをCloudWatchに送る設定がありますが、EBにあらかじめ定められているLogしか送ってくれません。
これだとアプリから出たError Logとかの取り扱いが出来ないし、EC2のInstanceが何かしらの理由で入れ替わった場合、Logが消えてしまうようになりますよね。
ですのでLogをCloudWatchにも送りましょう。
やり方は「ebextensions」を使って、定義してあげるだけです。

とりあえずやってみよう

「.ebextensions」ディレクトリ作成

アプリのルートに「.ebextensions」ディレクトリを作って下さい。

「custom-log.config」ファイル作成

先ほど作ったディレクトリに「custom-log.config」と言うファイルを作って下さい。

「custom-log.config」ファイルの内容記載

下記のをコピーして貼り付けて下さい。

files:
  "/var/log/[ログファイル名]":
    mode: "000600"
    owner: tomcat
    group: tomcat
    content: "log file created."

  "/etc/awslogs/config/custom_log.conf":
    mode: "000600"
    owner: root
    group: root
    content: |
      [/var/log/[ログファイル名]]
      log_group_name = `{"Fn::Join":["/", ["/aws/elasticbeanstalk", { "Ref":"AWSEBEnvironmentName" }, "var/log/[ログファイル名]"]]}`
      log_stream_name = {instance_id}
      file = /var/log/[ログファイル名]

container_commands:
  01_restart_awslogs:
    command: "sudo service awslogs restart"

[ログファイル名]のところをあなたのアプリのログファイルに合わせて書き換えて下さい。

EBにデプロイ

今回作成したcustom-log.config」ファイルを含めてEBにデプロイして下さい。

お疲れ様でした。

ebextensionsってなに?

EBにEC2 Instanceが生成または更新される時に実行されるもので、いわばEBの設定ファイルを置くところです。
YAMLかJSON形式で拡張子を「.config」にする必要があります。
つまり、この形式であるとファイルの数はいくつあっても構いません。
ファイルが実行される順はファイル名順です。(経験則。裏を取ってないのでどなたかAWS公式ページの説明場所とか分かればコメント下さい。)
詳細はEB公式ページを参照してみて下さい。

「custom-log.config」ファイルの内容説明してよ。

これは3段階になっています。
1. "/var/log/[ログファイル名]":: アプリのカスタムログを貯めるログファイルをあらかじめ生成します。
2. "/etc/awslogs/config/custom_log.conf":: CloudWatchに送るログの在処とCloudWatchでのロググループ(ログを貯めるところ)を指定します。
3. container_commands:: awslogsを再起動して「custom_log.conf」を認識させます。