Elastic Beanstalk single containerな環境でのログ問題
引っ越ししたことでメンタルが回復してきたtkscotteです。
Elastic Beanstalk worker tierを最近試す機会があり、そこでちょっとつまづいたところがあったのでとりあえず 雑に 記す。
(何かあっても責任取れないので使うときは注意してね。)
環境
Elastic Beanstalk Worker Tier (single container / docker 17.06.2)
docker container はECR内の docker image で生成
問題点
- docker container内で生成したアプリケーションログ(独自のやつ)がそのままだと出てこない
-> AWSのコンソールからは設定できない
- containerのstdoutがjson形式のlogとして溜まり続ける(ローテーションしてくれない)
-> これが一番ヤバい(INFOログをめちゃくちゃ吐くアプリケーションの場合、最悪1週間くらいでディスクフルになるかも)
解決法まとめ
- docker host の /var/log/fugafuga を docker container の /var/log/hogehoge にマウントする
- docker host にawslogsを入れる
- .ebextensionsでよしなに docker host の /opt/elasticbeanstalk/hooks/appdeploy/enact/00.run を上書きする
実践例
docker host の /var/log/fugafuga を docker container の /var/log/hogehoge にマウントする
Dockerrun.aws.jsonの中に "Volumes" の項目があるので、そこに設定を入れる
{ "AWSEBDockerrunVersion": "1", "Image": { "Name": "AWSアカウントID.dkr.ecr.ap-northeast-1.amazonaws.com/リポジトリ名:latest", "Update": "true" }, "Volumes": [ { "HostDirectory": "/var/log/hogehoge", "ContainerDirectory": "/var/log/fugafuga" } ] }
docker host にawslogsを入れる
$ sudo yum install awslogs
ここは他の方法でも良い(後述するけれど、.ebextensionsでもできる)
packages: yum: awslogs: []
.ebextensionsでよしなに docker host の /opt/elasticbeanstalk/hooks/appdeploy/enact/00.run を上書きする
ソースコード等が入ったデプロイ用ディレクトリのルートに、 .ebextensions という名前でディレクトリを作成
中にpiyopiyo.configみたいなファイルを作り、処理を入れていく
ファイルは content 内の通りに 上書き されるので、十分注意すること
files: "/opt/elasticbeanstalk/hooks/appdeploy/enact/00.run": mode: "000755" owner: root group: root content: | ~~~~~~↑実際のファイルの中身~~~~~~ docker run -d --log-opt max-size=100m --log-opt max-file=7 \ ~~~~~~↓実際のファイルの中身~~~~~~ commands: "restart_awslogs": command: service awslogs restart
環境によっては /etc/awslogs/awslogs.conf の書き換え設定が必要かもしれないので確認が必要。
Elastic Beanstalk、Worker Tier使うのはいいかなーと思うけど、基本的につらみが多い(ヽ´ω`) single containerだとlog driversも選ばせてくれないのも、割とつらかったりする……
誰かのお役に立てれば幸いです。 間違いがあれば指摘もらえるとうれしいです。
参考リンク
aws公式のドキュメントには日本語のページもあるけれど、割りと変な訳になってることが多いので、できれば英語版を読みたい
[追記] 私生活の方でいろいろと励ましてくれるお姉さん募集中です。やさしくされたい。