В середине января этого года Амазон анонсировал поддержку Go в своих лямбдах.
Отличная новость, но сейчас я пишу эти строки не имея никакого опыта написания кода на Golang, чтобы, проходя через пеньки и ухабы, параллельно с написанием статьи, прийти к первой своей работающей лямбде на Go.
Установка Go и настройка рабочего просстранства
Начать, собственно, придется с установки Go. Моя машина — Windows 10 на процессоре Intel. Здесь ничего сложного: скачиваем, запускаем. Проверяем, что Go прописала путь до <путь установки>bin в переменную среды PATH или стартуем go через cli (cmd, например) для проверки.
Создаем проектную папку:
C:Usersa_golgo>cd C:Go
C:Go>mkdir workspace
C:Go>set GOPATH=C:Goworkspace
C:Go>cd %GOPATH%
C:Goworkspace>
Для редактирования кода я использую Sublime Text 3, поэтому нужно адаптировать его под Go. Для этого необходимо установить package control и с его помощью (Preferences -> Package Control -> Install Package -> GoSublime) скачать плагин GoSublime.
Перезапускаем Sublime Text.
Более подробную информацию по настройке Sublime Text можно посмотреть здесь
Теперь опробуем Go с первым приложением Hello, world!
- Открываем проектную папку %GOPATH% (у меня это workplace) в Sublime Text
- Создаем новый файл hello.go
- Добавляем в него код
package main import "fmt" func main() { fmt.Printf("hello, worldn") }
- Запускаем консоль Go (ctrl+b)
- Через консоль стартуем программу: go run hello.go
Ламбда на Go
Давайте попробуем написать и протестировать лямбду, которая принимает на вход объект из двух полей в формате json и отдает ответ в формате json с идентификатором успешного завершения.
Запрос:
{
"id": 12345,
"value": "some-value"
}
Ответ:
{
"message": "processed request ID 12345",
"ok": true
}
Данный пример описан в статье.
package main
import (
"fmt"
"github.com/aws/aws-lambda-go/lambda"
)
type Request struct {
ID float64 `json:"id"`
Value string `json:"value"`
}
type Response struct {
Message string `json:"message"`
Ok bool `json:"ok"`
}
func Handler(request Request) (Response, error) {
return Response{
Message: fmt.Sprintf("Processed request ID %f", request.ID),
Ok: true,
}, nil
}
func main() {
lambda.Start(Handler)
}
Чтобы собрать архив для лямбды нужно загрузить библиотеку aws-lambda-go. Там же вы можете посмотреть какие шаги для сборки архива необходимо выполнить на Linux, macOS и Windows.
Давайте все это проделаем по шагам:
- Скачиваем пакет:
go get -u github.com/aws/aws-lambda-go/cmd/build-lambda-zip
- Устанавливаем переменные среды через cmd:
set GOOS=linux set GOARCH=amd64
- В консоли Go можно запустить следующие команды, чтобы собрать архив, который и будем деплоить в лямбду (данные команды для Windows, для других осей здесь)
go build -o main main.go %USERPROFILE%Gobinbuild-lambda-zip.exe -o main.zip main
После данных шагов у вас должен появиться архив main.zip, который и необходимо загрузить в лямбду.
Создание Лямбды в Амазон
Создавать лямбду я буду через AWS консоль.
Для этого нужно:
- Выбрать Сервис Lambda в необходимом регионе
- Нажать Create function
- Заполнить поля
- После создания откроется консоль лямбды, где в блоке Function code нужно нажать на кнопку Upload и подгрузить архив main.zip. Не забудьте указать в поле Handler значение main
- В верхней части консоли нажать Save
Протестируем работу лямбды. Для этого нужно создать тест, нажав кнопку Test в верхней части консоли. Добавляем тестовые входные данные и сохраняем.
{
"id": 12345,
"value": "some-value"
}
Теперь мы можем в верхней части консоли вызывать этот тестовый сценарий нажатием кнопки Test.
Ухабы
Не установились переменные среды
{
"errorMessage": "fork/exec /var/task/main: exec format error",
"errorType": "PathError"
}
set GOOS=linux
set GOARCH=amd64
Проверьте их через cmd:
echo %GOOS%
echo %GOARCH%
Возможные кочки
1. Не прописано main в поле Handler блока Function code, там по умолчанию стоит hello
{
"errorMessage": "fork/exec /var/task/hello: no such file or directory",
"errorType": "PathError"
}
2. Неверно задан тестовый json.
Он должен выглядеть следующим образом:
{
"id": 12345,
"value": "some-value"
}
Автор: GolovinskayaAlbina