Wydajność AWS Lambda: JavaScript vs Python vs Golang

Jaki język należy użyć dla AWS Lambda?

Page content

Możemy napisać funkcję lambda do wdrażania na AWS w kilku językach. Porównajmy wydajność (prawie pustych) funkcji napisanych w JavaScript, Pythonie i Golang…

AWS Lambda Function logo

TL;DR

Krótko mówiąc:

Język Billed Duration Warm-up Billed Duration Rozmiar pamięci Maksymalny rozmiar pamięci
Python 197 ms 2 ms 128 MB 32 MB
Python S3 516 ms 35 ms 128 MB 77 MB
JavaScript 2 ms 2 ms 128 MB 63 MB
JavaScript S3 120 ms 72 ms 128 MB 89 MB
Golang 11 ms 1 ms 128 MB 20 MB
Golang S3 30 ms 29 ms 128 MB 38 MB
  • Python ma najdłuższy czas rozgrzewania przy 128 GB RAM,
  • JavaScript jest najwolniejszy ogólnie
  • Golang jest najlepszy spośród trzech, ale nie znacząco

Ciekawa opcja to przyspieszenie funkcji lambda w Pythonie poprzez dodanie więcej pamięci, i jednocześnie procesora. Pomyślałem, że tylko zmniejszy czas rozgrzewania, ale wywołanie do S3 nie stanie się mniej opóźnione.

W syntetycznym teście liczb pierwszych przez AWS - koszt uruchamiania Pythona lambda jest taki sam jak przy użyciu 128MB i 512MB limitu RAM, a wydajność konfiguracji 512MB jest znacznie szybsza.

https://docs.aws.amazon.com/lambda/latest/operatorguide/computing-power.html

Co to jest AWS SAM

Używamy SAM do testowania różnych funkcji lambda tutaj.

AWS SAM to Serverless Application Model.

Projekt AWS SAM obejmuje szablon AWS SAM i kod funkcji. Szablon SAM opisuje, jak wdrażać, uruchamiać i testować funkcję lambda, uprawnienia i inne ważne parametry dla tworzenia stosu CloudFormation.

Aby go użyć, potrzebujemy aws cli i sam cli.

Zainstaluj AWS cli

Jak to zrobić lokalnie: Zainstaluj AWS CLI w dokumentacji Reinstall linux

Lub na stronie AWS: https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html

Zainstaluj SAM cli

Podstawowo - Pobierz zip z instalatorem SAM cli z strony AWS, rozpakuj i zainstaluj

wget https://github.com/aws/aws-sam-cli/releases/latest/download/aws-sam-cli-linux-x86_64.zip
unzip aws-sam-cli-linux-x86_64.zip -d sam-installation
sudo ./sam-installation/install

# sprawdź, czy sam jest zainstalowany
sam --version

Wyczyść pliki instalacyjne

rm -rf sam-installation
rm aws-sam-cli-linux-x86_64.zip

Tworzenie funkcji lambda

Wywołując trzykrotnie skrypt

sam init

i wybierając za każdym razem szablon hello-world, ale różne języki, tworzymy 3 aplikacje sam

Funkcja lambda oparta na Pythonie 3.12

wynik sam init:

    -----------------------
    Generating application:
    -----------------------
    Name: t1-py
    Runtime: python3.12
    Architectures: x86_64
    Dependency Manager: pip
    Application Template: hello-world
    Output Directory: .
    Configuration file: t1-py/samconfig.toml
    
    Następne kroki można znaleźć w pliku README w t1-py/README.md
        

Komendy, które możesz wykonać dalej
=========================
[*] Utwórz pipeline: cd t1-py && sam pipeline init --bootstrap
[*] Walidacja szablonu SAM: cd t1-py && sam validate
[*] Testuj funkcję w chmurze: cd t1-py && sam sync --stack-name {stack-name} --watch

Funkcja lambda oparta na JavaScript i nodejs20.x

