如何以无服务器方式运行GO应用程序 - 第2部分
#编程 #serverless #云 #go

本系列的第一部分向您介绍了AWS Lambda Go API Proxy,以及它的框架/软件包特定适配器实现方式(对于gorilla/muxechonet/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,这要归功于特定框架适配器实现。

How does the Gin adapter work

要理解这一点,让我们看一下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()与已经连接的LoggerRecovery中间件创建一个gin.Engine对象。
    • 我们通过使用POSTGETDELETEPUT 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角色等)。

AWS CloudFormation resources

尝试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的短代码验证记录。

DynamoDB table records

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 k​​oude56响应(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 204No 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

快乐建筑!