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

Dernière mise à jour : 16/08/2022

Lorsque je définis un déclencheur afin d'appeler une fonction AWS Lambda, je reçois le message d'erreur « The final policy size is bigger than the limit » (La taille finale de la politique 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 politique 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 politique 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 politique

Remplacez events.amazonaws.com par le service AWS qui appelle votre fonction.

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

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

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.

$ 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.    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 politique répétitives

Exécutez la commande AWS CLI remove-permission suivante pour supprimer chaque instruction de politique répétitive. Remplacez my-function par le nom ou l'ARN de votre fonction. Remplacez sid par le Sid de l'instruction de politique que vous voulez supprimer.

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

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

Exécutez la commande AWS CLI add-permission suivante pour ajouter de nouvelles instructions de politique consolidées qui incluent un caractère générique (*). Remplacez my-function par le nom ou l'ARN de votre fonction. Remplacez sid par un nouveau Sid de n'importe quelle valeur. 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.

$ 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 : les déclencheurs avec des caractères génériques dans la politique basée sur les ressources peuvent ne pas être visibles dans la console Lambda. Pour plus d'informations, consultez Appel basé sur les événements.

Pour plus d'informations, consultez Octroi à la fonction de l'accès aux services AWS.