wynik sam init:

    -----------------------
    Generating application:
    -----------------------
    Name: t2-js
    Runtime: nodejs20.x
    Architectures: x86_64
    Dependency Manager: npm
    Application Template: hello-world
    Output Directory: .
    Configuration file: t2-js/samconfig.toml
    
    Następne kroki można znaleźć w pliku README w t2-js/README.md
...

Funkcja lambda oparta na Golang (aws obraz al2023)

wynik sam init:

    -----------------------
    Generating application:
    -----------------------
    Name: t3-go
    Runtime: go (provided.al2023)
    Architectures: x86_64
    Dependency Manager: mod
    Application Template: hello-world
    Output Directory: .
    Configuration file: t3-go/samconfig.toml
    
    Następne kroki można znaleźć w pliku README w t3-go/README.md

Budowa, testowanie, wdrażanie i wykonywanie - funkcja lambda oparta na Pythonie

test lokalnie

sam build --use-container

wynik pokazuje na końcu:

Komendy, które możesz wykonać dalej
=========================
[*] Walidacja szablonu SAM: sam validate
[*] Wywołaj funkcję: sam local invoke
[*] Testuj funkcję w chmurze: sam sync --stack-name {{stack-name}} --watch
[*] Wdróż: sam deploy --guided

po trzykrotnym uruchomieniu

sam local invoke

wynik, który widzimy:

REPORT RequestId: 3b36575a-629d-40ba-adb7-018bdb8cae63  Init Duration: 0.09 ms  Duration: 46.95 ms      Billed Duration: 47 ms  Memory Size: 128 MB     Max Memory Used: 128 MB
...
REPORT RequestId: e1233b8a-99c6-49d9-ab91-f02408a5ec6f  Init Duration: 0.07 ms  Duration: 44.56 ms      Billed Duration: 45 ms  Memory Size: 128 MB     Max Memory Used: 128 MB
...
REPORT RequestId: 34772494-39ff-457d-a1c1-16cd5e177b42  Init Duration: 0.02 ms  Duration: 26.35 ms      Billed Duration: 27 ms  Memory Size: 128 MB     Max Memory Used: 128 MB

jeśli dodamy wywołanie odczytu z S3, wynik będzie inny

...
REPORT RequestId: 158b806c-852d-4f6b-ab28-cdd6e0868fa1  Init Duration: 0.02 ms  Duration: 675.64 ms     Billed Duration: 676 ms Memory Size: 128 MB     Max Memory Used: 128 MB
...
REPORT RequestId: d4cc689c-f944-49fa-9254-555266816b97  Init Duration: 0.79 ms  Duration: 465.80 ms     Billed Duration: 466 ms Memory Size: 128 MB     Max Memory Used: 128 MB
...
REPORT RequestId: b8d30096-cd93-4787-84d7-e8f52d7e2e13  Init Duration: 0.02 ms  Duration: 447.83 ms     Billed Duration: 448 ms Memory Size: 128 MB     Max Memory Used: 128 MB

Ok, każde wywołanie trwa 1/2 sekundy, a RAM używany to 128 MB

test na aws

sam build --use-container
sam deploy --guided

SAM cli zapyta o nazwę stosu CloudFormation, potem o potwierdzenie, a potem wdroży naszą funkcję na AWS. Ostatnia strona wyjścia sam będzie wyglądać mniej więcej tak:

Przewiaryjanie zmiany stosu CloudFormation przed wdrożeniem
======================================================
Wdrożyć tę zmianę? [y/N]: Y

2024-08-17 20:19:30 - Oczekiwanie na ukończenie tworzenia/aktualizacji stosu

Zdarzenia CloudFormation z operacji stosu (odśwież co 5,0 sekund)
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Stan zasobu                                 Typ zasobu                                   Logiczna nazwa zasobu                              Powód stanu zasobu                         
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
CREATE_IN_PROGRESS                             AWS::CloudFormation::Stack                     t1-py                                          Inicjowane przez użytkownika                               
CREATE_IN_PROGRESS                             AWS::IAM::Role                                 HelloWorldFunctionRole                         -                                            
CREATE_IN_PROGRESS                             AWS::IAM::Role                                 HelloWorldFunctionRole                         Inicjowanie tworzenia zasobu                  
CREATE_COMPLETE                                AWS::IAM::Role                                 HelloWorldFunctionRole                         -                                            
CREATE_IN_PROGRESS                             AWS::Lambda::Function                          HelloWorldFunction                             -                                            
CREATE_IN_PROGRESS                             AWS::Lambda::Function                          HelloWorldFunction                             Inicjowanie tworzenia zasobu                  
CREATE_COMPLETE                                AWS::Lambda::Function                          HelloWorldFunction                             -                                            
CREATE_IN_PROGRESS                             AWS::ApiGateway::RestApi                       ServerlessRestApi                              -                                            
CREATE_IN_PROGRESS                             AWS::ApiGateway::RestApi                       ServerlessRestApi                              Inicjowanie tworzenia zasobu                  
CREATE_COMPLETE                                AWS::ApiGateway::RestApi                       ServerlessRestApi                              -                                            
CREATE_IN_PROGRESS                             AWS::Lambda::Permission                        HelloWorldFunctionHelloWorldPermissionProd     -                                            
CREATE_IN_PROGRESS                             AWS::ApiGateway::Deployment                    ServerlessRestApiDeployment47fc2d5f9d          -                                            
CREATE_IN_PROGRESS                             AWS::Lambda::Permission                        HelloWorldFunctionHelloWorldPermissionProd     Inicjowanie tworzenia zasobu                  
CREATE_COMPLETE                                AWS::Lambda::Permission                        HelloWorldFunctionHelloWorldPermissionProd     -                                            
CREATE_IN_PROGRESS                             AWS::ApiGateway::Deployment                    ServerlessRestApiDeployment47fc2d5f9d          Inicjowanie tworzenia zasobu                  
CREATE_COMPLETE                                AWS::ApiGateway::Deployment                    ServerlessRestApiDeployment47fc2d5f9d          -                                            
CREATE_IN_PROGRESS                             AWS::ApiGateway::Stage                         ServerlessRestApiProdStage                     -                                            
CREATE_IN_PROGRESS                             AWS::ApiGateway::Stage                         ServerlessRestApiProdStage                     Inicjowanie tworzenia zasobu                  
CREATE_COMPLETE                                AWS::ApiGateway::Stage                         ServerlessRestApiProdStage                     -                                            
CREATE_COMPLETE                                AWS::CloudFormation::Stack                     t1-py                                          -                                            
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Wyjścia z wdrożonego stosu CloudFormation
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
Wyjścia                                                                                                                                                                                   
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
...
Klucz                 HelloWorldApi                                                                                                                                                         
Opis                  Adres URL punktu końcowego API Gateway dla etapu Prod dla funkcji Hello World                                                                                                      
Wartość               https://wq3w4d41j7.execute-api.ap-southeast-2.amazonaws.com/Prod/hello/                                                                                               
...-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

Zauważ klucz HelloWorldApi z opisem Adres URL punktu końcowego API Gateway dla etapu Prod dla funkcji Hello World? Tam jest nasz publiczny adres URL:

https://wq3w4d41j7.execute-api.ap-southeast-2.amazonaws.com/Prod/hello/  

ale najpierw uruchommy nasłuch logów:

sam logs -n HelloWorldFunction --stack-name "t1-py" --tail

a potem, gdy nasłuch logów działa, wywołajmy w innym oknie terminala:

curl https://wq3w4d41j7.execute-api.ap-southeast-2.amazonaws.com/Prod/hello/
curl https://wq3w4d41j7.execute-api.ap-southeast-2.amazonaws.com/Prod/hello/
curl https://wq3w4d41j7.execute-api.ap-southeast-2.amazonaws.com/Prod/hello/

