これは「初老丸の独り Advent calendar 2015」の二日目の記事です。
tl;dr
初老丸の独り Advent calendar 2015...略してショロカレの二日目。 引き続き、Elastic Beanstalk を弄る。今回はモニタリングツール Datadog Agent と td-agent をセットアップする。
memo
.ebextensions 以下にファイルを置く
上記のドキュメントを抜粋させていただくと...
- アプリケーションのソースコードに
.ebextensions
を追加することで、環境を設定し、環境に含まれる AWS リソースをカスタマイズできる - 設定ファイルは、ファイル拡張子
.config
で YAML 形式で.ebextensions
フォルダ以下に配置する - 設定ファイルの
option_settings
セクションは、設定オプションの値を定義して Elastic Beanstalk 環境、同環境内の AWS リソース、アプリケーションのソフトウェアを設定することができる resources
セクションでは、アプリケーション環境内のリソースをカスタマイズ、追加の AWS リソースの定義を実行出来る(AWS CloudFormation がサポートするあらゆるリソースを追加および設定できる)- その他のセクション(
packages
、sources
、files
、users
、groups
、commands
、container_commands
、services
)は 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
してしばらくすると以下のように...。
きたきた。
td-agent のセットアップ
引き続き、td-agent をセットアップ。以下を参考にさせていただいて設定を書く。
$ mkdir .ebextensions $ vi .ebextensions/1-td-agent.config
以下のように commands
と files
を利用する。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 を利用すればある程度のインスタンスカスタマイズが出来るのは嬉しいし、設定自体は YAML か JSON で書けるのもお手軽な気がする。(あまり JSON で書かれている例を見てないけど...)とは言え、Elastic Beanstalk 奥深い。
以上。