Статьи

Коллекция журналов с Graylog на AWS

Сбор журналов имеет важное значение для правильного анализа проблем в производстве. Необходим интерфейс для поиска и уведомления об исключениях на всех ваших серверах. Что ж, если у вас есть один сервер, вы можете легко подключиться к нему по ssh и, конечно, проверить журналы, но для более крупных развертываний централизованный сбор журналов гораздо предпочтительнее, чем регистрация на 10 машинах, чтобы найти «что случилось».

Для этого есть много вариантов, примерно разделенных на две группы — сторонние сервисы и программное обеспечение, которое вы устанавливаете.

Сторонние (или «облачные», если хотите) службы сбора журналов включают Splunk , Loggly , Papertrail , Sumologic . Их очень легко настроить, и вы платите за то, что используете. По сути, вы отправляете каждое сообщение (например, с помощью специального приложения обратного входа) в конечную точку поставщика, а затем используете панель мониторинга для анализа данных. Во многих случаях это будет предпочтительным способом.

В других случаях, однако, политика компании может нарушаться при использовании сторонних сервисов для хранения данных, специфичных для компании, или дополнительные расходы могут быть нежелательны. В этих случаях необходимо приложить дополнительные усилия для установки и управления программным обеспечением для сбора внутренних журналов. Они работают аналогичным образом, но детали реализации могут отличаться (например, вместо отправки сообщений с приложением к целевой конечной точке, программное обеспечение, используя какой-либо агент, собирает локальные журналы и объединяет их). Варианты с открытым исходным кодом включают Graylog , FluentD , Flume , Logstash .

После очень быстрого исследования я решил, что Graylog лучше всего соответствует нашим потребностям, поэтому ниже приведено описание процедуры установки на AWS (хотя первая часть применима независимо от инфраструктуры).

Первое, на что нужно обратить внимание — это готовые к использованию изображения, предоставляемые graylog, в том числе докер, openstack, vagrant и AWS. К сожалению, у версии AWS есть два недостатка — она ​​использует Ubuntu, а не Amazon AMI. Это не большая проблема, хотя некоторые общие сценарии, которые вы используете в вашем стеке, возможно, придется переписать. Другой был нарушитель соглашения — когда вы запускаете его, он не запускает веб-интерфейс, хотя утверждает, что должен. Запускаются только mongodb ,asticsearch и graylog-server. Наличие 2 экземпляров — одного веб-сайта и одного для остальных усложнит ситуацию, поэтому я выбрал ручную установку.

Graylog состоит из двух компонентов — сервера, который обрабатывает ввод, индексирование и поиск, и веб-интерфейса, который представляет собой приятный пользовательский интерфейс, взаимодействующий с сервером. Веб-интерфейс использует mongodb для метаданных, а сервер используетasticsearch для хранения входящих журналов. Ниже приведен скрипт bash (CentOS), который выполняет установку. Обратите внимание, что «sudo» отсутствует, поскольку сценарии инициализации выполняются от имени пользователя root в AWS.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
#!/bin/bash
 
# install pwgen for password-generation
yum upgrade ca-certificates --enablerepo=epel
yum --enablerepo=epel -y install pwgen
 
# mongodb
cat >/etc/yum.repos.d/mongodb-org.repo <<'EOT'
[mongodb-org]
name=MongoDB Repository
baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64/
gpgcheck=0
enabled=1
EOT
 
yum -y install mongodb-org
chkconfig mongod on
service mongod start
 
# elasticsearch
rpm --import https://packages.elasticsearch.org/GPG-KEY-elasticsearch
 
cat >/etc/yum.repos.d/elasticsearch.repo <<'EOT'
[elasticsearch-1.4]
name=Elasticsearch repository for 1.4.x packages
baseurl=http://packages.elasticsearch.org/elasticsearch/1.4/centos
gpgcheck=1
gpgkey=http://packages.elasticsearch.org/GPG-KEY-elasticsearch
enabled=1
EOT
 
yum -y install elasticsearch
chkconfig --add elasticsearch
 