wyjście:

2024/08/18/[$LATEST]d86ecb94a39d44778f35bc2200b077a7 2024-08-18T00:46:22.468000 REPORT RequestId: 2e35fcf9-4d4b-4ced-962e-923adeddcbaa  Duration: 199.56 ms     Billed Duration: 200 ms Memory Size: 128 MB Max Memory Used: 56 MB
...break...
2024/08/18/[$LATEST]d86ecb94a39d44778f35bc2200b077a7 2024-08-18T00:46:22.909000 REPORT RequestId: dd200d9d-cf35-4813-a243-ca8cf7435908  Duration: 194.60 ms     Billed Duration: 195 ms Memory Size: 128 MB Max Memory Used: 56 MB
...break...
2024/08/18/[$LATEST]661b5b35a7c54641adb72974b273b78a 2024-08-18T00:48:01.610000 REPORT RequestId: afae88d1-3873-40a3-8b82-caa7019ca45e  Duration: 1.94 ms       Billed Duration: 2 ms   Memory Size: 128 MB Max Memory Used: 32 MB  Init Duration: 117.62 ms
...
2024/08/18/[$LATEST]661b5b35a7c54641adb72974b273b78a 2024-08-18T00:48:03.292000 REPORT RequestId: d7011c87-e6a2-4d76-bb39-4c32b754b991  Duration: 1.71 ms       Billed Duration: 2 ms   Memory Size: 128 MB Max Memory Used: 32 MB
...
2024/08/18/[$LATEST]661b5b35a7c54641adb72974b273b78a 2024-08-18T00:48:06.905000 REPORT RequestId: 0eab1866-b11f-4a26-8234-be07f47ecb49  Duration: 1.62 ms       Billed Duration: 2 ms   Memory Size: 128 MB Max Memory Used: 32 MB
...
2024/08/18/[$LATEST]661b5b35a7c54641adb72974b273b78a 2024-08-18T00:48:12.696000 REPORT RequestId: f0cc5b4b-f3c3-49d5-9708-fce265581ed2  Duration: 1.51 ms       Billed Duration: 2 ms   Memory Size: 128 MB Max Memory Used: 32 MB
...
2024/08/18/[$LATEST]661b5b35a7c54641adb72974b273b78a 2024-08-18T00:48:13.202000 REPORT RequestId: 40367789-27c0-419b-8483-cf054978e9b6  Duration: 1.51 ms       Billed Duration: 2 ms   Memory Size: 128 MB Max Memory Used: 32 MB
...
2024/08/18/[$LATEST]661b5b35a7c54641adb72974b273b78a 2024-08-18T00:48:13.552000 REPORT RequestId: 6d166356-5a6c-44c7-b5dd-5c2808340b79  Duration: 1.38 ms       Billed Duration: 2 ms   Memory Size: 128 MB Max Memory Used: 32 MB

z wywołaniem S3 - tutaj mówimy

