Comment résoudre les problèmes liés à CloudWatch Logs afin qu'il soit diffusé en streaming vers mon domaine Amazon ES ?

Date de la dernière mise à jour : 06/10/2020

Je ne parviens pas à diffuser mes journaux Amazon CloudWatch logs vers mon domaine Amazon Elasticsearch Service (Amazon ES). Comment résoudre ce problème ?

Résolution

Je ne parviens pas à diffuser plusieurs groupes de journaux CloudWatch vers le même domaine Amazon ES

Par défaut, Amazon CloudWatch crée une seule fonction AWS Lambda pour chaque domaine Amazon ES. Si vous configurez plusieurs groupes de journaux pour indexer les données dans un domaine Amazon ES, tous les groupes de journaux appellent la même fonction Lambda. Lorsque le premier groupe de journaux appelle une fonction Lambda, l'appel crée un index et un champ de type dans le domaine Amazon ES.

Pour Elasticsearch version 6.0 ou ultérieure, vous ne pouvez avoir qu'un seul type de mappage. La même règle s'applique aux versions 5.x à 6.x. Pour plus d'informations sur les types de mappage Elasticsearch, consultez Qu'est-ce que les types de mappage ? sur le site web Elasticsearch.

Lorsque d'autres groupes de journaux essaient d'appeler la même fonction Lambda, l'appel échoue avec le message d'erreur suivant :

"reason": "Rejecting mapping update to [<index_name>] as the final mapping would have more than 1 type: [log-group-1, log-group-2]”

Pour résoudre ce problème, mettez à jour votre fonction Lambda avec la syntaxe suivante :

var indexName = [
        'cwl-' + payload.logGroup.toLowerCase().split('/').join('-') + '-' + timestamp.getUTCFullYear(),
        ('0' + (timestamp.getUTCMonth() + 1)).slice(-2),
        ('0' + timestamp.getUTCDate()).slice(-2) 
        ].join('.');

Cette syntaxe crée plusieurs index pour les différents groupes de journaux diffusés en streaming dans votre domaine Amazon ES. Ensuite, enregistrez la fonction Lambda mise à jour pour créer des index distincts pour les différents groupes de journaux diffusés en streaming dans votre domaine Amazon ES.

Je ne parviens pas à diffuser en continu vers un domaine Amazon ES basé sur VPC dans le même compte AWS

Important : avant de diffuser les groupes de journaux CloudWatch vers votre domaine Amazon ES basé sur VPC, veillez à mettre à jour votre stratégie de rôle AWS Identity and Access Management (IAM). La stratégie AWSLambdaVPCAccessExecutionRole doit être attachée au rôle IAM attaché à la fonction Lambda correspondante.

Voici une stratégie AWSLambdaVPCAccessExecutionRole au format JSON :

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:CreateLogGroup",
                "logs:CreateLogStream",
                "logs:PutLogEvents",
                "ec2:CreateNetworkInterface",
                "ec2:DescribeNetworkInterfaces",
                "ec2:DeleteNetworkInterface"
            ],
            "Resource": "*"
        }
    ]
}

Remarque : cette stratégie gérée permet à la fonction Lambda d'écrire le groupe de journaux CloudWatch dans le cluster Elasticsearch du VPC.

Une fois que vous avez attaché la stratégie à votre fonction Lambda, commencez à diffuser les journaux en streaming vers votre domaine Amazon ES dans le VPC.

Je ne parviens pas à diffuser mon groupe de journaux CloudWatch vers un domaine Amazon ES lorsque le contrôle à fine granularité des accès est activé

Si vous diffusez en streaming vos journaux CloudWatch Logs vers un domaine Amazon ES avec un contrôle d'accès à fine granularité, vous pouvez rencontrer l'erreur d'autorisation suivante :

"{\"statusCode\":403,\"responseBody\":{\"error\":{\"root_cause\":[{\"type\":\"security_exception\",\"reason\":\"no permissions for [indices:data/write/bulk] and User [name=arn:aws:iam::123456789101:role/lambda_elasticsearch_execution, roles=[arn:aws:iam::123456789101:role/lambda_elasticsearch_execution], requestedTenant=null]\"}],\"type\":\"security_exception\",\"reason\":\"no permissions for [indices:data/write/bulk] and User [name=arn:aws:iam::123456789101:role/lambda_elasticsearch_execution, roles=[arn:aws:iam::123456789101:role/lambda_elasticsearch_execution], requestedTenant=null]\"},\"status\":403}}"

Si vous recevez ce message d'erreur à partir des journaux de la fonction Lambda, cela indique que le mappage de rôle est incomplet.

Remarque : par défaut, Amazon ES crée une fonction AWS Lambda pour vous. 

Pour résoudre le message d'erreur, effectuez les opérations suivantes :

1.    Ouvrez Kibana. Vous pouvez trouver un lien vers Kibana dans le récapitulatif du domaine de votre console Amazon ES.

2.    Dans le volet de navigation de gauche, cliquez sur l'icône de verrouillage.

3.    Sélectionnez Mappages de rôle.

4.    Choisissez all_access et security_manager comme rôles.

Remarque : le rôle all_access donne accès uniquement à votre cluster Elasticsearch. En fonction de votre cas d'utilisation, vous pouvez également ajouter un contrôle d'accès à fine granularité à votre cluster Elasticsearch.

5.    Modifiez le mappage pour all_access.

6.    Pour Rôle principal, ajoutez le rôle d'exécution de la fonction Lambda et choisissez Soumettre. Vos journaux doivent maintenant être diffusés en streaming vers votre domaine Amazon ES.

Pour plus d'informations sur le mappage des rôles, consultez la section Mappage des rôles aux utilisateurs.

Je reçois une erreur cluster_block_exception

Les exceptions de bloc de cluster sont causées par les éléments suivants :

  • Manque d'espace de stockage libre
  • Pression de mémoire JVM excessive

Pour plus d'informations sur le dépannage des exceptions de bloc de cluster, consultez ClusterBlockException.</p


Cet article vous a-t-il été utile ?


Besoin d'aide pour une question technique ou de facturation ?