Узнайте, как взять приложение для сокращения 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.
Счастливого строительства!