92 votes

Ne parvient pas à obtenir la fonction Lambda AWS pour enregistrer (sortie texte) dans CloudWatch

Je cherche à configurer une fonction Lambda qui traitera un fichier lorsqu'il est téléchargé dans un compartiment S3. J'ai besoin d'un moyen de voir la sortie du console.log lorsque je télécharge un fichier, mais je n'arrive pas à trouver comment lier ma fonction Lambda à CloudWatch.

J'ai découvert en regardant l'objet context que mon groupe de journaux est /aws/lambda/wavToMp3 et le flux de journaux est 2016/05/23/[$LATEST]hex_code_redacted. J'ai donc créé ce groupe et ce flux dans CloudWatch, mais rien n'y est enregistré.

1 votes

Pouvez-vous enregistrer context.logGroupName et context.logStreamName dans la console Lambda ? et ensuite confirmer si vous vérifiez le bon flux.

0 votes

Oui, j'ai fait cela.. c'est comme ça que j'ai obtenu le groupe & le flux en premier lieu.

0 votes

Intéressant, en règle générale, cela ne nécessite aucune configuration supplémentaire, avez-vous essayé de vous rendre sur la console CloudWatch à partir de l'écran de surveillance AWS Lambda, il y a un lien en haut à droite?

185voto

hoonoh Points 831

Après avoir mis à jour votre politique, il semble que vous devez mettre à jour les paramètres de votre fonction pour rafraîchir toutes les instances de travail afin de lire les nouvelles politiques.

Donc, si vous cliquez simplement sur le bouton 'test' depuis la console Lambda après avoir mis à jour votre politique de rôle dans IAM, les instances Lambda mises en cache auront toujours d'anciennes autorisations de rôle, vous ne verrez donc toujours pas de journaux écrits dans les journaux Cloudwatch.

Modifiez simplement votre délai d'une seconde et cliquez sur le bouton 'enregistrer et tester', vous commencerez alors à voir des journaux dans Cloudwatch.

18 votes

Merci! J'étais bloqué sur ceci pendant une heure.

8 votes

Ceci est mon vote pour la réponse correcte. Rien dans la documentation ne sera utile si vous rencontrez ce bug AWS.

2 votes

Merci pour cela... c'est là où j'étais bloqué aussi.

150voto

Shibashis Points 3699

Pour que la fonction lambda crée un flux de journaux et publie des journaux dans CloudWatch, le rôle d'exécution lambda doit avoir les autorisations suivantes.

{
    "Statement": [
        {
            "Action": [
                "logs:CreateLogGroup",
                 "logs:CreateLogStream",
                 "logs:PutLogEvents"
            ],
            "Effect": "Allow",
            "Resource": "arn:aws:logs:*:*:*"
        }
    ]
} 

Veuillez consulter la documentation AWS suivante pour plus de détails http://docs.aws.amazon.com/lambda/latest/dg/intro-permission-model.html#lambda-intro-execution-role

18 votes

Notez la réponse ci-dessous de hoonoh, j'ai dû mettre à jour les paramètres avant que cette nouvelle politique ne s'applique réellement.

6 votes

Je suis venu ici parce que j'ai rencontré le même problème, dans mon cas l'erreur était Groupe de logs non trouvé. Je l'ajoute ici afin que toute personne cherchant sur Google puisse trouver cette réponse.

1 votes

Comme l'a dit @SteveSmith, regardez la réponse de hoonoh ci-dessous (qui a plus de votes que cette réponse acceptée) : cela ne fonctionne que si vous mettez à jour le lambda après avoir mis à jour sa stratégie (modifiant le délai d'attente, ajoutant une variable d'environnement fictive, etc...)

18voto

tomusiaka Points 924

Pour que la fonction lambda crée un flux de journal et publie des journaux dans Cloudwatch, le rôle d'exécution lambda doit avoir les autorisations suivantes

J'avais déjà ces autorisations mais cela n'a pas fonctionné.

Il vous suffit de modifier votre délai d'attente d'une seconde, de cliquer sur le bouton 'Enregistrer et tester', et vous commencerez à voir des journaux dans Cloudwatch.

J'ai modifié le délai d'attente, enregistré et les journaux ne fonctionnaient toujours pas.

J'ai attribué un autre rôle et les journaux ne fonctionnaient toujours pas.

Ce qui a finalement fonctionné pour moi a été de cliquer sur "Créer un rôle personnalisé", puis sur "Autoriser". C'était tout ce dont j'avais besoin et les journaux ont commencé à être générés mais comme je ne voulais pas utiliser un nouveau rôle mais plutôt mon rôle existant, j'ai simplement attribué mon rôle existant par la suite et cela a fonctionné. Techniquement, j'aurais dû revenir à la configuration d'origine qui ne fonctionnait pas, mais maintenant cela fonctionne. Allez comprendre.

2 votes

La même chose ici, j'ai passé environ 2 heures à essayer de résoudre ça. Déçu de la façon dont le paramétrage lambda-to-cloudwatch est bogué, absolument pas transparent et pas intuitif. Merci!

1 votes

C'est terrible. Quelqu'un devrait sérieusement concurrencer AWS Lambda. On dirait qu'ils n'ont aucun incitatif pour améliorer le service.

1 votes

Il m'est également arrivé, et je suis presque sûr que c'est parce que j'ai changé le rôle d'exécution pour un rôle existant qui n'avait pas les autorisations explicites pour créer/écrire dans le flux de journaux CloudWatch pour ma fonction lambda.

8voto

Vic Points 158

Apparemment, une autre nécessité pour que la journalisation se produise est que la fonction Lambda doit indiquer sa complétion; par exemple dans le contexte Python, le gestionnaire doit retourner quelque chose d'autre que None.

1voto

Assurez-vous d'avoir le chemin complet de votre "Rôle existant" dans la "Configuration" de votre fonction lambda :

Rôle : Choisissez un rôle existant Rôle existant : service-role/yourRoleName

Pour une raison quelconque, taper seulement yourRoleName fonctionnera pour certains services (comme SES) mais pas pour CloudWatch.

Vous pouvez aussi essayer de créer un nouveau rôle au lieu d'utiliser un existant. Cela créera le rôle avec la configuration adéquate (espérons-le).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X