artykułyawsserverless

AWS Lambda + Go

Brak komentarzy

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
}
Wynik poprawnego wywołania funkcji

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:

Tags: , ,

Powiązane artykuły

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Wypełnij to pole
Wypełnij to pole
Proszę wprowadzić prawidłowy adres e-mail.
You need to agree with the terms to proceed

Menu