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

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


Начать, собственно, придется с установки Go. Моя машина — Windows 10 на процессоре Intel. Здесь ничего сложного: скачиваем, запускаем. Проверяем, что Go прописала путь до <путь установки>\bin в переменную среды PATH или стартуем go через cli (cmd, например) для проверки.

Создаем проектную папку:

C:\Users\a_gol\go>cd C:\Go
C:\Go>mkdir workspace
C:\Go>set GOPATH=C:\Go\workspace
C:\Go>cd %GOPATH%
C:\Go\workspace>

Для редактирования кода я использую 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, world\n")
    }
    

  • Запускаем консоль 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%\Go\bin\build-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"
}

Комментарии (2)


  1. GolovinskayaAlbina Автор
    22.03.2018 18:41

    Да, я считаю такой способ более подходящим для поста типа hello, world. Aws cli, cloudformation и Sam — здорово, но уже не про hello, world1


  1. mixator
    23.03.2018 17:59

    Вы пошли путем создания лямб вручную. Таким образом для того что-бы изменить что-то в коде или сделать привязку к другим сервисам AWS(api gateway, vpc, rds, etc) вам прийдется делать все через веб консоль. Рекомендую посмотреть в сторону aws-cli или serverless. У serverless точно есть поддержка Go и он возьмет большую часть рутины на себя