Comment résoudre l'erreur « The final policy size is bigger than the limit » (La taille de la stratégie finale dépasse la limite) qui se produit dans Lambda ?

Dernière mise à jour: 14/04/2021

Lorsque je définis un déclencheur afin d'appeler une fonction AWS Lambda, je reçois le message d'erreur « La taille finale de la stratégie dépasse la limite ». Comment puis-je corriger ce problème ?

Brève description

Si la stratégie basée sur les ressources de votre fonction Lambda est supérieure à 20 Ko, Lambda renvoie l'erreur La taille finale de la stratégie dépasse la limite.

L'erreur peut se produire lorsque vous ajoutez des instructions de stratégie à la stratégie basée sur les ressources de votre fonction en effectuant l'une des opérations suivantes :

Pour résoudre cette erreur, réduisez la taille de la stratégie de votre fonction en supprimant les instructions répétitives et en les remplaçant par des instructions consolidées qui utilisent les caractères génériques (*). Pour obtenir des informations supplémentaires, consultez la section Quotas de Lambda et Nettoyage des stratégies basées sur les ressources.

Solution

Remarque : si vous recevez des erreurs lors de l'exécution des commandes AWS CLI, utilisez la version d'AWS CLI la plus récente.

Vérification des stratégies basées sur les ressources de votre fonction

Remarque : dans les commandes suivantes, remplacez my-function par le nom ou l'Amazon Resource Name (ARN) de votre fonction.

1.    Exécutez la commande AWS CLI get-policy suivante pour rechercher et examiner la stratégie basée sur les ressources de votre fonction Lambda :

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

Remarque : vous pouvez également utiliser le processeur de ligne de commande JSON, jq, dans la commande get-policy, pour écrire des requêtes avancées. Pour obtenir des instructions sur le téléchargement et l'installation du processeur jq, consultez la page Download jq du site Web GitHub qui lui est dédié.

Exemple de commande get-policy qui utilise jq pour formater la stratégie d'une fonction Lambda en tant que fichier JSON

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

Exemple de commande get-policy qui utilise jq pour trouver la taille de la stratégie d'une fonction Lambda

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

Exemple de commande get-policy qui utilise jq pour trouver l'identifiant d'instruction (Sid) de certaines instructions de stratégie

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

Remarque : remplacez events.amazonaws.com par le service AWS qui appelle votre fonction.

Exemple de commande get-policy qui utilise jq pour obtenir l'identifiant d'instruction des ressources dont les noms commencent par la même chaîne

$ 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'

Remarque : remplacez arn:aws:events:region:account-id:rule/test- par une chaîne partagée par les ARN des ressources au niveau de plusieurs instructions répétitives.

2.    Dans la stratégie basée sur les ressources, identifiez les instructions que vous pouvez remplacer par un caractère générique. Notez l'identifiant d'instruction de chaque instruction de stratégie.

Supprimer les instructions de stratégie répétitives

Exécutez la commande AWS CLI remove-permission suivante pour supprimer chaque instruction de stratégie répétitive :

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

Remarque : remplacez my-function par le nom ou l'ARN de votre fonction. Remplacez sid par le Sid de l'instruction de stratégie que vous souhaitez supprimer.

Ajouter des instructions de stratégie qui incluent un caractère générique (*)

Utilisez la commande AWS CLI add-permission pour ajouter de nouvelles instructions consolidées qui incluent un caractère générique (*) :

$ 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-*'

Remarque : remplacez my-function par le nom ou l'ARN de votre fonction. Remplacez sid par un nouveau Sid. Remplacez également events.amazonaws.com par le service AWS ou le principal qui appelle votre fonction. Remplacez arn:aws:events:region:account-id:rule/test-* par une chaîne ARN (et un caractère générique) partagé par les ressources pour lesquelles vous accordez des autorisations.

Pour plus d'informations, consultez la section Autorisation d'accès à une fonction pour les services AWS.