Узнайте, как взять приложение для сокращения URL-адресов, написанное с помощью Gin, и запустить его как бессерверную функцию AWS Lambda.

В первой части этой серии вы познакомились с AWS Lambda Go API Proxy и с тем, как его реализация адаптера для конкретной платформы/пакета (для gorilla/mux, echo и net/http) позволяет запускать существующие приложения Go как функции AWS Lambda, перед которыми стоит Amazon API Gateway. Если вы еще этого не сделали, я рекомендую вам взглянуть на него, чтобы получить общее представление о прокси-сервере AWS Lambda Go API.



Прокси-сервер AWS Lambda Go API также поддерживает Gin, один из самых популярных веб-фреймворков Go! В этом последующем сообщении в блоге будет показано, как взять существующий сервис сокращения URL-адресов, написанный с использованием платформы Gin, и запустить его как бессерверную функцию AWS Lambda. Вместо использования AWS SAM мы немного изменим ситуацию и будем использовать AWS CDK для развертывания решения.

Код доступен на GitHub

Как работает адаптер Gin для AWS Lambda Go API Proxy?

Пакет aws-lambda-go-api-proxy позволяет запускать API-интерфейсы Go, написанные с использованием Gin, благодаря реализации адаптера для конкретной платформы.

Чтобы понять это, давайте заглянем в файл main.go лямбда-функции:

var ginLambda *ginadapter.GinLambda

func init() {
	r := gin.Default()

	r.POST("/app", CreateShortURL)
	r.GET("/app/:shortcode", GetShortURL)
	r.DELETE("/app/:shortcode", DeleteShortURL)
	r.PUT("/app/:shortcode", UpdateStatus)

	ginLambda = ginadapter.New(r)
}

func Handler(ctx context.Context, req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
	return ginLambda.ProxyWithContext(ctx, req)
}

func main() {
	lambda.Start(Handler)
}
  • В функции init:
  • Мы используем gin.Default() для создания объекта gin.Engine с уже подключенным промежуточным ПО Logger и Recovery.
  • Мы создаем маршруты, связывая gin.HandlerFunc с каждым методом HTTP и путем, используя методы POST, GET, DELETE и PUT объекта gin.Engine.
  • Функция ginadapter.New принимает этот объект *gin.Engine и возвращает ginadapter.GinLambda.
  • В реализации Handler:
  • Метод Proxy (или ProxyWithContext) объекта ginadapter.GinLambda получает events.APIGatewayProxyRequest, преобразует его в объект http.Request и отправляет в gin.Engine для маршрутизации.
  • Он возвращает прокси-объект ответа (events.APIGatewayProxyResponse), сгенерированный из данных, записанных в модуль записи ответа (http.ResponseWriter).

Обзор приложений

Пример приложения, представленный в этом блоге, представляет собой урезанную версию bit.ly или других решений, которые вы могли использовать. Он использует Amazon DynamoDB для сохранения и предоставляет HTTP конечных точек для доступа к приложению (базовые операции CRUD).

Хотя мы не будем подробно обсуждать код приложения, важно понимать его базовую структуру. Вот структура пакета приложения для сокращения URL (в каталоге function):

.
├── db
│   └── db.go
├── go.mod
├── go.sum
├── handler.go
├── main.go
  • Пакет db содержит код для взаимодействия с DynamoDB.
  • Файл handler.go содержит реализацию методов HTTP.
  • Файл main.go создает движок Gin с маршрутами и объектом ginadapter.GinLambda для прокси-запросов и ответов.

Пришло время развернуть приложение для сокращения URL-адресов и попробовать!

Предпосылки

Прежде чем продолжить, убедитесь, что у вас установлены язык программирования Go (v1.18 или выше) и AWS CDK.

Клонируйте репозиторий GitHub и перейдите в нужный каталог:

git clone https://github.com/build-on-aws/golang-gin-app-on-aws-lambda

cd golang-gin-app-on-aws-lambda

Используйте AWS CDK для развертывания решения

AWS CDK — это платформа, которая позволяет определить облачную инфраструктуру как код в одном из поддерживаемых программ и предоставить ее через AWS CloudFormation. В этом случае мы будем использовать привязки Go для AWS CDK.

Вы можете обратиться к коду в каталоге cdk.

Чтобы начать развертывание, вызовите команду cdk deploy. Вы увидите список ресурсов, которые будут созданы, и вам нужно будет предоставить подтверждение, чтобы продолжить.

cd cdk

cdk deploy

# output

Bundling asset LambdaGolangProxyAPIDemoStack/gin-go-lambda-function/Code/Stage...

✨  Synthesis time: 5.94s

This deployment will make potentially sensitive changes according to your current security approval level (--require-approval broadening).
Please confirm you intend to make the following modifications:

//.... omitted

Do you wish to deploy these changes (y/n)? y

Введите y, чтобы начать создание ресурсов AWS, необходимых для приложения. Это начнет создавать ресурсы AWS, необходимые для нашего приложения.

Если вы хотите увидеть шаблон AWS CloudFormation, который будет использоваться за кулисами, запустите cdk synth и проверьте папку cdk.out

