AWS Lambda wspiera kilka środowisk uruchomieniowych. W obecnej chwili (styczeń2022) jest ich aż 6. Ponadto istnieje możliwość implementacji swojego własnego środowiska uruchomieniowego. Jednym ze wspieranych środowisk jest Go w wersji 1.x
.
Z tego artykułu dowiesz się:
- jakich narzędzi używać w efektywnej pracy z AWS Lambda w połączeniu z Go,
- w jaki sposób tworzyć oraz wdrażać funkcje Lambda zaimplementowane za pomocą Go,
- jak weryfikować działanie funkcji.
Narzędzia przydatne w pracy z AWS Lambda
AWS CLI
Podstawowym narzędziem w pracy z AWS jest AWS CLI. Instrukcję instalacji można znaleźć w oficjalnej dokumentacji. Po instalacji należy je skonfigurować, żeby umożliwić pracę z kontem AWS.
AWS SAM CLI
Kolejnym przydatnym narzędziem jest AWS SAM CLI. Służy do lokalnego uruchamiania funkcji oraz wdrażania ich do chmury. Kompletną instrukcję, w jaki sposób je zainstalować, znajdziesz tutaj.
GoLand
GoLand firmy JetBrains oferuje zintegrowane środowisko programistyczne skupione na Go. Posiada bardzo przydatne wtyczki do pracy z AWS, takie jak AWS Toolkit, dzięki któremu będziesz w stanie z łatwością uruchamiać oraz debugować funkcje Lambda lokalnie.
Struktura projektu Go
Struktura prostego projektu z funkcją AWS Lambda napisaną w Go może wyglądać w następujący sposób:
calculate-student-grade
│───Makefile
│───template.yaml
|
└───src
└───main
│───go.mod
│───go.sum
│───main.go
│───models.go
│
└───grades
└───grades.go
W głównym katalogu nazwanym zgodnie z nazwą projektu znajdują się dwa pliki – Makefile
oraz template.yaml
. Wspomniane pliki zawierają kolejno: instrukcje budowania i wdrożenia paczki AWS Lambda za pomocą AWS SAM oraz plik z opisem infrastuktury stacka CloudFormation.
Oprócz tego, w głównym katalogu znajduje się również folder src
z kodem źródłowym funkcji AWS Lambda.
Kod funkcji w Go
Najważniejszym plikiem kodu w projekcie jest punkt wejściowy naszego programu. Jest nim main.go
w katalogu src/main
.
package main
import (
"calculate-student-grade/grades"
"github.com/aws/aws-lambda-go/lambda"
)
func HandleRequest(event CalculateStudentGradeRequest) (CalculateStudentGradeResponse, error) {
finalGrade, hasPassed := grades.CalculateStudentGrades(event.LectureGrade, event.ExerciseGrade, event.WorkshopGrade)
return CalculateStudentGradeResponse{
finalGrade, hasPassed,
}, nil
}
func main() {
lambda.Start(HandleRequest)
}
Plik musi przede wszystkim zawierać import pakietu github.com/aws/aws-lambda-go/lambda
. Punktem wejściowym programu jest funkcja main()
, w której wywołujemy metodę lambda.Start(HandleRequest)
. HandleRequest
to nazwa funkcji, która jako parametr przyjmuje model wejściowy funkcji Lambda, a zwraca model wyjściowy funkcji Lambda oraz informację o błędzie. Reszta plików związanych z logiką funkcji może znajdować się w innych plikach. W naszym przypadku znajduje się w pakiecie calculate-student-grade/grades
.
Pamiętaj, że pakiet, w którym znajduje się handler
funkcji Lambda musi nosić nazwę main
. W przeciwnym wypadku, wywołanie funkcji Lambda będzie skutkować następującym błędem:
{
"errorMessage": "fork/exec /var/task/function: exec format error",
"errorType": "PathError"
}
Wdrażanie funkcji
Funkcję Lambda najłatwiej wdrożyć za pomocą AWS SAM oraz CloudFormation. W tym celu musisz zdefiniować plik opisujący funkcję pod kątem infrastrukturalnym. Żeby to osiągnąć, należy stworzyć plik YAML w katalogu projektu. Wewnątrz pliku trzeba zdefiniować wszystkie potrzebne właściwości funkcji:
AWSTemplateFormatVersion: 2010-09-09
Transform: AWS::Serverless-2016-10-31
Description: Calculate student grade
Resources:
CalculateStudentGrade:
Type: AWS::Serverless::Function
Properties:
FunctionName: calculate-sudent-grade
CodeUri: src/main
Handler: main
Runtime: go1.x
Timeout: 5
MemorySize: 128
Instrukcje przydatne do zbudowania oraz wdrożenia paczki z funkcją Lambda zdefiniowałem w pliku Makefile
:
.PHONY: build
build:
sam build
deploy:
sam build && sam deploy --template-file ./.aws-sam/build/template.yaml --stack-name aws-lambda-go --s3-bucket $(DEPLOY_BUCKET) --s3-prefix calculate-student-grade/ --capabilities CAPABILITY_IAM --no-fail-on-empty-changeset
Do wdrożenia funkcji Lambda potrzebny będzie bucket S3 na którym będzie przechowywany kod źródłowy funkcji. W celu wdrożenia funkcji Twoje konto wystarczy wywołać komendę:
make deploy DEPLOY_BUCKET=<your-deployment-bucket-name>
Testowanie działania rozwiązania
Weryfikacja działania w chmurze
Po wdrożeniu funkcji warto zweryfikować jej działanie. Możesz zrobić to, wywołując ją między innymi bezpośrednio z portalu AWS lub z linii poleceń. W celu wywołania funkcji z portalu należy znaleźć ją na liście funkcji i wywołać z poprawnym zapytaniem. Przykładowe zapytanie wykorzystane do wywołania funkcji może wyglądać następująco:
{
"lectureGrade": 3,
"exerciseGrade": 4,
"workshopGrade": 4.5
}

Można również wywołać funkcję z wiersza poleceń za pomocą komendy:
aws lambda invoke \
--function-name calculate-student-grade \
--payload file://payload.json \
response.json
Plik payload.json
powinien zawierać wcześniej wspomniane zapytanie, natomiast plik response.json
będzie zawierać odpowiedź po wywołaniu funkcji. Po wykonaniu komendy w wierszu poleceń powinna pojawić się informacja o poprawnym wywołaniu funkcji. Z kolei plik response.json
powinien zawierać tę samą odpowiedź, co w portalu.
Lokalne uruchamianie funkcji
W celu przetestowania działania funkcji niekoniecznie trzeba wdrażać ją na środowisko. Dzięki AWS SAM CLI możesz uruchomić funkcję lokalnie. Żeby to zrobić, wystarczy wywołać odpowiednią komendę:
sam local invoke -e payload.json CalculateStudentGrade
Po wykonaniu komendy zostanie przygotowany kontener, który obsługuje nasze zapytanie. Otrzymujemy pełny log wywołania, razem z odpowiedzią z funkcji.
START RequestId: f24491ef-ace8-48af-b3db-865f26ee1bdc Version: $LATEST
END RequestId: f24491ef-ace8-48af-b3db-865f26ee1bdc
REPORT RequestId: f24491ef-ace8-48af-b3db-865f26ee1bdc Init Duration: 0.07 ms Duration: 267.43 ms Billed Duration: 268 ms Memory Size: 128 MB Max Memory Used: 128 MB
{"finalGrade":4,"hasPassed":true}
Możemy nie tylko uruchamiać lokalnie naszą funkcję, ale również ją debugować. Bardzo przydatne do tego celu jest zintegrowane środowisko programistyczne GoLand z pluginem AWS Toolkit. Z tymi narzędziami proces debugowania wygląda następująco:
Wszystkie przykłady gotowe do samodzielnego przetestowania znajdziesz w moim repozytorium.
Zobacz w jaki sposób pracować z AWS Lambda z wykorzystaniem innych środowisk i języków programowania: