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.

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.

%d bloggers like this: