Die AWS Lambda-Funktion kann nicht in CloudWatch protokolliert (Textausgabe) werden

74

Ich versuche, eine Lambda-Funktion einzurichten, die eine Datei verarbeitet, wenn sie in einen S3-Bucket hochgeladen wird. Ich brauche eine Möglichkeit, um die Ausgabe console.logbeim Hochladen einer Datei zu sehen, kann aber nicht herausfinden, wie ich meine Lambda-Funktion mit CloudWatch verknüpfe.

Ich habe es mir überlegt, indem ich contextmir das Objekt angesehen habe, das meine Protokollgruppe /aws/lambda/wavToMp3und der Protokolldatenstrom ist 2016/05/23/[$LATEST]hex_code_redacted. Also habe ich diese Gruppe und diesen Stream in CloudWatch erstellt, aber es wird nichts daran protokolliert.

ffxsam
quelle
1
Können Sie context.logGroupName und context.logStreamName in der Lamda-Konsole protokollieren? und bestätigen Sie dann, ob Sie den richtigen Stream überprüfen.
Shibashis
Ja, das habe ich getan. So habe ich die Gruppe und den Stream überhaupt erst bekommen.
ffxsam
Interessant ist normalerweise, dass hierfür keine zusätzliche Konfiguration erforderlich ist. Haben Sie versucht, vom aws lambda-Überwachungsbildschirm zur Cloudwatch-Konsole zu navigieren? Befindet sich oben rechts ein Link?
Shibashis
2
Der einzige Grund, an den ich denken kann, ist die fehlende Erlaubnis für die Lambda-Ausführungsrolle? Können Sie bestätigen, dass die Rolle über die folgenden Berechtigungen verfügt: "Protokolle: CreateLogGroup", "Protokolle: CreateLogStream", "Protokolle: PutLogEvents".
Shibashis
1
@Shibashis JA. Das war's. Machen Sie das zu Ihrer offiziellen Antwort und ich werde es akzeptieren.
ffxsam

Antworten:

123

Damit die Lambda-Funktion einen Protokolldatenstrom erstellen und Protokolle in Cloudwatch veröffentlichen kann, muss die Lambda-Ausführungsrolle über die folgenden Berechtigungen verfügen.

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

Weitere Informationen finden Sie in der folgenden AWS-Dokumentation unter http://docs.aws.amazon.com/lambda/latest/dg/intro-permission-model.html#lambda-intro-execution-role

Shibashis
quelle
17
Beachten Sie die Antwort von hoonoh unten, ich musste die Einstellungen aktualisieren, bevor diese neue Richtlinie tatsächlich angewendet wurde.
Steve Smith
3
Ich bin hierher gekommen, weil ich das gleiche Problem hatte, in meinem Fall war der Fehler Log group not found. Wenn Sie es hier
hinzufügen,
1
Wie von @SteveSmith gesagt, sehen Sie sich die Antwort von hoonoh unten an (die mehr Stimmen als diese akzeptierte Antwort hat): Sie funktioniert nur, wenn Sie das Lambda aktualisieren, nachdem Sie seine Richtlinie aktualisiert haben (Ändern des Zeitlimits, Hinzufügen einer Dummy-Umgebungsvariable usw.) )
Christophe Blin
167

Nachdem Sie Ihre Richtlinie aktualisiert haben, müssen Sie anscheinend die Einstellungen Ihrer Funktion aktualisieren, um alle Jobinstanzen zu aktualisieren und neue Richtlinien zu lesen.

Wenn Sie also nach dem Aktualisieren Ihrer Rollenrichtlinie in IAM in der Lambda-Konsole einfach auf die Schaltfläche "Testen" klicken, verfügen die zwischengespeicherten Lambda-Instanzen weiterhin über alte Rollenberechtigungen, sodass weiterhin keine Protokolle in Cloudwatch-Protokolle geschrieben werden.

Ändern Sie einfach Ihr Timeout um eine Sekunde und klicken Sie auf die Schaltfläche "Speichern und testen". Daraufhin werden Protokolle in Cloudwatch angezeigt.

hoonoh
quelle
17
Vielen Dank! Ich war eine Stunde lang dabei.
Reggie3
7
Dies ist meine Stimme für die richtige Antwort. Nichts in der Dokumentation hilft, wenn Sie auf diesen AWS-Fehler stoßen.
Brycem
2
Danke dafür ... hier steckte ich auch fest.
John Chrysostom
1
Vielen Dank ! Sie sollten mindestens eine 'Rolle / Richtlinie neu laden' im Lambda-Rollen-Editor hinzufügen, damit Sie keine Dummy-Bearbeitung durchführen müssen. Oder sogar eine Option zum "Weitergeben" eines Richtlinienupdates.
Martin
1
Es wäre großartig, wenn diese Antwort mit der akzeptierten zusammengeführt werden könnte - sie sind Teil desselben Prozesses, der zur Lösung des Problems erforderlich ist.
Michael Berry
17

