Minimiser la taille de ses lambdas en évitant d’avoir boto3 et ses stubs dans le paquet à déployer

Si vous avez des problèmes de lambdas AWS qui excèdent la limite de 250Mo, voici une astuce qui pourrait vous aider.

Tout d’abord, il est bon de savoir que, à moins d’avoir besoin d’une version spécifique, vous n’avez pas besoin d’inclure boto3 dans vos déploiements car cette librairie est fournie de base avec l’environnement d’exécution.

Quand on sait que boto3 occupe ~1.3Mo et botocore, qui vient avec, ~65Mo, c’est majeur.

Il existe cependant des situations dans lesquelles boto3 est une dépendance d’une de vos dépendances, et du coup, le revoilà dans le décor. C’est possiblement le cas si vous utilisez mypy et les stubs boto, et que vous deviez typer explicitement un objet provenant de boto, par exemple dans une signature de fonction.

from mypy_boto3_dynamodb.service_resource import DynamoDBServiceResource

def do_stuff(dynamodb: DynamoDBServiceResource) -> None:
    ...

Comme boto3-stubs ne vient pas dans l’environnement d’exécution Lambda, ce code plante s’il est déployé sans ladite librairie. Il faut donc l’inclure. Mais, comme cette librairie dépend de boto3, vous vous retrouverez avec boto3 au complet dans votre déploiement.

En modifiant le code, il y a moyen de contourner le problème.

try:
    from mypy_boto3_dynamodb.service_resource import DynamoDBServiceResource
except ModuleNotFoundError:
    DynamoDBServiceResource = "mypy_boto3_dynamodb.service_resource.DynamoDBServiceResource"  # type: ignore

def do_stuff(dynamodb: DynamoDBServiceResource) -> None:
    ...

Localement / dans votre environnement de développement, boto3-stubs est installé et mypy identifiera correctement DynamoDBServiceResource. En production, sans les stubs, la variables devient plutôt une chaîne de caractères. Comme les annotation de types sont ignorées au moment de l’exécution, ça ne change rien.

Fait à noter: il faut annoter l’assignation à la ligne 4 de # type: ignore car mypy identifiera correctement le changement de type de la variable DynamoDBServiceResource, ce qui est une erreur de typage.

Avec cette modification, vous pouvez retourner la librairie boto3-stubs dans vos dépendances de développement et regagner ~66Mo d’espace.

Modification 2022-08-30: Si vous avez des dépendances de production qui dépendent de boto3 et que vous utilisez serverless, il y a une autre solution qui s’applique à vous: Minimiser la taille de ses lambdas en supprimant boto3 du paquet à déployer.

Modification 2022-11-16: Voici une autre méthode qui permet de ne pas avoir les paquets de typage en production.

from typing import TYPE_CHECKING

if TYPE_CHECKING:
    from mypy_boto3_dynamodb.service_resource import DynamoDBServiceResource

def do_stuff(dynamodb: "DynamoDBServiceResource") -> None:
    ...

Leave a Reply

Ce site utilise Akismet pour réduire le pourriel. En savoir plus sur comment les données de vos commentaires sont utilisées.