Пошаговое руководство для разработчиков
Если вы, как и я, являетесь поклонником Голанга и хотите создать свою первую Лямбду, вы можете столкнуться с трудностями при получении пошагового руководства. Эта статья продемонстрирует, насколько это просто, особенно при использовании чрезвычайно удобной 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 и многом другом.