2024/08/18/[$LATEST]992dbfa1ec234d2aa1d9d6003de766de 2024-08-18T00:54:55.322000 REPORT RequestId: d97fd1cd-d9ef-4d16-adcb-514fa65ca6f8  Duration: 513.99 ms     Billed Duration: 514 ms Memory Size: 128 MB Max Memory Used: 77 MB
...
przerwa
...
2024/08/18/[$LATEST]992dbfa1ec234d2aa1d9d6003de766de 2024-08-18T00:55:02.063000 REPORT RequestId: e6e6884d-d6b6-4dc7-aede-f3863f3b331d  Duration: 519.35 ms     Billed Duration: 520 ms Memory Size: 128 MB Max Memory Used: 77 MB
...
2024/08/18/[$LATEST]992dbfa1ec234d2aa1d9d6003de766de 2024-08-18T00:55:02.202000 REPORT RequestId: 91eeaca0-c983-4e99-9608-36948511bd27  Duration: 23.95 ms      Billed Duration: 24 ms  Memory Size: 128 MB Max Memory Used: 77 MB
...
2024/08/18/[$LATEST]992dbfa1ec234d2aa1d9d6003de766de 2024-08-18T00:55:02.662000 REPORT RequestId: d7035256-53f8-463c-93fd-f5de608f47a6  Duration: 33.55 ms      Billed Duration: 34 ms  Memory Size: 128 MB Max Memory Used: 77 MB
...
2024/08/18/[$LATEST]992dbfa1ec234d2aa1d9d6003de766de 2024-08-18T00:55:03.082000 REPORT RequestId: a2e338b3-f18e-4644-8f6d-2ab151421996  Duration: 21.50 ms      Billed Duration: 22 ms  Memory Size: 128 MB Max Memory Used: 77 MB
...
2024/08/18/[$LATEST]992dbfa1ec234d2aa1d9d6003de766de 2024-08-18T00:55:03.562000 REPORT RequestId: 111665a1-f43c-488b-bc02-cd203fef478f  Duration: 42.58 ms      Billed Duration: 43 ms  Memory Size: 128 MB Max Memory Used: 77 MB

Rozmiar pamięci: 77 MB i Billed duration ~35 ms… Czas rozgrzewania 1/2 sekundy

wyczyszczenie stosu CloudFormation AWS

sam delete --stack-name "t1-py"

Budowa, testowanie, wdrażanie i uruchamianie - funkcji Lambda opartej na JavaScript

JS lokalny

budowa i uruchamianie lokalnie

sam build
sam local invoke

generuje

REPORT RequestId: 9e3c0a43-6432-4cc7-babf-f591773e5315  Init Duration: 0.05 ms  Duration: 126.34 ms     Billed Duration: 127 ms Memory Size: 128 MB     Max Memory Used: 128 MB
REPORT RequestId: 2856e8f1-166f-4a90-a094-d575ef00ff69  Init Duration: 0.02 ms  Duration: 43.73 ms      Billed Duration: 44 ms  Memory Size: 128 MB     Max Memory Used: 128 MB
REPORT RequestId: f1156bd5-dd9f-4c1c-b65d-68c04df5a987  Init Duration: 0.02 ms  Duration: 42.79 ms      Billed Duration: 43 ms  Memory Size: 128 MB     Max Memory Used: 128 MB

czas trwania wywołań S3 z lokalnego:

REPORT RequestId: 06c4a5a0-6f1a-4e09-9518-cf706d08c319  Init Duration: 0.13 ms  Duration: 280.33 ms     Billed Duration: 281 ms Memory Size: 128 MB     Max Memory Used: 128 MB
...
REPORT RequestId: 4393e8bd-c59b-42e5-83b5-1729d0fb4d8f  Init Duration: 0.08 ms  Duration: 270.42 ms     Billed Duration: 271 ms Memory Size: 128 MB     Max Memory Used: 128 MB
...
REPORT RequestId: 90979693-7245-4f88-9f6b-070be83f75df  Init Duration: 0.05 ms  Duration: 431.86 ms     Billed Duration: 432 ms Memory Size: 128 MB     Max Memory Used: 128 MB

JS na AWS

Wdrażanie i zgoda na to, co prosi sam, oraz powiadomienie, aby zezwolić na nieautoryzowane wywołania do naszych funkcji Lambda

sam deploy --guided
# teraz nasłuchuj logów
sam logs -n HelloWorldFunction --stack-name t2-js --tail
#lub
sam logs -n HelloWorldS3Function --stack-name t2-js --tail

a po wywołaniu cURL w innym konsoli, logi

