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 ?

Courte 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, et que la taille de la stratégie dépasse ensuite la taille maximale de 20 Ko. 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.

Solution

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 l'interface en ligne de commande AWS 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

Vous pouvez également utiliser le processeur 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

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, et 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 \
--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, et sid par un nouvel ID. Remplacez également events.amazonaws.com par le service AWS ou le principal qui appelle votre fonction, et arn:aws:events:region:account-id:rule/test-* par un ARN (et le 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.