Логста sh | Выполнение нескольких кодов ruby для одного входа - PullRequest
0 голосов
/ 04 августа 2020

Цель: Возьмите ввод 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"
  ]
}
...