Пошаговое руководство для разработчиков

Если вы, как и я, являетесь поклонником Голанга и хотите создать свою первую Лямбду, вы можете столкнуться с трудностями при получении пошагового руководства. Эта статья продемонстрирует, насколько это просто, особенно при использовании чрезвычайно удобной Serverless Framework. В этой статье предполагается, что у вас есть учетная запись AWS и базовые знания о настройке пользователя IAM с токенами доступа.

Шаг 1: Начнем с создания нашего каталога и настройки Go

Откройте терминал в каталоге, где вы храните весь свой код. Мой называется просто Код. В терминале запустите:

mkdir GoServerlessLambda

Примечание. GoServerlessLambda — это то, как я буду называть свой каталог. Не стесняйтесь называть его в честь вашего проекта.

cd GoServerlessLambda

Теперь пришло время настроить Go Project.

go mod init github.com/<username>/go-serverless-lambda

Наконец, давайте откроем это в VS Code.

code .

Наконец, создайте файл main.go и добавьте следующее содержимое:

package main
import "fmt"
func main() {
  fmt.Println("Hello world!")
}

В терминале запустите

go run .

Мы должны увидеть следующее в вашем терминале

Шаг 2. Установите и настройте Serverless Framework

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

npm init

Следуйте инструкциям. Это потребуется позже. Теперь установите бессерверную структуру глобально:

npm install -g serverless

Наконец, давайте получим нашу бессерверную настройку. Создайте новый файл с именем serverless.yml и добавьте следующее содержимое:

Мне нравится использовать .env для управления переменными среды, поэтому давайте настроим его, чтобы мы могли использовать его в нашем проекте.

Далее давайте добавим команды для сборки и развертывания нашей Lambda. В package.json добавьте:

npm i cross-env env-cmd serverless-dotenv-plugin -D

Теперь добавьте следующее в serverless.yml. Это сделает переменные из вашей среды доступными в Lambda. Мы воспользуемся этим позже.

...
plugins:
  - serverless-dotenv-plugin
useDotenv: true
...

Теперь создайте файл .env и добавьте следующие значения, получая токены от вашего пользователя IAM в AWS.

AWS_TOKEN={YOUR_AWS_TOKEN}
AWS_SECRET={YOUR_AWS_SECRET}
AWS_PROFILE={THE AWS PROFILE YOU WISH TO USE}
AWS_REGION={YOUR TARGET AWS REGION}

и давайте добавим несколько удобных скриптов для управления нашей сборкой и развертыванием:

"scripts": {
    "setup:dev": "env-cmd -f .env cross-env-shell serverless config credentials --provider aws -o --key '$AWS_TOKEN' --secret '$AWS_SECRET' --profile '$AWS_PROFILE'",
    "build": "env GOOS=linux GOARCH=amd64  go build  -o bin/goserverlesslambda .",
    "deploy:dev": "env-cmd -f .env cross-env-shell serverless deploy  --stage development --aws-profile '$AWS_PROFILE' --region '$AWS_REGION'",
  },

Чтобы разбить приведенные выше сценарии:

  • setup:dev настраивает бессерверную структуру с вашими учетными данными AWS, используя ваши переменные среды
  • build компилирует приложение Go в двоичный файл, который будет работать в среде Lambda.
  • deploy:dev развертывает Lambda на стадии разработки, используя ваши переменные среды

Давайте настроим учетные данные нашего проекта с помощью этой команды:

npm run setup:dev

Это должно вывести следующее:

Идеальный. Пришло время подготовить приложение Go.

Шаг 3: Создание нашей Go Lambda

Во-первых, нам нужно установить необходимые пакеты:

go get github.com/aws/aws-lambda-go

Затем в main.go мы обновляем файл, чтобы он соответствовал следующему:

Пришло время создать наш Go Binary и развернуть его. Запустите следующее:

npm run build
npm run deploy:dev

Вот что получится:

Откройте конечную точку, указанную в выходных данных терминала в Postman, и отправьте запрос POST:

Отлично, теперь у нас есть функция Lambda, которую мы можем развернуть на AWS и успешно запустить из Postman.

Шаг 4. Добавление подключения к базе данных SQL (необязательно)

Создайте новый файл с именем .env.development и добавьте переменную среды databaseConnection:

databaseConnection={USERNAME}:{PASSWORD}@tcp({HOST})/{DATABASE}

Создайте новый каталог с именем config и создайте файл с именем setup.go. Установите пакет драйвера go-sql:

go get github.com/go-sql-driver/mysql

и добавьте в файл следующее:

В вашем файле main.go добавьте следующее в импорт:

...
var SetupError error
var dbCon string
func init() {
 dbCon = os.Getenv("dbCon")
 SetupError = config.ConnectToDb(dbCon)
}
...

Мы должны создать соединение с базой данных вне обработчика, поэтому мы делаем это внутри функции init. Это означает, что соединение будет использоваться повторно, если Lambda будет повторно запущена до того, как его экземпляр будет закрыт, а также гарантирует, что мы не создадим сотни ненужных соединений для каждого вызова.

Обновите функцию HandleRequest, чтобы она соответствовала приведенной ниже:

Снова соберите и разверните свою Lambda:

npm run build
npm run deploy:dev

Если все работает как положено, мы снова должны получить следующее:

Если соединение с базой данных не удалось, вы получите следующий ответ:

Включение Cors

Если вы хотите, чтобы Lambda вызывалась из любого места, нам нужно будет обновить функцию GenerateResponse следующим образом:

Производство

Если вы хотите использовать эту настройку для развертывания производственной Lambda, я рекомендую добавить в package.json следующее:

"deploy:prod": "env-cmd -f .env cross-env-shell serverless deploy --stage production  --aws-profile '$AWS_PROFILE' --region '$AWS_REGION'"

Добавление файла .env.production для вашего databaseConnection (это будет автоматически использоваться с производственным флагом)

Пользовательский домен

Если вы хотите собственный домен, то использовать плагин serverless-domain-manager очень просто. Примером конфигурации serverless.yml будет:

${self:custom.enabled.${opt:stage}, self:custom.enabled.other} — As conditionals are not yet possible this will allow us to use the custom domain only on the Production stage built

Заключение

Надеюсь, вы нашли это проницательным и легким для понимания. Удачи вам в создании собственных Golang Lambdas.

Спасибо, что нашли время, чтобы прочитать мою статью. Надеюсь, вы нашли его познавательным и интересным. Я напишу больше статей о Typescript, Node, React, Vue, GraphQL, Performance, Go и многом другом.

Репозиторий GitHub