2024/08/18/[$LATEST]fe2dcf2abd9041a0b90630c2c8aa0005 2024-08-18T01:38:38.831000 REPORT RequestId: 24e86600-e316-4678-81db-41eafff81aa0  Duration: 4.92 ms       Billed Duration: 5 ms   Memory Size: 128 MB Max Memory Used: 62 MB  Init Duration: 139.82 ms
...
2024/08/18/[$LATEST]fe2dcf2abd9041a0b90630c2c8aa0005 2024-08-18T01:38:47.451000 REPORT RequestId: 0d269d7f-61f6-4b48-b3c2-6f83aaba5f45  Duration: 2.58 ms       Billed Duration: 3 ms   Memory Size: 128 MB Max Memory Used: 62 MB
...
2024/08/18/[$LATEST]fe2dcf2abd9041a0b90630c2c8aa0005 2024-08-18T01:38:58.622000 REPORT RequestId: f1bd0e5a-d1d0-4136-9b02-6fba4dcc9a70  Duration: 1.34 ms       Billed Duration: 2 ms   Memory Size: 128 MB Max Memory Used: 63 MB
...
2024/08/18/[$LATEST]fe2dcf2abd9041a0b90630c2c8aa0005 2024-08-18T01:38:59.089000 REPORT RequestId: baa791a7-4f9c-41be-b516-81213bc7a365  Duration: 1.44 ms       Billed Duration: 2 ms   Memory Size: 128 MB Max Memory Used: 63 MB
...
2024/08/18/[$LATEST]fe2dcf2abd9041a0b90630c2c8aa0005 2024-08-18T01:38:59.966000 REPORT RequestId: ea2a1515-1188-4a44-956f-91f2fc97491f  Duration: 1.46 ms       Billed Duration: 2 ms   Memory Size: 128 MB Max Memory Used: 63 MB
...
2024/08/18/[$LATEST]fe2dcf2abd9041a0b90630c2c8aa0005 2024-08-18T01:39:00.428000 REPORT RequestId: 0f536ec5-26cb-42b9-beaa-045984b8c468  Duration: 1.45 ms       Billed Duration: 2 ms   Memory Size: 128 MB Max Memory Used: 63 MB

Dobrze. nie spędziło się dużo czasu na niczym, ale nie zasypia również.

Wykonanie funkcji Lambda odczytującej z bazy danych S3 w JavaScript

2024/08/18/[$LATEST]8e22ce6f54074c6098cdbf89ed0ca0b9 2024-08-18T01:42:45.155000 REPORT RequestId: c4630419-4502-467c-9cda-c5087d6b2743  Duration: 1051.97 ms    Billed Duration: 1052 ms        Memory Size: 128 MB Max Memory Used: 88 MB  Init Duration: 411.76 ms
...break...
2024/08/18/[$LATEST]8e22ce6f54074c6098cdbf89ed0ca0b9 2024-08-18T01:42:52.195000 REPORT RequestId: 4b881f2b-4b30-4890-afc2-b7299b6397b3  Duration: 259.87 ms     Billed Duration: 260 ms Memory Size: 128 MB Max Memory Used: 89 MB
...break...
2024/08/18/[$LATEST]8e22ce6f54074c6098cdbf89ed0ca0b9 2024-08-18T01:42:58.455000 REPORT RequestId: 77f4d820-2f2e-4190-a1e3-bc4821ccdb9b  Duration: 165.44 ms     Billed Duration: 166 ms Memory Size: 128 MB Max Memory Used: 89 MB
...
2024/08/18/[$LATEST]8e22ce6f54074c6098cdbf89ed0ca0b9 2024-08-18T01:43:03.095000 REPORT RequestId: 41ce9fd8-aaf4-46c4-a827-0a45592041c0  Duration: 63.74 ms      Billed Duration: 64 ms  Memory Size: 128 MB Max Memory Used: 89 MB
...
2024/08/18/[$LATEST]8e22ce6f54074c6098cdbf89ed0ca0b9 2024-08-18T01:43:03.695000 REPORT RequestId: 9494f176-3818-4fb3-a581-857f1eb2df23  Duration: 73.16 ms      Billed Duration: 74 ms  Memory Size: 128 MB Max Memory Used: 89 MB
...
2024/08/18/[$LATEST]8e22ce6f54074c6098cdbf89ed0ca0b9 2024-08-18T01:43:04.315000 REPORT RequestId: 528c909f-4a08-415e-a713-e3d9e9e4d615  Duration: 87.44 ms      Billed Duration: 88 ms  Memory Size: 128 MB Max Memory Used: 89 MB
...
2024/08/18/[$LATEST]8e22ce6f54074c6098cdbf89ed0ca0b9 2024-08-18T01:43:04.835000 REPORT RequestId: 9b636429-56f5-4974-afe9-e53e786adb61  Duration: 55.62 ms      Billed Duration: 56 ms  Memory Size: 128 MB Max Memory Used: 89 MB
...
2024/08/18/[$LATEST]8e22ce6f54074c6098cdbf89ed0ca0b9 2024-08-18T01:43:05.415000 REPORT RequestId: d4c298df-b237-4605-894f-fde05fe0461a  Duration: 69.88 ms      Billed Duration: 70 ms  Memory Size: 128 MB Max Memory Used: 89 MB

