1

Existe-t-il un moyen de diffuser un groupe de journaux AWS vers plusieurs fonctions Elasticsearch Services ou Lambda? AWS ne semble autoriser qu'un ES ou un Lambda, et j'ai tout essayé à ce stade. J'ai même supprimé le service d'abonnement ES pour le groupe de journaux, créé des fonctions Lambda individuelles, créé le déclencheur de journaux CloudWatch et je ne peux appliquer le même déclencheur CloudWatch Log qu'à une seule fonction Lambda.Diffusion du groupe de journaux AWS CloudWatch dans plusieurs services AWS Elasticsearch

Voici ce que je suis en train d'accomplir:

CloudWatch Log ABC Group -> Pas de filtre -> ElasticSearch service # 1

CloudWatch Log ABC Group -> Filtre: "XYZ" -> ElasticSearch Service # 2

Fondamentalement, j'ai besoin d'un cluster ES pour stocker tous les journaux, et un autre pour avoir seulement un sous-ensemble de journaux filtrés.

Est-ce possible?

Répondre

0

J'ai été capable de résoudre le problème en utilisant un peu d'une solution de contournement via la fonction Lambda et en utilisant également la réponse fournie par Kannaiyan.

J'ai créé l'abonnement à ES via la console, puis je me suis désabonné et j'ai modifié le code par défaut de la fonction Lambda.

Je déclare deux points d'extrémité ElasticSearch:

var endpoint1 = '<ELASTICSEARCH ENDPOINT 1>'; 
var endpoint2 = '<ELASTICSEARCH ENDPOINT 2>'; 

Ensuite, a déclaré un tableau nommé "point final" avec le contenu de endpoint1 et Endpoint2:

var endpoint = [endpoint1, endpoint2]; 

J'ai modifié la fonction "post" qui appelle la fonction "buildRequest" qui référence alors "endpoint" ...

function post(body, callback) { 
    for (index = 0; index < endpoint.length; ++index) { 
    var requestParams = buildRequest(endpoint[index], body); 
... 

Ainsi, chaque fois que la fonction "post" est appelée, elle parcourt le tableau points d'extrémité. Ensuite, j'ai modifié la fonction buildRequest chargée de construire la requête. Cette fonction appelle par défaut la variable endpoint, mais depuis que la fonction "post" parcourt le tableau, j'ai renommé "endpoint" en "endpoint_xy" pour m'assurer qu'il n'appelle pas la variable globale et prend la variable en entrée dans le fonction:

function buildRequest(endpoint_xy, body) { 
    var endpointParts = endpoint_xy.match(/^([^\.]+)\.?([^\.]*)\.?([^\.]*)\.amazonaws\.com$/); 
... 

Enfin, je la réponse fournie par Kannaiyan sur l'utilisation de l'AWS CLI pour mettre en œuvre l'abonnement aux journaux, mais corrige quelques variables:

aws logs put-subscription-filter \ 
--log-group-name <LOG GROUP NAME> \ 
--filter-name <FILTER NAME> 
--filter-pattern <FILTER PATTERN> 
--destination-arn <LAMBDA FUNCTION ARN> 

J'ai gardé les filtres complètement ouvert pour l'instant, mais va maintenant coder le filtre directement dans la fonction Lambda lik e Dashmug suggéré. Au moins, je peux diviser un journal en deux groupes ES.

Merci à tous!

1

J'ai également rencontré cette limitation. J'ai deux Lambda (faire des choses différentes) qui ont besoin de s'abonner au même groupe de journaux CloudWatch. Ce que j'ai fini par utiliser est de créer un Lambda qui s'abonne au groupe de journal, puis de transmettre les événements par proxy dans un sujet SNS.

Ces deux Lambda sont désormais abonnées à la rubrique SNS au lieu du groupe de journaux.

Pour les événements de filtrage, vous pouvez les implémenter dans Lambda.

Ce n'est pas une solution parfaite, mais c'est une solution de contournement fonctionnelle jusqu'à ce qu'AWS autorise plusieurs Lambda à s'abonner au même groupe de journaux CloudWatch.

1

Semble comme la limitation de la console AWS,

Vous pouvez le faire via la ligne de commande,

aws logs put-subscription-filter \ 
    --log-group-name /aws/lambda/testfunc \ 
    --filter-name filter1 \ 
    --filter-pattern "Error" \ 
    --destination-arn arn:aws:lambda:us-east-1:<ACCOUNT_NUMBER>:function:SendToKinesis 

Vous devez également ajouter des autorisations ainsi.

instructions détaillées complètes,

http://docs.aws.amazon.com/AmazonCloudWatch/latest/logs/SubscriptionFilters.html

Hope it helps.

+0

Intéressant. J'ai rencontré cette limitation de CloudFormation. C'est étrange que la CLI le permette. – dashmug

+1

Malheureusement, cette solution ne semble pas fonctionner: Une erreur est survenue (LimitExceededException) lors de l'appel de l'opération PutSubscriptionFilter: Limite de ressource dépassée. Donc, le même message que nous recevons sur la console. – nukalov