# configure elasticsearch
sed -i -- 's/#cluster.name: elasticsearch/cluster.name: graylog2/g' /etc/elasticsearch/elasticsearch.yml
sed -i -- 's/#network.bind_host: localhost/network.bind_host: localhost/g' /etc/elasticsearch/elasticsearch.yml
 
service elasticsearch stop
service elasticsearch start
 
# java
yum -y update
yum -y install java-1.7.0-openjdk
update-alternatives --set java /usr/lib/jvm/jre-1.7.0-openjdk.x86_64/bin/java
 
# graylog
wget https://packages.graylog2.org/releases/graylog2-server/graylog-1.0.1.tgz
tar xvzf graylog-1.0.1.tgz -C /opt/
mv /opt/graylog-1.0.1/ /opt/graylog/
cp /opt/graylog/bin/graylogctl /etc/init.d/graylog
sed -i -e 's/GRAYLOG2_SERVER_JAR=\${GRAYLOG2_SERVER_JAR:=graylog.jar}/GRAYLOG2_SERVER_JAR=\${GRAYLOG2_SERVER_JAR:=\/opt\/graylog\/graylog.jar}/' /etc/init.d/graylog
sed -i -e 's/LOG_FILE=\${LOG_FILE:=log\/graylog-server.log}/LOG_FILE=\${LOG_FILE:=\/var\/log\/graylog-server.log}/' /etc/init.d/graylog
 
cat >/etc/init.d/graylog <<'EOT'
#!/bin/bash
# chkconfig: 345 90 60
# description: graylog control
sh /opt/graylog/bin/graylogctl $1
EOT
 
chkconfig --add graylog
chkconfig graylog on
chmod +x /etc/init.d/graylog
 
# graylog web
wget https://packages.graylog2.org/releases/graylog2-web-interface/graylog-web-interface-1.0.1.tgz
tar xvzf graylog-web-interface-1.0.1.tgz -C /opt/
mv /opt/graylog-web-interface-1.0.1/ /opt/graylog-web/
 
cat >/etc/init.d/graylog-web <<'EOT'
#!/bin/bash
# chkconfig: 345 91 61
# description: graylog web interface
sh /opt/graylog-web/bin/graylog-web-interface > /dev/null 2>&1 &
EOT
 
chkconfig --add graylog-web
chkconfig graylog-web on
chmod +x /etc/init.d/graylog-web
 
#configure
mkdir --parents /etc/graylog/server/
cp /opt/graylog/graylog.conf.example /etc/graylog/server/server.conf
sed -i -e 's/password_secret =.*/password_secret = '$(pwgen -s 96 1)'/' /etc/graylog/server/server.conf
 
sed -i -e 's/root_password_sha2 =.*/root_password_sha2 = '$(echo -n password | shasum -a 256 | awk '{print $1}')'/' /etc/graylog/server/server.conf
 
sed -i -e 's/application.secret=""/application.secret="'$(pwgen -s 96 1)'"/g' /opt/graylog-web/conf/graylog-web-interface.conf
sed -i -e 's/graylog2-server.uris=""/graylog2-server.uris="http:\/\/127.0.0.1:12900\/"/g' /opt/graylog-web/conf/graylog-web-interface.conf
 
service graylog start
sleep 30
service graylog-web start

Вы также можете установить TTL (автоматический срок действия) для сообщений, чтобы старые журналы не сохранялись вечно. Вот как

01
02
03
04
05
06
07
08
09
10
# wait for the index to be created
INDEXES=$(curl --silent "http://localhost:9200/_cat/indices")
until [[ "$INDEXES" =~ "graylog2_0" ]]; do
    sleep 5
    echo "Index not yet created. Indexes: $INDEXES"
    INDEXES=$(curl --silent "http://localhost:9200/_cat/indices")
done
 
# set each indexed message auto-expiration (ttl)
curl -XPUT "http://localhost:9200/graylog2_0/message/_mapping" -d'{"message": {"_ttl" : { "enabled" : true, "default" : "15d" }}}'