Damit die Lambda-Funktion einen Protokolldatenstrom erstellen und Protokolle in Cloudwatch veröffentlichen kann, muss die Lambda-Ausführungsrolle über die folgenden Berechtigungen verfügen

Ich hatte diese Berechtigungen bereits, aber es hat nicht funktioniert.

Ändern Sie einfach Ihr Timeout um eine Sekunde und klicken Sie auf die Schaltfläche "Speichern und testen". Daraufhin werden Protokolle in Cloudwatch angezeigt.

Ich habe das Timeout geändert, gespeichert und die Protokolle haben immer noch nicht funktioniert.

Ich habe eine andere Rolle zugewiesen und die Protokolle haben immer noch nicht funktioniert.

Am Ende habe ich auf "Benutzerdefinierte Rolle erstellen" und dann auf "Zulassen" geklickt. Dies war es und Protokolle wurden generiert, aber da ich keine neue Rolle, sondern meine vorhandene Rolle verwenden wollte, habe ich einfach meine vorhandene Rolle danach zugewiesen und es hat funktioniert. Technisch gesehen hätte ich also zur ursprünglichen Konfiguration zurückkehren sollen, die nicht funktioniert hat, aber jetzt funktioniert sie. Stelle dir das vor.

Tomusiaka
quelle
1
Das gleiche gilt für 2 Stunden, um dies zu lösen. Enttäuscht darüber, wie fehlerhaft und absolut nicht transparent und nicht intuitiv das Lambda-zu-Cloudwatch-Setup ist. Vielen Dank!
Alecxe
Das ist schrecklich. Jemand sollte ernsthaft mit AWS Lambda konkurrieren. Es ist, als hätten sie keinen Anreiz, den Service zu verbessern.
Cameron A. Ellis
1
Ist mir auch passiert, und ich bin mir ziemlich sicher, dass ich die Ausführungsrolle in eine vorhandene Rolle geändert habe, die keine expliziten Berechtigungen zum Erstellen / Schreiben in den Cloudwatch-Protokolldatenstrom für mein Lambda hatte.
user2719094
Vielen Dank! Es funktionierte!
Krishna
4

Anscheinend besteht eine weitere Notwendigkeit für die Protokollierung darin, dass die Lambda-Funktion den Abschluss anzeigen muss. Im Python-Kontext muss der Handler beispielsweise etwas anderes als zurückgeben None.

Vic
quelle
1

Stellen Sie sicher, dass Sie in Ihrer Lambda-Funktion "Konfiguration" den vollständigen Pfad Ihrer "vorhandenen Rolle" haben:

Rolle: Wählen Sie eine vorhandene Rolle aus. Vorhandene Rolle: Servicerolle / Ihr Rollenname

Aus irgendeinem Grund funktioniert die Eingabe nur Ihres Rollennamens für einige Dienste (wie SES), nicht jedoch für CloudWatch.

Sie können auch versuchen, eine neue Rolle zu erstellen, anstatt eine vorhandene zu verwenden. Dadurch wird die Rolle mit der richtigen Konfiguration erstellt (hoffentlich).

Leonardo Max Almeida
quelle
1

Das Problem bestand darin, dass ich versucht habe, eine Protokollgruppe im Cloudformation-Skript zu erstellen, indem: AWS :: Logs :: LogGroup, und dann versucht wurde, das Lambda-Protokoll in diese Protokollgruppe zu verschieben. : P Anfänger Nach sorgfältiger Lektüre stellte ich fest, dass Lambda ein eigenes Protokoll mit dem oben genannten Format erstellt: / aws / lambda / Wir müssen dieser Protokollgruppe nur eine Richtlinienberechtigung oder nur eine generische Berechtigung mit der Ressource: arn: aws: Protokolle ::: *

hoffe das hilft

Anupam Mahapatra
quelle
0

Vielleicht etwas spät, aber für diejenigen, die immer noch Schwierigkeiten haben, die Lambda-Protokolle in Cloudwatch zu sehen. Ich habe Folgendes in Bezug auf die Ausführungsrolle der Lambda-Funktion festgestellt: "Sie können eine vorhandene Rolle mit dieser Funktion verwenden. Beachten Sie, dass die Rolle von Lambda übernommen werden muss und über Berechtigungen für Cloudwatch-Protokolle verfügen muss." In IAM habe ich der Rolle, die ich meiner Funktion zugewiesen habe, "CloudWatchLogsFullAccess" gewährt. In Cloudwatch werden unter Protokolle die Protokolle für die Funktionen angezeigt, denen diese Rolle zugewiesen wurde.

