- PVSM.RU - https://www.pvsm.ru -

Amazon Lambda with Golang

В середине января этого года Амазон анонсировал поддержку [1] Go в своих лямбдах.
Отличная новость, но сейчас я пишу эти строки не имея никакого опыта написания кода на Golang, чтобы, проходя через пеньки и ухабы, параллельно с написанием статьи, прийти к первой своей работающей лямбде на Go.

Установка Go и настройка рабочего просстранства

Начать, собственно, придется с установки Go [2]. Моя машина — 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 [3], поэтому нужно адаптировать его под Go. Для этого необходимо установить package control [4] и с его помощью (Preferences -> Package Control -> Install Package -> GoSublime) скачать плагин GoSublime [5].
Перезапускаем Sublime Text.

Более подробную информацию по настройке Sublime Text можно посмотреть здесь [6]

Теперь опробуем 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

image

Ламбда на Go

Давайте попробуем написать и протестировать лямбду, которая принимает на вход объект из двух полей в формате json и отдает ответ в формате json с идентификатором успешного завершения.

Запрос:

{
  "id": 12345,
  "value": "some-value"
}

Ответ:

{
  "message": "processed request ID 12345",
  "ok": true
}

Данный пример описан в статье [7].


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 [8]. Там же вы можете посмотреть какие шаги для сборки архива необходимо выполнить на Linux, macOS и Windows.

Давайте все это проделаем по шагам:

  1. Скачиваем пакет:
    go get -u github.com/aws/aws-lambda-go/cmd/build-lambda-zip

  2. Устанавливаем переменные среды через cmd:
    set GOOS=linux
    set GOARCH=amd64

  3. В консоли Go можно запустить следующие команды, чтобы собрать архив, который и будем деплоить в лямбду (данные команды для Windows, для других осей здесь [8])
    go build -o main main.go
    %USERPROFILE%Gobinbuild-lambda-zip.exe -o main.zip main

После данных шагов у вас должен появиться архив main.zip, который и необходимо загрузить в лямбду.

image

Создание Лямбды в Амазон

Создавать лямбду я буду через AWS консоль.
Для этого нужно:

  1. Выбрать Сервис Lambda в необходимом регионе
  2. Нажать Create function
  3. Заполнить поля
    image
  4. После создания откроется консоль лямбды, где в блоке Function code нужно нажать на кнопку Upload и подгрузить архив main.zip. Не забудьте указать в поле Handler значение main
    image
  5. В верхней части консоли нажать Save

Протестируем работу лямбды. Для этого нужно создать тест, нажав кнопку Test в верхней части консоли. Добавляем тестовые входные данные и сохраняем.

{
  "id": 12345,
  "value": "some-value"
}

image

Теперь мы можем в верхней части консоли вызывать этот тестовый сценарий нажатием кнопки Test.

image

Ухабы

Не установились переменные среды

{
  "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

Источник [9]


Сайт-источник PVSM.RU: https://www.pvsm.ru

Путь до страницы источника: https://www.pvsm.ru/amazon-web-services/275979

Ссылки в тексте:

[1] поддержку: https://aws.amazon.com/blogs/compute/announcing-go-support-for-aws-lambda/

[2] Go: https://golang.org/doc/install

[3] Sublime Text 3: https://www.sublimetext.com/3

[4] package control: https://packagecontrol.io/installation#st3

[5] GoSublime: https://github.com/DisposaBoy/GoSublime

[6] здесь: https://www.wolfe.id.au/2015/03/05/using-sublime-text-for-go-development/

[7] статье: https://aws.amazon.com/blogs/compute/announcing-go-support-for-aws-lambda

[8] aws-lambda-go: https://github.com/aws/aws-lambda-go

[9] Источник: https://habrahabr.ru/post/351744/?utm_campaign=351744