Quand j'ai essayé d'utiliser le kit AWS SDK avec Ruby + Lambda, `sam local` était en panne.

Qu'est-il arrivé

J'utilisais Lambda dans une implémentation Ruby. Je développais en utilisant l'AWS SAM CLI. Le développement lui-même s'est bien déroulé, mais lorsque j'ai changé pour utiliser le kit AWS SDK pour ajouter des fonctionnalités, sam local est devenu très lent. J'ai découvert qu'il serait étrange d'être aussi lent avec un exemple d'application aussi simple.

Cliquez ici pour un exemple de projet (https://github.com/suruseas/lamba-gemfile-test)

Juste une conclusion rapide

Le kit SDK AWS est installé dans l'environnement d'exécution Lambda pour chaque environnement, il n'a donc pas besoin d'être inclus dans le package de déploiement Lambda.

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/lambda-runtimes.html

Surtout pour Ruby, ** pas besoin d'écrire "gem'aws-sdk ',' ~> 3 '" dans le Gemfile **! C'est très désagréable si vous avez l'habitude d'écrire les gemmes que vous utilisez normalement dans le Gemfile, mais il n'y a pas de problème car vous pouvez avoir besoin de gemmes installées dans des gemmes globales telles quelles.

Comparer quand "gem'aws-sdk ',' ~> 3 '" est écrit dans Gemfile (avant modification) et supprimé (après modification)

La taille du package change considérablement selon qu'il est écrit ou non dans Gemfile (le SDK AWS seul est proche de 23 Mo), la différence est donc importante.

Au fait, avant la correction, sam local fonctionnait à peine, donc seulement la comparaison. Après le déploiement, cela n'a pas fonctionné sans une augmentation significative de la mémoire et du délai d'expiration de Lambda.

Avant correction

ʻInit Duration: 54544,65 ms`, ce qui prend un temps considérable.

$ sam local invoke HelloWorldFunction --event events/event.json --env-vars env.json
Invoking app.lambda_handler (ruby2.5)

Fetching lambci/lambda:ruby2.5 Docker container image......
Mounting /home/ubuntu/environment/test/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated inside runtime container
START RequestId: 22ddc38d-745a-1d37-0ce9-324760f75ec4 Version: $LATEST
END RequestId: 22ddc38d-745a-1d37-0ce9-324760f75ec4
REPORT RequestId: 22ddc38d-745a-1d37-0ce9-324760f75ec4  Init Duration: 54544.65 ms      Duration: 801.49 ms     Billed Duration: 900 ms Memory Size: 128 MBMax Memory Used: 60 MB

{"statusCode":200,"body":"{\"message\":\"t2.micro\"}"}

modifié

ʻInit Duration: 2266.99 ms` et amélioré!

$ sam local invoke HelloWorldFunction --event events/event.json --env-vars env.json
Invoking app.lambda_handler (ruby2.5)

Fetching lambci/lambda:ruby2.5 Docker container image......
Mounting /home/ubuntu/environment/test/.aws-sam/build/HelloWorldFunction as /var/task:ro,delegated inside runtime container
START RequestId: a81dffd9-915d-13db-3ed7-4fe0e3b63464 Version: $LATEST
END RequestId: a81dffd9-915d-13db-3ed7-4fe0e3b63464
REPORT RequestId: a81dffd9-915d-13db-3ed7-4fe0e3b63464  Init Duration: 2266.99 ms       Duration: 557.91 ms     Billed Duration: 600 ms Memory Size: 128 MBMax Memory Used: 58 MB

{"statusCode":200,"body":"{\"message\":\"t2.micro\"}"}

finalement

Si vous utilisez Lambda, vous devrez payer un supplément si vous ne faites pas attention à la taille et aux performances. Temps de traitement léger et taille de l'emballage. Je souhaite le soutenir en utilisant la division Lambda et les couches AWS Lambda.

Recommended Posts

Quand j'ai essayé d'utiliser le kit AWS SDK avec Ruby + Lambda, `sam local` était en panne.
[Ruby] C'est la solution. Quand dois-je utiliser des variables d'instance?
Rubocop se met en colère quand j'essaye de remplir zéro (remplir 0) avec Ruby
J'ai essayé de visualiser l'accès de Lambda → Athena avec AWS X-Ray
Lorsque j'essaye de m'inscrire avec devise, il redirige automatiquement vers root_path
Comment utiliser le framework Java avec AWS Lambda! ??
Jusqu'à ce que vous exécutiez un programme Java avec le SDK AWS local sur Windows
Un avertissement s'affiche lorsque vous essayez d'utiliser un entier énorme avec les variables spéciales $ 1, $ 2, $ 3 ...
L'histoire à laquelle j'étais accro lors de la création de STS
J'ai essayé de résoudre le problème de la "sélection multi-étapes" avec Ruby
Lorsque l'accès demandé à la ressource est refusé lors de la transmission avec Docker
Essayez d'exécuter SlackBot réalisé avec Ruby x Sinatra sur AWS Lambda
J'ai eu un IllegalAccessError en essayant d'utiliser PowerMock avec JUnit
Ce que j'ai fait lorsque la base de données n'a pas démarré avec docker-compose up
J'obtiens une erreur de version de Ruby lorsque j'essaye de démarrer Rails.
[IOS] Que faire lorsque l'image est remplie d'une seule couleur
Problèmes auxquels j'étais accro lors de la création de l'environnement digdag avec docker
J'ai essayé de résoudre le problème de la séquence Tribonacci en Ruby, avec récurrence.
Points à garder à l'esprit lors de l'utilisation d'Apache PDFBox® avec AWS Lambda
J'ai essayé d'utiliser pleinement le cœur du processeur avec Ruby
Remarques sur ce qu'il faut faire lorsque EC2 est configuré avec t2.micro
Je souhaite utiliser DBViewer avec Eclipse 2018-12! !!
Lorsque j'ai poussé vers Docker Hub, l'accès à la ressource m'a été refusé
Initialiser le tableau Ruby avec 0 comme Java, c'est-à-dire définir la valeur par défaut sur 0
[Eclipse] Je veux utiliser la fonction de complétion, mais je veux réussir à confirmer la complétion avec un espace
Turbolinks: je veux résoudre le problème que JS ne s'affiche pas correctement à moins d'être rechargé lors de la transition avec link_to
Vous pouvez le faire tout de suite avec Serverless Framework Serverless with AWS (API + Lambda [java] est facile à configurer)