Amazon Lambda with Golang

в 11:40, , рубрики: Amazon Web Services, Go, go golang aws lambda

В середине января этого года Амазон анонсировал поддержку 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

image

Ламбда на 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.

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

  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, для других осей здесь)
    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

Источник

Поделиться

* - обязательные к заполнению поля