Wie behebe ich den Fehler „The final policy size is bigger than the limit“ von Lambda?

Lesedauer: 4 Minute
0

Wenn ich einen Auslöser setze, um meine AWS-Lambda-Funktion aufzurufen, erhalte ich die Fehlermeldung „The final policy size is bigger than the limit“. Wie behebe ich den Fehler?

Kurzbeschreibung

Wenn die ressourcenbasierte Richtlinie Ihrer Lambda-Funktion über 20 KB groß ist, gibt Lambda den Fehler The final policy size is bigger than the limit zurück.

Der Fehler kann auftreten, wenn Sie der ressourcenbasierten Richtlinie Ihrer Funktion Richtlinienanweisungen hinzufügen, indem Sie einen der folgenden Schritte ausführen:

Um den Fehler zu beheben, reduzieren Sie die Größe der Richtlinie Ihrer Funktion, indem Sie sich wiederholende Richtlinienanweisungen entfernen und durch konsolidierte Anweisungen ersetzen, die Platzhalter (*) verwenden. Weitere Informationen finden Sie unter Lambda-Kontingente und Bereinigen von ressourcenbasierten Richtlinien.

Lösung

Hinweis: Wenn beim Ausführen von AWS-CLI-Befehlen Fehler auftreten, stellen Sie sicher, dass Sie die neueste Version von AWS CLI verwenden.

Überprüfen der ressourcenbasierten Richtlinien Ihrer Funktion

Hinweis: Ersetzen Sie für die folgenden Befehle my-function durch den Namen Ihrer Funktion oder den Amazon-Ressourcennamen (ARN).

1.    Führen Sie den folgenden get-policy-Befehl in AWS CLI aus, um die ressourcenbasierte Richtlinie Ihrer Lambda-Funktion zu finden und zu überprüfen:

$ aws lambda get-policy --function-name my-function

Hinweis: Sie können auch den Befehlszeilen-JSON-Prozessor jq im Befehl get-policy verwenden, um erweiterte Abfragen zu schreiben. Informationen zum Herunterladen und Installieren von jq finden Sie unter Download jq auf der jq-Website bei GitHub.

Beispiel für einen get-policy-Befehl, der jq verwendet, um die Richtlinie einer Lambda-Funktion als JSON-Datei zu formatieren

$ aws lambda get-policy --function-name my-function | jq '.Policy|fromjson'

Beispiel für einen get-policy-Befehl, der jq verwendet, um die Größe der Richtlinie einer Lambda-Funktion zu ermitteln

$ aws lambda get-policy --function-name my-function | jq -r '.Policy' | wc -c

Beispiel für einen get-policy-Befehl, der jq verwendet, um die Anweisungs-ID (Sid) bestimmter Richtlinienanweisungen zu finden

Ersetzen Sie events.amazonaws.com durch den AWS-Service, der Ihre Funktion aufruft.

$ aws lambda get-policy --function-name my-function | jq '.Policy
| fromjson
| .Statement[]
| select(.Principal.Service=="events.amazonaws.com")
| .Sid'

Beispiel für einen get-policy-Befehl, der jq verwendet, um die Sid von Ressourcen abzurufen, deren Namen mit derselben Zeichenfolge beginnen

Ersetzen Sie arn:aws:events:region:account-id:rule/test- durch eine Zeichenfolge, die die ARNs der Ressourcen mehrerer sich wiederholender Richtlinienanweisungen gemeinsam haben.

$ aws lambda get-policy --function-name my-function | jq '.Policy
| fromjson
| .Statement[]
| select(.Condition.ArnLike."AWS:SourceArn" | startswith("arn:aws:events:region:account-id:rule/test-"))
| .Sid'

2.    Identifizieren Sie in der ressourcenbasierten Richtlinie die Richtlinienanweisungen, die Sie durch einen Platzhalter ersetzen können. Notieren Sie sich die Sid jeder Richtlinienanweisung.

Entfernen sich wiederholender Richtlinienanweisungen

Führen Sie den folgenden remove-permission-Befehl in AWS CLI aus, um jede sich wiederholende Richtlinienanweisung zu entfernen. Ersetzen Sie my-function durch den Namen oder den ARN Ihrer Funktion. Ersetzen Sie sid durch die Sid der Richtlinienanweisung, die Sie entfernen möchten.

$ aws lambda remove-permission --function-name my-function --statement-id sid

Hinzufügen von Richtlinienanweisungen, die einen Platzhalter (*) verwenden

Führen Sie den folgenden add-permission-Befehl in AWS CLI aus, um neue, konsolidierte Richtlinienanweisungen hinzuzufügen, die einen Platzhalter (*) verwenden. Ersetzen Sie my-function durch den Namen oder den ARN Ihrer Funktion. Ersetzen Sie sid durch eine neue Sid mit einem beliebigen Wert. Ersetzen Sie events.amazonaws.com durch den AWS-Service oder Kontoprinzipal, der Ihre Funktion aufruft. Ersetzen Sie arn:aws:events:region:account-id:rule/test-* durch eine ARN-Zeichenfolge (plus einen Platzhalter), die die Ressourcen gemeinsam haben, denen Sie Berechtigungen erteilen.

$ aws lambda add-permission --function-name my-function \
--statement-id 'sid' \
--action 'lambda:InvokeFunction' \
--principal 'events.amazonaws.com' \
--source-arn 'arn:aws:events:region:account-id:rule/test-*'

Hinweis: Auslöser mit Platzhaltern in der ressourcenbasierten Richtlinie sind in der Lambda-Konsole möglicherweise nicht sichtbar. Weitere Informationen finden Sie unter Ereignisgesteuertes Aufrufen.

Weitere Informationen finden Sie unter Gewähren des Funktionszugriffs auf AWS-Services.


Ähnliche Informationen

IAM-JSON-Richtlinienelemente: Resource

Steuern der Befehlsausgabe von der AWS CLI (AWS-CLI-Benutzerhandbuch)

Why doesn't my Amazon S3 event notification invoke my Lambda function?

Wie stoppe und starte ich Amazon EC2-Instances in regelmäßigen Abständen mit Lambda?

AWS OFFICIAL
AWS OFFICIALAktualisiert vor 2 Jahren