Clive Sargeant
quelle
0

Wie in anderen Antworten angegeben, müssen Sie Lambda die Berechtigung erteilen, Protokolle in Cloud-Watch-Protokollen zu veröffentlichen. AWS hatte nur dafür AWSLambdaExecuteRichtlinien bereitgestellt . Es ist json ist -

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "logs:*"
            ],
            "Resource": "arn:aws:logs:*:*:*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "s3:GetObject",
                "s3:PutObject"
            ],
            "Resource": "arn:aws:s3:::*"
        }
    ]
}

Sie können diese Richtlinie zu Ihrer Rolle hinzufügen, die Ihrem Lambda zugewiesen ist, und Sie sollten die Protokolle anzeigen.

HINWEIS: Es hat auch S3 Lese- / Schreibzugriff. Wenn Sie dies nicht möchten, können Sie eine benutzerdefinierte Richtlinie nur mit dem Protokollteil erstellen.

Aniket Thakur
quelle
0

Es könnte bereits protokolliert werden, wir konnten die erwarteten Protokolle einfach nicht finden ...

z.B

app.use(function simpleLogger (req, res, next) {
  console.info('[Logger]', req.method, req.originalUrl)
  next()
})

Nach der Durchführung GET /hello?world=1,

Lokale Konsole: (einfach und klar, nett!)

[Logger] GET /hello?world=1

CloudWatch-Protokolle: (Können Sie das genaue Protokoll unten leicht finden?)

START RequestId: a3552c34-f7a6-11e8-90ba-2fb886f31fb0 Version: $LATEST
2018-12-04T09:26:11.236Z  a3552c34-f7a6-11e8-90ba-2fb886f31fb0  [Logger] GET /hello?world=1
END RequestId: a3552c34-f7a6-11e8-90ba-2fb886f31fb0
REPORT RequestId: a3552c34-f7a6-11e8-90ba-2fb886f31fb0  Duration: 41.02 ms  Billed Duration: 100 ms Memory Size: 128 MB Max Memory Used: 29 MB

Fazit: Zu ausführlich, um die Originalprotokolle zu finden.

Kenberkeley
quelle
0

Ich bin auf dieses Problem gestoßen, aber keine der obigen Antworten hat mein Problem gelöst. Es stellt sich heraus, dass die Region irgendwie auf Ohio eingestellt war, als ich CloudWatch zum ersten Mal startete. Nachdem ich es in US East (N. Virginia) geändert habe, funktioniert alles einwandfrei.

lolofoobar
quelle
0

CloudWatch& CloudWatch Logssind verschiedene Berechtigungen, müssen Sie CloudWatch Logsder Richtlinie hinzufügen , die mit Ihrer Rolle verbunden ist.

Sherry Li
quelle
0

Es gibt eine Beschreibung mit dem Titel " Überwachen von AWS Lambda mit CloudWatch" mit einem Abschnitt "Verwenden von CloudWatch-Protokollen mit Lambda". Sieht so aus, als hätten Sie Ihre Antwort bereits gefunden, aber für alle ohne IAM-spezifische Probleme kann dies hilfreich sein.

mbarlocker
quelle
0

Möglicherweise möchten Sie der Protokollausgabe die Spalte Letzte Aufnahmezeit hinzufügen . Es dauert einige Minuten, bis alle meine Ereignisse geschrieben sind.

CM
quelle
0

Obwohl dies bereits beantwortet wurde, wollte ich nur meine Erfahrung hinzufügen, die für andere nützlich sein könnte.

Sogar die Berechtigungen sind entsprechend eingestellt, damit Lambda sich bei Cloudwatch anmelden kann. Manchmal dauert es 3-4 Stunden, um die Protokollgruppen wiederzugeben.

In meinem Fall bei Verwendung von Lambda für DynamoDB-Ereignisse, bei denen Lambda alle erforderlichen Berechtigungen für Cloudwatch und DynamoDB erteilt wurde. Es dauerte 4 Stunden, bis die Protokolle wiedergegeben wurden. Möglicherweise sind einige Synchronisierungsprobleme von AWS zu Ende. Nach 4 Stunden ohne Aktion von meinem Ende konnte ich die Cloudwatch-Protokolle sehen.

Stellen Sie außerdem sicher, dass Sie die Protokolle in derselben Region durchsuchen, in der Ihre Funktion erstellt wurde.

Santhosh
quelle
0

Juli 2020 Update !!

Protokolle befinden sich möglicherweise nicht in us-east-1. Suchen Sie nach Lambda-Randprotokollen in verschiedenen Regionen!

jellycsc
quelle