SREãã¼ã ã®å·¦ãµã¤ããã㯠@kenzo0107 ã§ãã
ä»å㯠ECS ã³ã³ãããã°ããç¹å®ã®ãªã¯ã¨ã¹ãã«ãããã°ãæ½åºãã Athena ã§ã¯ã¨ãªææ»ã§ããæ§ã«ãã話ã§ãã
ã³ã³ãããã°ããç¹å®ãªã¯ã¨ã¹ãã«ãããã°ãæ½åºããç®ç
以ä¸ã¸ã®ä¸å©ã¨ãããçºã«å®è£ ãã¾ããã
- ã¢ããªã±ã¼ã·ã§ã³ã®æ¹åã¨ãªããã¼ã¿ã®éè¨
- åé¡çºçæã®èª¿æ»
ã³ã³ãããã°ã¯ã©ã®ããã«åºåãããã
ECS ã³ã³ãããã°ã JSON å½¢å¼ã§åºåããã¨ä»¥ä¸ã®æ§ã«ãªãã¾ãã
{ "source":"stdout", "log":"{\"method\":\"GET\",\"path\":\"/sre/boshuchu\",\"format\":\"html\",\"controller\":\"SRE::BoshuchuController\",\"action\":\"show\",\"status\":200,\"duration\":11.07,\"view\":0.73,\"level\":\"INFO\",\"user_id\":null,\"ip\":null,\"referer\":null,\"user_agent\":null,\"time\":\"2022-09-29T01:14:40+00:00\",\"params\":{}}", "container_id": "596d27e777c54922a63fa0d11716ee26-265927825", "container_name": "web", "ecs_cluster": "main", "ecs_task_arn": "arn:aws:ecs:ap-northeast-1:123456789012:task/sre-love/h1a2p3p4y5l6i7f8e9s0r1e2", "ecs_task_definition": "sre-love:123" }
ä¸è¨ä¾ã§ã¯ log ãã¼ã« lograge ã§ JSON ãã©ã¼ãããããã Rails ãã°ãå«ã¾ãã¦ãã¾ãã
åè: タスク定義の例 - Amazon Elastic Container Service
ä¸è¨ãã°ãç¹ã«æ´å½¢ãããAthena ã§ã¯ã¨ãªå®è¡ãã㨠log ãã¼ã« JSON å½¢å¼ã®æååã表示ããã¾ãã1
ãã®ãã°ã«ã¢ããªã±ã¼ã·ã§ã³ãããã¼ãä»è¾¼ã¿ããã®ãã¼ãåå¨ããå ´åãç¹å®ãã°ã¨è¦åããã¨ãã§ãã¾ãã
ã¾ãããã® JSON ã®åã ã®ãã¼ã§æ¤ç´¢ã§ããæ§ã«ãããã¨ã§å è¿°ã®ç®çãéæã§ãããã§ãã
æ§æ
- ãã°é 信㯠Fluent Bit ã³ã³ããã«å§è²
- ç¹å®ãã°ã¯ Kinesis Firehose ã«é ä¿¡
- ã³ã³ãããã°ã¯ CloudWatch Logs ã«é ä¿¡2
- Glue Crawler ã§ S3 ã«ä¿ç®¡ããããã°ãã¯ãã¼ãªã³ã°ã Glue ãã¼ãã«ä½æ
- Athena ãã Glue ãã¼ãã«ã«å¯¾ãã¯ã¨ãªå®è¡
Kinesis Firehose çã®ãªã½ã¼ã¹ã®æ§ç¯ã¯ Terraform Cloud Private Registry ãå©ç¨ãæéãçååãã¦ãã¾ãã
Fluent Bit ã®å¦çã®æµã
- å ¨ã³ã³ãããã°ã¯ CloudWatch Logs ã« output
- Stream Processor ã§ Rails ã³ã³ãããã°ã®ã¹ããªã¼ã ã使
- ä¸è¨ã¹ããªã¼ã ã Parser ã Filter ã§æ´å½¢ã Kinesis Firehose ã« output
以ä¸ã« Fluent Bit ã®å®è£ å 容ãã¾ã¨ãã¦ãã¾ãã3
ãããã¯
- å®è£ ä¾ã¨ãã¦ãç°¡æçã« log ãã¼ã®ç¬¬ä¸é層㫠method ãã¼ãåå¨ããå ´åãç¹å®ãã°ã¨ããã
- Stream Processor ã§å ¨ã³ã³ãããã°ããå¥é Rails ãã°ãã¹ããªã¼ã ã¨ãã¦ä½æãæ´å½¢
- lua ã§ç¹å®ãã°ãæ½åº
- ããã©ã¼ãã³ã¹åä¸ã®çºã cloudwatch ã§ãªã cloudwatch_logs ãæ¡ç¨
ãã¹ã宿½æ¹æ³
å®ã¯æ¬ããã°ã®ã¡ã¤ã³ã¯ãã¡ãã«ãªãã¾ãã
çæ§ã«èãã¦ã¿ããã£ãã®ãè¨å®ãã¡ã¤ã«ã®ãã¹ã宿½æ¹æ³ã«ã¤ãã¦ã§ãã
ã¾ãã¯çæ§ã«èãåã«èªèº«ã®æã®å
ãè¦ãããã¨æãã¾ãã
æ¦è¦ã¯ä»¥ä¸ã«ãªãã¾ãã
- ãã¹ãç¨ Fluent Bit ã³ã³ãããèµ·å
- ãã¹ããã¼ã¿ã HTTP Plugin ã§ Input
- åºåããããã¼ã¿ãæ³å®éãã確èª
ãã¹ã㯠GitHub Actions ã§å®æ½ãã¦ã¿ã¾ããã ãã¹ã宿½ã«å½ãã£ã¦å·¥å¤«ç¹ã以ä¸ã«ã¾ã¨ãã¾ãã
INPUT 㯠HTTP Plugin ãæ¡ç¨ãã
http Input plugin ã使ç¨ãããã¨ã§ Fluent Bit ã HTTP çµç±ã§è¤æ°ã®ä»»æã®ã¿ã°ä»ããããã°ã POST ã§ããæ§ã«ãªãã¾ãã
ãã¹ãç¨ Fluent Bit ã§ã¯è¨å®ãã¡ã¤ã«ãã©ããã http input plugin ãè¨å®ãã¦ãã¾ãã
[INPUT] Name http @include extra.conf
.github/workflows/test_fluentbit.yml#L50-L59
- name: run fluentbit for testing run: > docker run --rm -d --name fluentbit ... -v $(pwd)/test/test.conf:/fluent-bit/etc/test.conf test-fluentbit:latest /fluent-bit/bin/fluent-bit -c /fluent-bit/etc/test.conf
ä» Plugin ã¨ã®æ¯è¼
- dummy input plugin ã¯ããã¹ãæ¯ã« conf ãã¡ã¤ã«ãèªã¿è¾¼ã¾ãç´ãå¿ è¦ãããã fluentbit ãèµ·åããå¿ è¦ããããå®è¡æéãæããã¾ããè¤æ°ã® dummy ãã¼ã¿ãæµããã¨ãå¯è½ã§ãããçµæã®å¤å®ã®ãã«ãããããã¾ããã
- tail input plugin ã¯ã ä¸è¨åæ§ããã¹ãæ¯ã« conf ãã¡ã¤ã«ãèªã¿è¾¼ã¾ããå¿ è¦ãããã¾ãã
- tcp input plugin ã¯ãå¤é¨ããã¿ã°æå®ã§ãã¾ããã
ãã¹ãç¨ã« output.conf ã䏿¸ã
åç¨ç°å¢ã§å©ç¨ãã output.conf ã使ç¨ãã㨠GitHub Actions ä¸ã®ãã¹ãæã«ã¯ Kinesis Firehose ã¸ã®æ¥ç¶ãã§ããã¨ã©ã¼ã¨ãªãçºã
ãã¹ãç¨ã« output.conf
ã§ä¸æ¸ããã¨ã©ã¼ãåé¿ãã¦ãã¾ãã4
[OUTPUT] Name file Match * Path /tmp/ [OUTPUT] Name stdout Match *
.github/workflows/test_fluentbit.yml#L56
run: | docker run --rm -d \ -v $(pwd)/docker/fluentbit/test/output.conf:/fluent-bit/etc/output.conf \ test-fluentbit:latest \
file output plugin ãå©ç¨ãã¦ããã®ã¯ãæ´å½¢å¾ã®ãã°ããã¡ã¤ã«ã¨ãã¦åºåãçµææ¯è¼ã«å©ç¨ãã¾ãã
GitHub Actions ä¸ã§ docker run ã§èµ·åããã³ã³ããã«ã¢ã¯ã»ã¹ããçºã« network 使
GitHub Actions ä¸ã§ docker run
ã§èµ·åããã³ã³ãã㯠127.0.0.1 ã§ã¯ã¢ã¯ã»ã¹ã§ãã¾ããã
ãã®çºã docker network ã使ããã® network ä¸ãã curlimages/curl:latest
çµç±ã§ curl ã fluentbit ã³ã³ããã«å¯¾ãå®è¡ãã¦ãã¾ãã
.github/workflows/test_fluentbit.yml#L45-L70
- name: fluentbit ã³ã³ããã¸å¤é¨ãã http çµç±ã§ã¢ã¯ã»ã¹ãã¹ããdocker network ã使 run: docker network create actions - name: run fluentbit for testing run: > docker run --rm -d --name fluentbit --network actions ... test-fluentbit:latest /fluent-bit/bin/fluent-bit -c /fluent-bit/etc/test.conf # NOTE: http://fluentbit:9880/web-firelens-dummy ã«å¯¾ã㦠curl ãããã¨ã§ # tag=web-firelens-dummy ãä»ä¸ãããã°ã fluentbit ã« POST ã§ããã - name: fluentbit ã³ã³ãã㸠Rails ã³ã³ãããã°ã http çµç±ã§ POST ãã run: > docker run --rm --network actions --link fluentbit:fluentbit -v $(pwd)/docker/fluentbit/test/web_container.log:/tmp/web_container.log curlimages/curl:latest -v -d @/tmp/web_container.log -XPOST -H "content-type: application/json" http://fluentbit:9880/web-firelens-dummy
expect filter plugin ã§å¯¾è±¡ãã°ãåå¾ã§ãã¦ããããã§ãã¯
expect filter plugin ã使ç¨ãã³ã³ãããã°ããæ½åºããJSONãã©ã¼ããããããRailsãã°ã expect ã§åã
ã®ãã¼å¤ãæ¤è¨¼ãã¾ãã
action exit
ã§ããããã®ãã§ãã¯ã§å¤±æããå ´åãç°å¸¸çµäºã¨ãªãã¾ãã
[FILTER] name expect match eventlog key_val_eq method GET key_val_eq path /sre/boshuchu ... action exit
fluentbit ãæå³ããæ¯ãèãããã¦ãããã¯åºåãããã°ãã¡ã¤ã«ã®å 容ãç §åãã
expect filter plugin ã¯ãæ½åºå¯¾è±¡ã®ãã°ãåå¾ã§ãã¦ãããã«ã¤ãã¦ããã¼åä½ã§ãã§ãã¯ãå¯è½ã§ããã ããã°ãé ä¿¡ãããªãããæ£è§£ã®å ´åã®ãã¹ãã«ã¯åãã¾ããã
以ä¸ã¯é常ã®ã³ã³ãããã°ãæ¹å¤ãããã«ãã°åºåããããã®ãã¹ãã§ãã
# NOTE: http://fluentbit:9880/web-firelens-dummy ã«å¯¾ã㦠curl ãããã¨ã§ # tag=web-firelens-dummy ãä»ä¸ãããã°ã fluentbit ã« POST ã§ããã - name: fluentbit ã³ã³ãã㸠Rails ã³ã³ãããã°ã http çµç±ã§ POST ãã run: > docker run --rm ... curlimages/curl:latest -v -d @/tmp/web_container.log -XPOST -H "content-type: application/json" http://fluentbit:9880/web-firelens-dummy - name: ã³ã³ãããã°ãã¡ã¤ã«ãçæãããã¾ã§å¾ æ©ãããçæãããªãå ´åããã¹ã失æã¨ãªã # NOTE: web-firelens-dummy ã¿ã°ã§ãªã¯ã¨ã¹ããã㨠web_firelens_dummy ã¨ãããã¡ã¤ã«åã§çæããã run: while [ ! -e /tmp/web_firelens_dummy ]; do sleep 1; done - name: Rails ã³ã³ãããã°ãæ¹å¤ãããåºåããããã¨ãå®å¤ã¨äºæ¸¬å¤ãä¸è´ããªãå ´åããã¹ã失æã¨ãç°å¸¸çµäºãã # NOTE: fluentbit çµç±ã§åºåããããã°ã® JSON ã®ãã¼ã¯æ¯åé ä¸åãªçºã `--sort-keys` ã§ãã¼ãæé ã«ã½ã¼ããã¦ãã¾ãã run: | diff -q \ <(sed 's|web_firelens_dummy: ||g' /tmp/web_firelens_dummy | jq -r --sort-keys '.[1]') \ <(cat ./docker/fluentbit/test/web_container.log | jq --sort-keys .)
timestamp ã¯å¤æ´ããã¦ãã¾ãçºã
ãã° {"source":"stdout","log": ...}
ã®å
ã第äºè¦ç´ ã® log ãã¼ãæ¯è¼å¯¾è±¡ã¨ãã¦ãã¾ãã
æ¯è¼æã« json ã¯æ¯åé ä¸åã«ãªãçºã --sort-keys
ã§ãã¼ãæé (aâz) ã«ä¸¦ã¹ã¦ãã¾ãã 5
run: | diff -q \ <(sed 's|web_firelens_dummy: ||g' /tmp/web_firelens_dummy | jq -r --sort-keys '.[1]') \ <(cat ./docker/fluentbit/test/web_container.log | jq --sort-keys .)
fluentbit ã®æ§æãã§ãã¯
- name: fluentbit è¨å®ãã¡ã¤ã«æ§æãã§ã㯠run: > docker run --rm -e DELIVERY_STREAM_WEB_LOG=dummy test-fluentbit:latest /fluent-bit/bin/fluent-bit -c /fluent-bit/etc/extra.conf --dry-run
è¨å®ãã¡ã¤ã«ã®æ§æãã§ãã¯ã宿½ãã¦ãã¾ãã
è¨å®ã«åé¡ããªãå ´åã¯ä»¥ä¸ã®æ§ã«æ£å¸¸çµäºãã¾ãã
Fluent Bit v1.9.8 * Copyright (C) 2015-2022 The Fluent Bit Authors * Fluent Bit is a CNCF sub-project under the umbrella of Fluentd * https://fluentbit.io configuration test is successful
䏿£ãªæ§æãããå ´åã¯ç°å¸¸çµäºãã¾ãã
ç·è©
å ã ãngx_mruby ã§ SSL è¨¼ææ¸ã®åçèªã¿è¾¼ã¿ã·ã¹ãã æ§ç¯ããéã« Nginx ã®æåããã¹ãããæ¹æ³ããã³ãã« Fluent Bit ã®ãã¹ããå®è£ ãã¦ã¿ã¾ããã
æ¬å½ã«çããã©ã®ãããªãã¹ãããã¦ããã®ãæ°ã«ãªã£ã¦ã¾ããã³ã¡ã³ãããã ããã¨å¬ããã§ã ð
ä»å㯠lograge ã§ JSON ãã©ã¼ãããããã Rails ã®ã³ã³ãããã°ã対象ã§ãããã åæ§ã®æ¹å¼ã§ä» F/W ã§ãã¢ããªã±ã¼ã·ã§ã³ãã°å°ç¨ã® Glue ãã¼ãã«ã管çãã¦ãã¾ãã
ã¾ããDB ã«ãã°ãèç©ãã¦ããããã¸ã§ã¯ããããã¾ãããã Fluent Bit ã§ãã°ã S3 ä¿åãããã¨ã§ DB ã®ã³ã¹ãã忏ã§ããä¾ãããã¾ãã
以ä¸
åèã«ãªãã°å¹¸ãã§ãã
æ¯éèªè ã«ãªã£ã¦ãã ãã
ã¡ããã¢ã§ã¯ä¸ç·ã«åã仲éãåéãã¦ãã¾ãã ãå¿åããå¾ ã¡ãã¦ããã¾ãï¼
â åéãã¸ã·ã§ã³ã¯ãã¡ã
https://medpeer.co.jp/recruit/entry/
â éçºç°å¢ã¯ãã¡ã
https://medpeer.co.jp/recruit/workplace/development.html
-
Kinesis Firehose ã§ JSON â Parquet 夿ã S3 ä¿åããGlue Crawler ã§çæãã Glue ãã¼ãã«ãæ³å®ãã¦ãã¾ãã↩
-
CloudWatch Logs ã¸ã³ã³ãããã°ãé ä¿¡ãããã¨ã§ã¿ã¹ã¯èµ·å失ææã®ãã°èª¿æ»ãç´ã¡ã«ã§ããæ§ã«é æ ®ãã¾ãããKinesis Firehose ã¯ãã°ãä¸å® byte (æå¤§ 128 MB)ããããã¯ãä¸å®æé (æå¤§ 15åé) S3 ã«ãã°é ä¿¡ããªãæ§ããããã¡ãããã¨ãå¯è½ã§ãããããã¡ãµã¤ãºãå°ãããããã°ã¬ã³ã¼ãã®ãµã¤ãºãå°ãããªãã¨æå³ãã¬ã³ã¹ãå¢ã¨ãªãå¯è½æ§ãããã¾ããå¼ç¤¾ã§ã¯ãã³ã¹ãæå¶ããæå³ããæ¥µåãããã¡ã®æå¤§å¤ãæ¡ç¨ãã¦ããé¢ä¿ã§ç´ã¡ã« Glue ãã¼ãã«ã«åæ ãããªããã¡ãªãããããã¾ãã
åè: https://docs.aws.amazon.com/ja_jp/firehose/latest/dev/limits.html
ããã¸ã§ã¯ãã®ç¹æ§ã«ãã£ã¦ã³ã³ãããã°ã CloudWatch Logs ã§ãªã Kinesis Firehose ã«é ä¿¡ããã³ã¹ã忏ã宿½ãã¦ããå ´åãããã¾ãã↩ -
å®è£ æå³ãã§ããéã commit ãã°ã«ã¾ã¨ãã¾ããã®ã§åèã«ãã¦ããã ãã¾ãã¨å¹¸ãã§ãã↩
-
GitHub Actions ã§è©¦ç¨ã§ãã Kinesis Firehose ã³ã³ããã®æ§ãªãã®ãããã°ããå®éã®æ§æã«è¿ãå©ç¨ãããã£ãã®ã§ãããç¾ç¶ã¯ãªãããã↩
-
å¯èªæ§ãæªããã·ã§ã«è¸é£ã³åºã¦ããã®ã§ã¤ãã¿ãå¢ãã¦ãç®æã§ããçããã©ããªãã¹ããã¦ãã®ãç¥ãããã¨æã£ãã®ã¯ã¾ãã«ãã®æã§ãã ð ↩