Вы можете отслеживать прогресс в терминале или перейти в консоль AWS: CloudFormation > Stacks > LambdaGolangProxyAPIDemoStack

Как только все ресурсы будут созданы, вы можете опробовать приложение. Вы должны иметь:

  • API REST шлюза API.
  • Лямбда-функция.
  • Таблица DynamoDB для хранения данных приложения.
  • И несколько других компонентов (например, IAM ролей и т. д.).

Попробуйте приложение для сокращения URL

Вам понадобится конечная точка шлюза API для вызова с приложением — она доступна как часть выходных данных стека (в терминале или на вкладке Выходные данные в консоли AWS CloudFormation для вашего стека). Должно получиться примерно так - https://foobarbazl.execute-api.us-east-1.amazonaws.com/prod/

1. Начните с создания короткого кода

Чтобы сгенерировать короткий код, вам необходимо передать исходный URL-адрес в теле полезной нагрузки как часть запроса HTTP POST (например, https://abhirockzz.github.io/)

# e.g. export URL_SHORTENER_APP_URL=https://foobarbazl.execute-api.us-east-1.amazonaws.com/prod/app
export URL_SHORTENER_APP_URL=<replace with API Gateway endpoint above>/app

# invoke the endpoint to create short code
curl -i -X POST -d '{"url":"https://abhirockzz.github.io/"}' $URL_SHORTENER_APP_URL
curl -i -X POST -d '{"url":"https://abhishek1987.medium.com/"}' $URL_SHORTENER_APP_URL
curl -i -X POST -d '{"url":"https://dzone.com/users/456870/abhirockzz.html"}' $URL_SHORTENER_APP_URL

Если все пойдет хорошо, вы должны получить HTTP 201 вместе с коротким кодом в ответе HTTP (в качестве полезной нагрузки JSON).

HTTP/2 201 
content-type: text/plain; charset=utf-8
content-length: 25
apigw-requestid: VTzPsgmSoAMESdA=

{"short_code":"1ee3ad1b"}

Проверьте таблицу DynamoDB, чтобы проверить записи с коротким кодом с соответствующим URL-адресом.

2. Получите доступ к URL-адресу, используя короткий код.

Ссылка доступа будет иметь следующий формат — <URL_SHORTENER_APP_URL>/app/<generated short code>, например. https://8zbqx074rl.execute-api.us-east-1.amazonaws.com/prod/app/4b824fad

Как только вы перейдете по ссылке с помощью браузера, вы будете автоматически перенаправлены на исходный URL-адрес, который вы указали. Чтобы лучше понять, что происходит за кулисами, попробуйте получить доступ к тому же URL-адресу с помощью curl.

curl -i $URL_SHORTENER_APP_URL/app/1ee3ad1b

Вы должны получить ответ HTTP 302 (Found), а перенаправление URL-адреса происходит из-за заголовка Location HTTP, который имеет исходный URL-адрес.

# some of the headers omitted for brevity
HTTP/2 302 
content-type: application/json
content-length: 0
location: https://abhirockzz.github.io/
....

3. Отключить короткий код

Вы можете отключить (и включить) короткие коды. Исходный URL будет доступен, только если связь находится в активном состоянии.

Чтобы отключить короткий код:

export URL_SHORTENER_APP_URL=<replace with API Gateway endpoint above>/app

curl -i -X PUT -d '{"active": false}'  -H 'Content-Type: application/json' $URL_SHORTENER_APP_URL/3626fb51

Это запрос HTTP PUT с полезной нагрузкой JSON, которая указывает статус (false в данном случае относится к действию disable) вместе с коротким кодом, который является параметром пути к конечной точке шлюза API. Если все работает хорошо, вы должны увидеть ответ HTTP 204 (No Content).

Проверьте соответствующую запись в DynamoDB — атрибут active должен был измениться на false.

4. Удалить короткий код

export URL_SHORTENER_APP_URL=<replace with API Gateway endpoint above>/app

curl -i -X DELETE $URL_SHORTENER_APP_URL/<short code>

Как и в случае обновления, вы должны получить ответ HTTP 204. Но на этот раз соответствующая запись DynamoDB будет удалена.

Мы рассмотрели основные операции приложения для сокращения URL-адресов. В качестве упражнения попробуйте следующие сценарии и проверьте ответы:

  • Доступ к отключенному URL-адресу.
  • Включите отключенный URL-адрес (используйте {"active": true}).
  • Получите доступ к недопустимому короткому коду (который не существует).

Очистить

Когда вы закончите, чтобы удалить все службы, просто используйте:

cdk destroy

Заключение

В этом сообщении блога вы взяли приложение для сокращения URL-адресов, созданное с использованием среды Gin, и развернули его как функцию Lambda. Хотя это был простой пример, тот же подход можно использовать для развертывания более сложных приложений. Пока у вас есть разумное разделение задач и ваше приложение является модульным, большая часть работы будет включать рефакторинг частей логики (в данном случае main.go) для подключения маршрутизатора Gin (gin.Engine) к обработчику функции Lambda (точка входа). с помощью реализации адаптера для Gin.

Счастливого строительства!