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 :
- L'utilisation manuelle de la commande add-permission de l'interface de ligne de commande AWS (AWS CLI).
- La création de ressources pour d'autres services AWS qui ont besoin d'une autorisation pour accéder à votre fonction.
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.
Informations connexes
Éléments de stratégie JSON IAM : ressource
Contrôle de la sortie des commandes depuis AWS CLI (guide de l'utilisateur de l'AWS CLI)
Pourquoi ma notification d'événement Amazon S3 ne déclenche-t-elle pas ma fonction Lambda ?
Comment arrêter et démarrer des instances Amazon EC2 à des intervalles réguliers avec Lambda ?
Cet article vous a-t-il été utile ?
Besoin d'aide pour une question technique ou de facturation ?