https://github.com/yagrush/docker-td-agent-syslog-to-s3
↑成果物は、こちらへどうぞ!
実現したかったこと
syslogをS3に勝手に保存してくれる環境を、簡単に量産できるようにしたい!
作ったもの概要
ポート514にsyslogを送ると S3にgzipで1時間毎に保存してくれるDockerコンテナが、すぐ作れます。
(実際は、Dockerコンテナの中で td-agent が常駐しています)
必要なもの
syslogを保存するS3バケット
S3バケットにアクセス権限を持つIAMユーザー
docker
, docker-compose
が入ったEC2インスタンス
Amazon Linux release 2 (Karoo) で動作確認済。
ポート514の受信許可(セキュリティグループの設定)もお忘れなく。
→ 必要でしたら こちら(AWS EC2 AmazonLinux2 のdockerホスト用初期設定)もご参照下さい。
使い方
詳細部分は README.md をご参照頂ければと思いますが、
全体的な流れも含めてざっくり説明しますと…
- S3に、syslogを保存するためのバケットを作成。
- そのバケットに書き込む権限を持つIAMユーザーを作成。
- そのIAMユーザーのアクセスキーとシークレットをダウンロードしておく。
- DockerホストとなるEC2インスタンスを作成。
- そのインスタンスがポート514でsyslogを受信できるようセキュリティグループを設定しておく。
- そのインスタンスにSSHで接続。
-
docker
,docker-compose
をインストールしてセットアップする。 - 本成果物をダウンロードする。(gitとかcurlなどで。)
- 中のディレクトリに
cd
する。 -
.env.template
を.env
にリネーム。 -
.env
を編集する。(S3に接続するための設定を書く。) - (保存間隔やファイル名のカスタムなどは、td-agent.conf をお好みで編集。)
- Dockerイメージをビルドする。
docker-compose build
- イメージからコンテナを起動する。
docker-compose up -d
- 余裕があれば、動作テストなどしておく。
- syslog送信側端末にて、送信先を上記のインスタンスのポート514に設定!
ミソ
1: .env から S3接続設定を拾って Dockerfile 内で(ビルド中に)使う
今回、S3接続設定を td-agent.conf から外出し(.env)したのですが、これができるまで結構ハマりました・・・
外部ファイルから docker-compose.yml 内で値を拾うことは割とすんなりできたのですが、
環境変数として
- docker-compose.yml 内の environment で渡し、
- Dockerfile 内の ENV で拾う
でビルド中に渡そうとしても、どうにもできず・・・
どうやらその方法では、コンテナが起動した後でないと有効にならないそうでした。
(起動後、コンテナ内のシェルに繋いで env
すると、間違いなく設定されてはいるのですが・・・)
で、アンサーはというと
- docker-compose.yml 内の args で渡し、
- Dockerfile 内の ARG で拾う
これで、Dockerfile内で $HOGE_HOGE
で利用可能には、なりました。が・・・
2: td-agent.conf 内で使う
しかーし!
今度は、td-agent.conf 内で環境変数として引用 ${ENV{'HOGE_HOGE'}}
できない・・・
Dockerfile 内でわざわざ ARG → ENV で拾い直してもダメ・・・
どうやら、今回 td-agent を Docker内のサービス(デーモン)として起動する仕組みにした影響っぽく。
工数的限界もあり、ここはゴリ押しで sed
で置換する方法にしました