Теперь у вас все работает на экземпляре. Затем вы должны сделать некоторые специфичные для AWS вещи (если использовать CloudFormation, это будет включать в себя кучу JSON). Вот список:

  • у вас может быть либо группа автоматического масштабирования с одним экземпляром, либо один экземпляр. Я предпочитаю ASG, хотя другой немного проще. ASG дает вам авто-возрождение, если экземпляр умирает.
  • установите вышеупомянутый скрипт, который будет вызываться в UserData конфигурации запуска экземпляра / asg (например, сначала получая его из s3)
  • разрешить UDP-порт 12201 (порт регистрации по умолчанию). Это должно происходить для группы безопасности instance / asg (входящей), для группы безопасности узлов приложения (исходящей), а также в качестве сетевого ACL вашего VPC. Проверьте соединение UDP, чтобы убедиться, что оно действительно проходит. Держите доступ ограниченным для всех источников, кроме ваших экземпляров.
  • вам нужно передать частный IP-адрес вашего экземпляра серого журнала всем узлам приложения. Это сложно на AWS, так как частные IP-адреса меняются. Вот почему вам нужно что-то стабильное. Вы не можете использовать ELB (балансировщик нагрузки), потому что он не поддерживает UDP. Есть два варианта:
    • Свяжите Elastic IP с узлом при запуске. Передайте этот IP на узлы приложения. Но есть одна загвоздка — если они подключаются к эластичному IP, это будет проходить через NAT (если он у вас есть), и вам, возможно, придется открыть свой экземпляр «миру». Таким образом, вы должны превратить эластичный IP в соответствующий публичный DNS. DNS тогда будет преобразован в частный IP. Вы можете сделать это вручную и взломать:
      1
      GRAYLOG_ADDRESS="ec2-$GRAYLOG_ADDRESS//./-}.us-west-1.compute.amazonaws.com"

      или вы можете использовать интерфейс командной строки AWS EC2 для получения сведений об экземпляре экземпляра, с которым связан эластичный IP, а затем с другим вызовом получить свой публичный DNS.

    • Вместо использования Elastic IP, который ограничивает вас одним экземпляром, вы можете использовать Route53 (диспетчер DNS AWS). Таким образом, когда запускается экземпляр серого журнала, он может присоединиться к записи route53, что позволяет использовать циклический DNS для нескольких экземпляров Graylog, находящихся в кластере. Управление записями Route53 снова выполняется через интерфейс командной строки AWS. Затем вы просто передаете доменное имя узлам приложений, чтобы они могли отправлять сообщения.
  • В качестве альтернативы вы можете установить Graylog-сервер на всех узлах (в качестве агента) и указать их на кластер эластичного поиска. Но это более сложный и, вероятно, не предполагаемый способ сделать это
  • настройте свою структуру ведения журнала для отправки сообщений в graylog. Существуют стандартные приложения GELF (формат greylog), например, этот , и единственное, что вам нужно сделать, это использовать переменную среды Public DNS в logback.xml (которая поддерживает разрешение переменных среды).
  • Вы должны сделать веб-интерфейс доступным вне сети, чтобы вы могли использовать для этого ELB или циклический DNS, упомянутый выше. Просто убедитесь, что правила безопасности строгие и не допускают внешнего вмешательства в ваши данные журнала.
  • Если вы не используете кластер Graylog (о котором я не буду рассказывать), то единственный экземпляр может потерпеть неудачу. Это не большая потеря, поскольку сообщения журналов могут быть получены от экземпляров, и они в любом случае недолговечны. Но важны метаданные веб-интерфейса — информационные панели, оповещения и т. Д. Поэтому рекомендуется регулярно делать резервные копии (например, с помощью mongodump). Использование тома EBS также вариант.
  • Даже если вы отправляете свои сообщения журнала в централизованный сборщик журналов, рекомендуется также вести локальные журналы с надлежащей ротацией и очисткой журналов.

Это не тривиальный процесс, но важно иметь сбор журналов, поэтому я надеюсь, что руководство было полезным.

Ссылка: Сбор журналов С Graylog на AWS от нашего партнера JCG Божидара Божанова в техническом блоге Божо .