Czyszczenie AWS js

usuwanie…

sam delete --stack-name t2-js

Budowa, testowanie, wdrażanie i uruchamianie - funkcji Lambda opartej na Golang

Testowanie lokalnego Golang Lambda

Aby być precyzyjnym - wykonywanie testów, a nie wykonywanie testów jednostkowych.

Komenda sam build znajduje się wewnątrz Makefile. Więc uruchamiamy:

make

uruchamianie pojedynczej funkcji

sam local invoke HelloWorldFunction --event events/event.json
sam local invoke HelloWorldFunction --event events/event.json
sam local invoke HelloWorldFunction --event events/event.json

sam local invoke HelloWorldS3Function --event events/event.json
sam local invoke HelloWorldS3Function --event events/event.json
sam local invoke HelloWorldS3Function --event events/event.json

Opcja 2: teraz uruchom lokalny serwer:

sam local start-api

wynik:

teraz w osobnym oknie terminala:

curl http://localhost:3000/hello
curl http://localhost:3000/hello
curl http://localhost:3000/hello

curl http://localhost:3000/hellos3
curl http://localhost:3000/hellos3
curl http://localhost:3000/hellos3

wynik lokalnego wywołania funkcji Lambda opartej na Golang:

REPORT RequestId: 54cc3271-7f04-44a3-8d91-d5d69d2428ea  Init Duration: 0.03 ms  Duration: 2.24 ms       Billed Duration: 3 ms   Memory Size: 128 MB     Max Memory Used: 128 MB
...
REPORT RequestId: c753bdf9-1af0-4b40-9516-5fb2ad96ba00  Duration: 0.29 ms       Billed Duration: 1 ms   Memory Size: 128 MB     Max Memory Used: 128 MB
...
REPORT RequestId: edceb310-e6e9-4f0a-bd6e-58afd40e9b70  Duration: 0.28 ms       Billed Duration: 1 ms   Memory Size: 128 MB     Max Memory Used: 128 MB

wynik lokalnego wywołania “s3” do funkcji Lambda opartej na Golang:

REPORT RequestId: 1556e298-a17a-4d45-9fdc-b7f62118c246  Init Duration: 0.06 ms  Duration: 142.76 ms     Billed Duration: 143 ms Memory Size: 128 MB     Max Memory Used: 128 MB
...
REPORT RequestId: e4638fb4-52f4-4086-b673-c9de0f02d3f7  Duration: 86.75 ms      Billed Duration: 87 ms  Memory Size: 128 MB     Max Memory Used: 128 MB
...
REPORT RequestId: b1bdcbf8-06f8-4605-a7da-d34f41198811  Duration: 105.07 ms     Billed Duration: 106 ms Memory Size: 128 MB     Max Memory Used: 128 MB

