使用EFK(Elasticsearch + Fluentd + Kibana)创建ELB访问日志分析平台
由于业务需要,需要在EC2实例上快速创建,这里记一下。
AWS的架构图已经部分省略。
組成
- t2.medium (vCPU: 2, Mem: 4GB, EBS: 30GB) x1
建构步骤
Elastic Load Balancer 日志导出配置
选择Service -> EC2 -> 负载均衡器 -> 选择目标ELB。
从说明标签的属性中,启用访问日志设置,并指定输出间隔和S3存储桶。
安装Elasticsearch + Fluentd + Kibana
Elasticsearch,Kibana
这次我们选择了以 Amazon Linux 2 (基于 Red Hat Enterprise Linux) 为基础的 AMI,所以我们将从 RPM 仓库进行安装。
https://www.elastic.co/guide/en/elasticsearch/reference/current//rpm.html
https://www.elastic.co/guide/en/kibana/current/rpm.html
导入PGP密钥
rpm --import https://artifacts.elastic.co/GPG-KEY-elasticsearch
创建/etc/yum.repos.d/elasticsearch.repo文件,并写入以下内容。
[elasticsearch-7.x]
name=Elasticsearch repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
同样地,创建/etc/yum.repos.d/kibana.repo文件,并写入以下内容。
[kibana-7.x]
name=Kibana repository for 7.x packages
baseurl=https://artifacts.elastic.co/packages/7.x/yum
gpgcheck=1
gpgkey=https://artifacts.elastic.co/GPG-KEY-elasticsearch
enabled=1
autorefresh=1
type=rpm-md
安装
sudo yum install elasticsearch
sudo yum install kibana
流畅的日志收集系统
在安装之前,需要增加文件描述符的上限并调整网络内核参数。
安装
curl -L https://toolbelt.treasuredata.com/sh/install-amazon2-td-agent3.sh | sh
安装nginx。
sudo amazon-linux-extras install nginx1.12
EFK,对nginx的配置进行设置。
/etc/elasticsearch/elasticsearch.yml 可以翻译为:/etc/elasticsearch/elasticsearch.yml文件
bootstrap.memory_lock: true
network.host: 0.0.0.0
transport.host: localhost
transport.tcp.port: 9300
/etc/elasticsearch/jvm.options 的中文翻译:
-Xms1g # インスタンスのメモリ容量の1/4程度を割り当てておく
-Xmx1g
/td-agent.conf的路径在/etc/td-agent/td-agent.conf下。
# ソースを指定する
# プラグインはfluent-plugin-elb-logを使用 (https://github.com/shinsaka/fluent-plugin-elb-log)
# sudo td-agent install fluent-plugin-elb-logでインストールする
<source>
@type elb_log
region ap-northeast-1
access_key_id XXXXXXXXXXXXXXXXXXXX # AmazonS3ReadOnlyAccessをアタッチしたIAMユーザを作成しておく
secret_access_key XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
s3_bucketname log-elb-accesslogs-tkgl
s3_prefix AWSLogs
refresh_interval 300
timestamp_file /tmp/elb_last_at.dat
buf_file /tmp/fluentd-elblog.tmpfile
tag tkgl
</source>
...
...
<match tkgl.**>
@type elasticsearch
type_name access_log
host 0.0.0.0
port 9200
logstash_format true
logstash_prefix tkgl
include_tag_key true
tag_key @log_name
<buffer>
@type file
path /var/log/td-agent/buffer/elb_log.buf
chunk_limit_size 256m
flush_interval 30s
flush_thread_count 2
queued_chunk_limit_size 5
total_limit_size 2g
</buffer>
</match>
...
...
/nginx.conf 位于 /etc/nginx/ 目录下。
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log warn;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
include /etc/nginx/mime.types;
default_type application/octet-stream;
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
client_max_body_size 300M;
send_timeout 300s;
keepalive_timeout 65;
server {
listen 80;
server_name kibana;
location / {
proxy_pass http://localhost:5601;
proxy_ignore_client_abort on;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $http_host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
rewrite ^/(.*)$ /$1 break;
}
location /es/ {
proxy_pass http://localhost:9200/;
}
}
}
开动
# 自動起動設定
sudo systemctl enable elasticsearch.service
sudo systemctl enable kibana.service
sudo systemctl enable td-agent.service
sudo systemctl enable nginx.service
# 起動
sudo systemctl start elasticsearch.service
sudo systemctl start kibana.service
sudo systemctl start td-agent.service
sudo systemctl start nginx.service
完成安装、设置并启动后,请访问以下网址:http://ec2-{ip-address}.ap-northeast-1.compute.amazonaws.com
使用时需要注意的事项
Fluentd的缓冲区
注意:如果没有适当地设置 chunk_limit_size 和 flush_interval,会发生缓冲区溢出。
请查阅
<buffer>
@type file
path /var/log/td-agent/buffer/elb_log.buf
chunk_limit_size 256m
flush_interval 30s
flush_thread_count 2
queued_chunk_limit_size 5
total_limit_size 2g
</buffer>
定期删除日志
如果像这次一样,存储容量很少的情况下,由于td-agent的日志导致存储空间被占用,所以应该定期使用crontab进行删除。
50 3 * * * tmpwatch -m 24 -x /var/log/td-agent/buffer /var/log/td-agent
50 3 * * * sudo find /tmp -type f -print | xargs sudo rm
索引的滚动
索引(按日计算)的大小大约在250MB至2GB左右,因此不要忘记设置回滚选项。