AMQPS a Syslog

AMQPS a Syslog

Actualmente estoy usando una API básica para extraer registros de un proveedor de seguridad en la nube, pero no es un proceso muy limpio. Me gustaría hacer la transición al servicio de transmisión de eventos (AMQPS) que brindan.

Ya configuré la cola y tengo la información relevante en el lado de la nube, pero el problema que tengo es descubrir la mejor manera de aceptar esa transmisión y volcarla en syslog. Estoy utilizando syslog-ng en este momento, pero parece que solo puede enviar a RabbitMQ y no aceptarlo.

Actualmente estoy mirando Pika para ver si funcionaría para aceptar AMQPS y luego canalizarlo a un archivo de registro, pero ahí es donde tengo algunos problemas. Cualquier ayuda sería muy apreciada.

Gracias

Respuesta1

Encontré una página de github hecha por walbit (https://github.com/walbit/AMP_API), que parece estar funcionando correctamente para mí. Estoy usando "consume_event_stream_by_name.py" y vuelca todas las entradas al estándar. Hice una ligera modificación para enviarlo también a syslog y ahora syslog-ng lo acepta.

Mi único problema en este momento con este código es que parece agotarse de vez en cuando o morir en general si las conexiones no llegan. Así que necesito descubrir qué está pasando con eso.

#!/usr/bin/env python

import argparse
import pika
import pprint
import requests
import sys
import logging
import logging.handlers

# YOU NEED TO CREATE AN auth.py FILE WITH CLIENT_ID AND API_KEY STRINGS
from auth import CLIENT_ID, API_KEY

parser = argparse.ArgumentParser()
parser.add_argument('event_stream_name', metavar='event_stream_name',
                    nargs=1, help='event stream name')
parser.parse_args()
event_stream_name = parser.parse_args().event_stream_name[0]

api_endpoint = 'https://api.amp.cisco.com/v1/event_streams'

session = requests.Session()
session.auth = (CLIENT_ID, API_KEY)

event_streams = session.get(api_endpoint).json()['data']

event_stream = {}

for e in event_streams:
    if e['name'] is event_stream_name:
        event_stream = e

amqp_url = 'amqps://{user_name}:{password}@{host}:{port}'.format(
    **e['amqp_credentials'])
queue = e['amqp_credentials']['queue_name']
parameters = pika.URLParameters(amqp_url)
connection = pika.BlockingConnection(parameters)
channel = connection.channel()


parameters = pika.URLParameters(amqp_url)
connection = pika.BlockingConnection(parameters)
channel = connection.channel()

my_logger = logging.getLogger('MyLogger')
my_logger.setLevel(logging.INFO)
handler = logging.handlers.SysLogHandler(address = '/dev/log')
my_logger.addHandler(handler)

def callback(ch, method, properties, body):
#    print(" [x] Received meth:\t%r" % method)
#    print(" [x] Received prop:\t%r" % properties)
#    print(" [x] Received body:\t%r" % body)
#    print(body)
    my_logger.info('Fireamp: ' + body)


channel.basic_consume(callback, queue, no_ack=True)

print(" [*] Connecting to:\t%r" % amqp_url)
print(" [*] Waiting for messages. To exit press CTRL+C")
channel.start_consuming()

información relacionada