本系列的第一部分向您介绍了AWS Lambda Go API Proxy,以及它的框架/软件包特定适配器实现方式(对于gorilla/mux
,echo
和net/http
)允许您以Amazon API Gateway前面的AWS Lambda功能运行现有的GO应用程序。如果您还没有,我鼓励您进行take a look at it,以便对AWS Lambda Go API代理进行基本了解。
AWS lambda Go API代理也支持Gin,是最受欢迎的Go Web框架之一!这篇后续博客文章将展示如何使用Gin
框架编写现有的URL Shortener服务,并将其作为无服务器AWS Lambda功能运行。我们将不使用AWS SAM,而是会更改内容并使用AWS CDK部署解决方案。
该代码可在GitHub
上找到
AWS Lambda的杜松子酒适配器如何工作?
aws-lambda-go-api-proxy
软件包使得可以使用杜松子酒编写的go API,这要归功于特定框架适配器实现。
要理解这一点,让我们看一下lambda函数的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()
与已经连接的Logger
和Recovery
中间件创建一个gin.Engine
对象。 - 我们通过使用
POST
,GET
,DELETE
和PUT
gin.Engine
对象的方法将gin.HandlerFunc
与每个HTTP
方法和路径相关联。 -
ginadapter.New
功能采用此*gin.Engine
对象并返回ginadapter.GinLambda
。
- 我们使用
- 在
Handler
实施中:-
Proxy
对象的Proxy
(或ProxyWithContext
)接收events.APIGatewayProxyRequest
,将其转换为http.Request
对象,然后将其发送到gin.Engine
进行路由。 - 它返回从写入响应作者的数据生成的代理响应对象(
events.APIGatewayProxyResponse
)(http.ResponseWriter
)。
-
应用概述
此博客中介绍的示例应用程序是bit.ly
的修剪版本或您可能使用的其他解决方案。它使用Amazon DynamoDB进行持久性并公开HTTP
端点以访问应用程序(基本的crud操作)。
尽管我们不会详细讨论应用程序代码,但了解基本结构很重要。这是URL Shortener应用程序的包装结构(在function目录中):
.
├── db
│ └── db.go
├── go.mod
├── go.sum
├── handler.go
├── main.go
-
db
软件包包含与DynamoDB
交互的代码。 -
handler.go
文件具有HTTP
方法的实现。 -
main.go
文件使用路线和ginadapter.GinLambda
对象创建杜松子酒引擎来代理请求和响应。
是时候部署URL Shortener应用程序并进行了!
先决条件
在继续之前,请确保已安装Go programming language( 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 bindings for 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云形式模板,请运行
cdk synth
并检查cdk.out
文件夹
您可以跟踪终端中的进度或导航到AWS控制台:CloudFormation > Stacks > LambdaGolangProxyAPIDemoStack
创建所有资源后,您可以尝试使用该应用程序。您应该有:
- An API Gateway REST API.
- lambda函数。
- 一个用于存储应用程序数据的DynamoDB表。
- 还有其他一些组件(例如
IAM
角色等)。
尝试URL Shortener应用程序
您将需要API网关端点与应用程序调用 - 它可作为堆栈输出的一部分(在终端或AWS CloudFormation
控制台中的 outputs tab中)可用。它应该看起来像这样-https://foobarbazl.execute-api.us-east-1.amazonaws.com/prod/
1.首先生成一个简短的代码
要生成一个简短的代码,您需要作为HTTP
POST
请求的一部分(例如https://abhirockzz.github.io/
)中的有效负载主体中的原始URL
# 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
响应中获得HTTP 201
以及短代码(作为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>
for。 https://8zbqx074rl.execute-api.us-east-1.amazonaws.com/prod/app/4b824fad
使用浏览器导航到链接后,您将自动重定向到您指定的原始URL。为了更好地了解幕后发生的事情,请尝试使用curl
访问相同的URL
curl -i $URL_SHORTENER_APP_URL/app/1ee3ad1b
您应该得到HTTP
koude56响应(Found
),而URL重定向是由于具有原始URL的Location
HTTP
标头而发生的。
# 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
这是带有JSON有效载荷的HTTP
PUT
请求,该请求指定状态(在这种情况下为false
涉及disable
操作)以及短代码,这是API Gateway Endpoint的路径参数。如果一切正常,您应该会看到一个HTTP 204
(No Content
)响应。
检查dynamodb中的相应记录 - 活动属性应切换到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 Shortener应用程序的基本操作。作为练习,请尝试以下情况并检查响应:
- 访问禁用的URL。
- 启用禁用URL(使用
{"active": true}
)。 - 访问无效的简短代码(不存在)。
清理
完成后,要删除所有服务,只需使用:
cdk destroy
结论
在此博客文章中,您采用了使用杜松子酒框架构建的URL Shortener应用程序,并将其部署为Lambda功能。尽管这是一个简单的例子,但可以使用相同的方法来部署更复杂的应用程序。只要您有合理的疑虑分离并且应用是模块化的,大多数工作将涉及重构逻辑的部分(在这种情况下为main.go
),以将杜松子路由器(gin.Engine
)连接到lambda功能处理程序(入口点)通过使用the adapter implementation for Gin。
快乐建筑!