czas trwania 1ms wygląda dobrze, ale Memory Size: 128 MB? Dlaczego? Powinno być około 12MB? Prawdopodobnie to minimalna wartość, jaką mają.

Testowanie AWS Golang Lambda

sam deploy --guided

uruchom nasłuchiwacz logów

sam logs -n HelloWorldFunction --stack-name t3-go --tail

i wywołaj funkcję 3 razy:

curl https://k92zaa81w8.execute-api.ap-southeast-2.amazonaws.com/Prod/hello/
curl https://k92zaa81w8.execute-api.ap-southeast-2.amazonaws.com/Prod/hello/
curl https://k92zaa81w8.execute-api.ap-southeast-2.amazonaws.com/Prod/hello/

w logach widzimy:

2024/08/18/[$LATEST]1f5b2a65bda1433789d9281d02cf4622 2024-08-18T04:18:02.908000 REPORT RequestId: 358b5762-dad7-4380-a83f-e21349fae20b  Duration: 11.71 ms      Billed Duration: 70 ms     Memory Size: 128 MB     Max Memory Used: 20 MB  Init Duration: 57.52 ms
...break...
2024/08/18/[$LATEST]1f5b2a65bda1433789d9281d02cf4622 2024-08-18T04:18:07.404000 REPORT RequestId: 3051d741-504a-49ae-95b3-077628b4b929  Duration: 0.99 ms       Billed Duration: 1 ms      Memory Size: 128 MB     Max Memory Used: 20 MB
...break...
2024/08/18/[$LATEST]1f5b2a65bda1433789d9281d02cf4622 2024-08-18T04:18:11.923000 REPORT RequestId: 51c38ca9-920d-4f30-be75-a1a44538c9ee  Duration: 1.02 ms       Billed Duration: 2 ms      Memory Size: 128 MB     Max Memory Used: 20 MB
...
2024/08/18/[$LATEST]1f5b2a65bda1433789d9281d02cf4622 2024-08-18T04:18:12.486000 REPORT RequestId: 98727f66-f3f1-46ad-9a5a-55a6243609ba  Duration: 0.96 ms       Billed Duration: 1 ms      Memory Size: 128 MB     Max Memory Used: 20 MB
...
2024/08/18/[$LATEST]1f5b2a65bda1433789d9281d02cf4622 2024-08-18T04:18:13.015000 REPORT RequestId: 9d8bfb28-d4eb-4868-9af7-3b3946acc92c  Duration: 0.98 ms       Billed Duration: 1 ms      Memory Size: 128 MB     Max Memory Used: 20 MB
  • Billed duration to 2ms. Dobrze.
  • Max Memory Used: 20 MB. Oczekiwane.
  • Wydaje się, że nie zasypia.

Teraz zrób to samo dla funkcji Lambda, która ma wywołanie do S3

2024/08/18/[$LATEST]8bd6f2bea333485aad2cbf5166433cf5 2024-08-18T04:22:57.711000 REPORT RequestId: 9f09db3e-d9bc-45fe-9674-df133f0f1dc2  Duration: 28.08 ms      Billed Duration: 29 ms     Memory Size: 128 MB     Max Memory Used: 37 MB
...
2024/08/18/[$LATEST]8bd6f2bea333485aad2cbf5166433cf5 2024-08-18T04:23:15.324000 REPORT RequestId: 4bc39553-6a42-4347-b322-6c80f24cdb01  Duration: 30.56 ms      Billed Duration: 31 ms     Memory Size: 128 MB     Max Memory Used: 38 MB
...
2024/08/18/[$LATEST]8bd6f2bea333485aad2cbf5166433cf5 2024-08-18T04:23:51.144000 REPORT RequestId: 55ac2b18-394c-4699-87a5-4ba52230f386  Duration: 27.01 ms      Billed Duration: 28 ms     Memory Size: 128 MB     Max Memory Used: 38 MB

Czyszczenie

Nie zapomnij usunąć

sam delete --stack-name t3-go

Przydatne linki