使用EFK(Elasticsearch + Fluentd + Kibana)创建ELB访问日志分析平台

由于业务需要,需要在EC2实例上快速创建,这里记一下。

AWS的架构图已经部分省略。

組成

    t2.medium (vCPU: 2, Mem: 4GB, EBS: 30GB) x1
YVlCypB.jpg

建构步骤

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左右,因此不要忘记设置回滚选项。

广告
将在 10 秒后关闭
bannerAds