Цель: Возьмите ввод JSON, создайте несколько документов для каждого вывода из:
- [услуги] [ec2] [выводы]
- [services] [iam] [выводы]
- [services] [s3] [выводы] ... и так далее для нескольких служб.
Под выводами находятся объекты, которые должны рассматриваться как отдельные документы и храниться под одним индексом.
Пример цели:
Ввод:
- [услуги] [ec2] [выводы]: A, B
- [услуги] [iam] [выводы]: C
- [услуги] [s3] [выводы]: D, E, F
Вывод (6 документов): A, B, C, D, E, F
Статус: У меня есть огромный файл JSON, который я хочу обработать с помощью Logsta sh и поместить в ElasticSearch.
My logsta sh .conf:
input {
stdin {}
}
filter {
json {
source => "message"
remove_field => [
"message",
"host",
"path"
]
}
date {
match => [
"[last_run][time]",
"yyyy-MM-dd HH:mm:ssZ"
]
}
ruby {
code => '
event.set("epochDate", event.get("@timestamp").to_i)
'
}
ruby {
code => '
val_a = []
event.get("[services][ec2][findings]").each { |k, v|
v[
"controlName"
] = k
val_a << v
}
event.set("tempResults-ec2", val_a)
'
}
split {
field => "[tempResults-ec2]"
target => "control"
remove_field => [
"last_run",
"metadata",
"service_groups",
"service_list",
"services",
"tempResults-ec2",
"sg_map",
"subnet_map",
"@version"
]
}
}
output {
elasticsearch {
hosts => "localhost:9200"
index => "aws"
document_type => "finding"
document_id => "%{[control][controlName]}-%{[epochDate]}"
}
stdout { codec => rubydebug
}
}
И я запускаю следующую команду для анализа JSON:
logstash --path.settings /etc/logstash/ -f ./logstash.conf < ./big.json
ruby получает разные результаты и создает документ для каждого результата в JSON. Весь код (как есть) работает нормально. Но, как и в EC2 (здесь), существует несколько типов служб, таких как: S3, IAM, CLOUDFORMATION, et c (всего 24)
Я попытался добавить еще ruby и разделить его на этот код. с заменой EC2 на IAM, но возникает ошибка: Ruby произошло исключение: неопределенный метод 'each' для второй службы (IAM) и документы, созданные для службы EC2, успешно отправляются в ElasticSearch.
Обходной путь - создать 24 конфигурации и запустить 24 bash команд для каждой конфигурации, что неэффективно и повлияет на ресурсы.
Я попытался поместить все конфигурации в одну папку, а затем запуск команды Logsta sh с каталогом, содержащим всю конфигурацию (как с помощью stdin, так и с помощью метода input {file {}}), когда файл был указан во всех конфигурациях, он выдал ошибку кучи, а когда я использовал stdin, он просто не t работает и заспамил мой терминал JSON 24 раза.
Также пробовал использовать несколько сплит-фильтров:
ruby {
code => '
val_a = []
event.get("[services][ec2][findings]").each { | k, v |
v[
"controlName"
] = k
val_a << v
}
val_b = []
event.get("[services][iam][findings]").each { | k, v |
v[
"controlName"
] = k
val_b << v
}
event.set("tempResults-iam", val_b)
event.set("tempResults-ec2", val_a)
'
}
split {
field => "[tempResults-ec2]"
target => "control"
remove_field => [
"last_run",
"metadata",
"service_groups",
"service_list",
"services",
"tempResults-ec2",
"sg_map",
"subnet_map",
"@version"
]
}
split {
field => "[tempResults-iam]"
target => "control"
remove_field => [
"last_run",
"metadata",
"service_groups",
"service_list",
"services",
"tempResults-iam",
"sg_map",
"subnet_map",
"@version"
]
}