Comment dois-je procéder en cas d'affichage du message d'erreur « La taille finale de la stratégie dépasse la limite » dans Lambda ?

Date de la dernière mise à jour : 14/04/2020

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 remédier à ce problème ?

Brève description

Ce message d'erreur peut s'afficher lorsque vous tentez d'ajouter des instructions à la stratégie basée sur les ressources de votre fonction Lambda. L'erreur se produit si la taille de la stratégie dépasse la taille maximale de 20 Ko et les instructions ne sont alors pas ajoutées. Cela peut se produire lorsque vous utilisez manuellement la commande add-permission, ou lorsque vous créez des ressources pour d'autres services nécessitant des autorisations afin d'accéder à votre fonction.

Réduisez la taille de la stratégie en supprimant les instructions répétitives et en les remplaçant par des instructions consolidées qui incluent le caractère générique (*).

Pour obtenir des informations supplémentaires, consultez la section Limites AWS Lambda et Nettoyage des stratégies basées sur les ressources.

Résolution

Remarque : Si vous recevez des erreurs lors de l'exécution de commandes depuis l'interface de ligne de commande AWS (AWS CLI), assurez-vous d'utiliser la version la plus récente d'AWS CLI.

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.    Utilisez la commande get-policy dans AWS CLI pour obtenir et vérifier la stratégie basée sur les ressources de votre fonction Lambda :

$ aws lambda get-policy --function-name my-function<br>

Vous pouvez également utiliser le processeur de ligne de commande JSON jq dans la commande get-policy, pour écrire des requêtes avancées.

Remarque : 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é.

Vous pouvez utiliser jq pour formater la stratégie :

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

Vous pouvez également utiliser jq pour afficher la taille de la stratégie :

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

Remarque : si le résultat obtenu avec cette commande est proche de 20480 (soit 20 Ko), le message d'erreur relatif à la taille peut s'afficher lorsque vous essayez d'ajouter d'autres instructions.

Procédez comme suit pour obtenir l'ID de certaines instructions:

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

Procédez comme suit pour obtenir les ID 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. Prenez note de l'ID de chacune des instructions.

Suppression des instructions

Utilisez la commande remote-permission pour supprimer chaque instruction dont vous avez pris note à l'étape précédente :

$ 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 l'ID d'une instruction.

Ajout d'instructions incluant un caractère générique

Utilisez la commande add-permission pour ajouter de nouvelles instructions consolidées qui incluent le caractère générique (*). Par exemple :

$ aws lambda add-permission --function-name my-function \<br>--statement-id sid \<br>--action 'lambda:InvokeFunction' \<br>--principal 'events.amazonaws.com' \<br>--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 nouvel ID de votre choix. Remplacez events.amazonaws.com par le service AWS ou le compte principal qui appelle votre fonction. Remplacez arn:aws:events:region:account-id:rule/test-* par un  ARN (et un caractère générique) partagé par les ressources pour lesquelles vous accordez des autorisations.

Pour obtenir d'autres exemples de commandes et des informations supplémentaires, consultez la section Octroi, aux services AWS, de l'accès à une fonction.