ようへいの日々精進XP

よかろうもん

(ショロカレ 2 日目)Elastic Beanstalk に Datadog Agent と td-agent をセットアップする

これは「初老丸の独り Advent calendar 2015」の二日目の記事です。

tl;dr

初老丸の独り Advent calendar 2015...略してショロカレの二日目。 引き続き、Elastic Beanstalk を弄る。今回はモニタリングツール Datadog Agent と td-agent をセットアップする。


memo

.ebextensions 以下にファイルを置く

docs.aws.amazon.com

上記のドキュメントを抜粋させていただくと...

  • アプリケーションのソースコード.ebextensions を追加することで、環境を設定し、環境に含まれる AWS リソースをカスタマイズできる
  • 設定ファイルは、ファイル拡張子 .configYAML 形式で .ebextensions フォルダ以下に配置する
  • 設定ファイルの option_settings セクションは、設定オプションの値を定義して Elastic Beanstalk 環境、同環境内の AWS リソース、アプリケーションのソフトウェアを設定することができる
  • resources セクションでは、アプリケーション環境内のリソースをカスタマイズ、追加の AWS リソースの定義を実行出来る(AWS CloudFormation がサポートするあらゆるリソースを追加および設定できる)
  • その他のセクション(packagessourcesfilesusersgroupscommandscontainer_commandsservices)は EC2 インスタンスでサービス起動等を定義する
  • 1 つの設定ファイルに、複数のセクションを含めるか設定を複数のファイルに分割することもできる、設定ファイルはアルファベット順に処理される(優先順位についてはこちらを)

少しわかりづらいのでサンプルを...

option_settings は以下のように EC2 インスタンス内の環境変数を定義することできる。

option_settings:
  - option_name: DD_API_KEY
    value: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

その他、commands では実際にインスタンス内で実行するコマンドを指定することができる。

commands:
  foo: 
    command: echo "foo"
    cwd: /tmp

ってな感じ。

Datadog Agent のセットアップ

ということで、.ebextensions ディレクトリを用意して設定ファイルを書く。

$ mkdir .ebextensions
$ vi .ebextensions/0-datadog.config

以下のように commands を利用する。

commands:
  datadog install:
    command: bash -c "$(curl -L https://raw.githubusercontent.com/DataDog/dd-agent/master/packaging/datadog-agent/source/install_agent.sh)"
    cwd: /opt
    env:
      DD_API_KEY: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx

上記の例では DD_API_KEY を含めているので git リポジトリへ push する際には注意が必要。例えば、以下のように外に晒せない環境変数などは別の設定ファイルに外だししておいて .gitignore に登録しておくのが良いかもしれない。

$ mkdir .ebextensions
$ cat .ebextensions/0-options.config
option_settings:
  - option_name: DD_API_KEY
    value: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
$ cat .gitignore
vendor/*
.bundle
# Elastic Beanstalk Files
.elasticbeanstalk/*
!.elasticbeanstalk/*.cfg.yml
!.elasticbeanstalk/*.global.yml
.ebextensions/0-options.config

ということで eb deploy してしばらくすると以下のように...。

f:id:inokara:20151202003528p:plain

きたきた。

td-agent のセットアップ

引き続き、td-agent をセットアップ。以下を参考にさせていただいて設定を書く。

github.com

$ mkdir .ebextensions
$ vi .ebextensions/1-td-agent.config

以下のように commandsfiles を利用する。td-agent の設定は YAML のヒアドキュメントを利用してざくっと記載できるのが嬉しい。

commands:
  01-command:
      command: mkdir -p /etc/td-agent/conf.d

files:
  "/etc/td-agent/td-agent.conf":
    owner: root
    group: root
    content: |
      include conf.d/*.conf
  "/etc/td-agent/conf.d/forword.conf":
    owner: root
    group: root
    content: |
      <source>
        type forward
        port 24224
        bind 0.0.0.0
      </source>
  "/etc/td-agent/conf.d/nginx.conf":
    owner: root
    group: root
    content: |
      <source>
        type tail
        path /var/log/nginx/access.log
        pos_file /var/log/td-agent/nginx-access.pos
        tag worker.nginx
        format nginx
      </source>
  "/etc/td-agent/conf.d/app.conf":
   owner: root
    group: root
    content: |
      <source>
        type tail
        path /tmp/sinatra.log
        pos_file /var/log/td-agent/sinatra.log.pos
        tag worker.app
        format /(?<short_level>[^ ]*) \[(?<time>[^\]]*)\] [^ ]* (?<level>[^ ]*) (?<separate_1>[^ ]*) (?<separate_2>[^ ]*) (?<message>[^ ]*)/
      </source>
  "/etc/td-agent/conf.d/stdout.conf":
    owner: root
    group: root
    content: |
      <match *.*>
        type stdout
      </match>

commands:
  01-command:
      command: echo 'Defaults:root    !requiretty' >> /etc/sudoers

  02-command:
      command: curl -L https://td-toolbelt.herokuapp.com/sh/install-redhat-td-agent2.sh | sh

  03-command:
      command: /etc/init.d/td-agent restart

設定 YAML ファイルが縦に長くなるようであればファイルを分割も検討する。

デプロイ後、しばらくするとインスタンス上で以下のようにログが出力されている。

$ tail -f /var/log/td-agent/td-agent.log
2015-12-01 15:10:57 +0000 [info]: listening fluent socket on 0.0.0.0:24224
2015-12-01 15:10:57 +0000 [info]: following tail of /var/log/nginx/access.log
2015-12-01 15:16:39 +0000 worker.app: {"short_level":"I,","level":"INFO","separate_1":"--","separate_2":":","message":"Test"}
2015-12-01 15:16:39 +0000 worker.nginx: {"remote":"127.0.0.1","host":"-","user":"-","method":"POST","path":"/","code":"200","size":"0","referer":"-","agent":"curl/7.40.0"}
2015-12-01 15:19:59 +0000 worker.app: {"short_level":"I,","level":"INFO","separate_1":"--","separate_2":":","message":"Test"}
2015-12-01 15:19:59 +0000 worker.nginx: {"remote":"127.0.0.1","host":"-","user":"-","method":"POST","path":"/","code":"200","size":"0","referer":"-","agent":"aws-sqsd/2.0"}
2015-12-01 15:24:59 +0000 worker.app: {"short_level":"I,","level":"INFO","separate_1":"--","separate_2":":","message":"Test"}
2015-12-01 15:24:59 +0000 worker.nginx: {"remote":"127.0.0.1","host":"-","user":"-","method":"POST","path":"/","code":"200","size":"0","referer":"-","agent":"aws-sqsd/2.0"}
2015-12-01 15:29:59 +0000 worker.app: {"short_level":"I,","level":"INFO","separate_1":"--","separate_2":":","message":"Test"}
2015-12-01 15:29:59 +0000 worker.nginx: {"remote":"127.0.0.1","host":"-","user":"-","method":"POST","path":"/","code":"200","size":"0","referer":"-","agent":"aws-sqsd/2.0"}

ということで

Elastic Beanstalk でも .ebextensions を利用すればある程度のインスタンスカスタマイズが出来るのは嬉しいし、設定自体は YAMLJSON で書けるのもお手軽な気がする。(あまり JSON で書かれている例を見てないけど...)とは言え、Elastic Beanstalk 奥深い。

以上。