英文:
How to return HTML from a Go Lambda function?
问题
我有一个Go程序,当访问URL时,以HTML格式提供波浪信息。它在一个带有nginx反向代理的虚拟机上运行。
我正在尝试将代码迁移到AWS Lambda,但我不太明白如何触发和返回HTML。
原始代码在下面的片段中执行逻辑并将数据呈现为模板HTML。
func indexHandler(w http.ResponseWriter, r *http.Request) {
GetWeather()
GetSurf()
CheckSurf(ForecastGroup)
p := CodCallPage{Title: "Swell Forecast", RunTime: htmlRunDate, DailyHtmlData: DailyMatchingSwells}
codcallTemplateInit.Execute(w, p)
}
func main() {
http.HandleFunc("/", indexHandler)
http.ListenAndServe(":8000", nil)
}
我相信我不再需要nginx代理,需要调用lambda函数来运行我的代码。所以我将代码更改为以下内容。
func indexHandler(w http.ResponseWriter, r *http.Request) {
GetWeather()
GetSurf()
CheckSurf(ForecastGroup)
p := CodCallPage{Title: "Swell Forecast", RunTime: htmlRunDate, DailyHtmlData: DailyMatchingSwells}
codcallTemplateInit.Execute(w, p)
}
func handler(ctx context.Context, request events.APIGatewayProxyRequest) error {
log.Println("Via Lambda !!")
http.HandleFunc("/", indexHandler)
}
func main() {
lambda.Start(handler)
}
当我运行带有默认JSON文本的AWS测试,lambda函数会超时并报错。
{
"key1": "value1",
"key2": "value2",
"key3": "value3"
}
错误信息如下:
{
"errorMessage": "2023-06-08T08:43:13.714Z d6e2acc0-b1da-4e92-820b-63f8f5050947 Task timed out after 15.01 seconds"
}
我不确定lambda函数是否忽略了测试,或者函数没有以正确的方式返回HTML,或者lambda函数是否期望JSON而不是HTML?请给我一些建议,帮助我理解并指导我应该查看哪些地方。
英文:
I have a Go program that serves wave information in html format when the a URL is hit. It was running on a VM with a nginx reverse proxy.
I am trying to move the code to AWS Lambda, but I am struggling to understand how to trigger and return the html.
The original code did its logic and presented is data as template HTML in the snip below.
func indexHandler(w http.ResponseWriter, r *http.Request) {
GetWeather()
GetSurf()
CheckSurf(ForecastGroup)
p := CodCallPage{Title: "Swell Forecast", RunTime: htmlRunDate, DailyHtmlData: DailyMatchingSwells}
codcallTemplateInit.Execute(w, p)
}
func main() {
http.HandleFunc("/", indexHandler)
http.ListenAndServe(":8000", nil)
}
I believe I no longer need the nginx proxy and need to invoke the lambda function to run my code. So I have changed the code to the following.
func indexHandler(w http.ResponseWriter, r *http.Request) {
GetWeather()
GetSurf()
CheckSurf(ForecastGroup)
p := CodCallPage{Title: "Swell Forecast", RunTime: htmlRunDate, DailyHtmlData: DailyMatchingSwells}
codcallTemplateInit.Execute(w, p)
}
func handler(ctx context.Context, request events.APIGatewayProxyRequest) error {
log.Println("Via Lambda !!")
http.HandleFunc("/", indexHandler)
}
func main() {
lambda.Start(handler)
}
When I run the AWS test, lamba function with the default JSON text.
{
"key1": "value1",
"key2": "value2",
"key3": "value3"
}
It gives an error as it times out:
{
"errorMessage": "2023-06-08T08:43:13.714Z d6e2acc0-b1da-4e92-820b-63f8f5050947 Task timed out after 15.01 seconds"
}
I'm not sure if the test is being ignored by the lambda function or the function isn't returning the HTML in the correct way, or if the lambda function is expecting JSON rather than HTML ? Any pointers to help me understand and where I should look, please?
答案1
得分: 2
不需要在 Lambda 函数上运行 HTTP 服务器。这段代码应该可以工作。
func indexHandler(ctx context.Context, req events.APIGatewayProxyRequest) (string, error) {
GetWeather()
GetSurf()
CheckSurf(ForecastGroup)
p := CodCallPage{Title: "Swell Forecast", RunTime: htmlRunDate, DailyHtmlData: DailyMatchingSwells}
var res bytes.Buffer
if err := codcallTemplateInit.Execute(&res, p); err != nil {
return "", err
}
return res.String(), nil
}
func main() {
lambda.Start(indexHandler)
}
使用 AWS API 网关代理,你需要返回 events.APIGatewayProxyResponse
,所以 indexHandler
将会有所不同。
func indexHandler(ctx context.Context, req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
GetWeather()
GetSurf()
CheckSurf(ForecastGroup)
p := CodCallPage{Title: "Swell Forecast", RunTime: htmlRunDate, DailyHtmlData: DailyMatchingSwells}
var res bytes.Buffer
if err := codcallTemplateInit.Execute(&res, p); err != nil {
return events.APIGatewayProxyResponse{StatusCode: 400, Body: err.Error()}, err
}
return events.APIGatewayProxyResponse{Body: res.String(), StatusCode: 200}, nil
}
英文:
There's no need to run an http server on a lambda function. this code should work
func indexHandler(ctx context.Context, req events.APIGatewayProxyRequest) (string, error) {
GetWeather()
GetSurf()
CheckSurf(ForecastGroup)
p := CodCallPage{Title: "Swell Forecast", RunTime: htmlRunDate, DailyHtmlData: DailyMatchingSwells}
var res bytes.Buffer
if err := codcallTemplateInit.Execute(&res, p); err != nil {
return "", err
}
return res.String(), nil
}
func main() {
lambda.Start(indexHandler)
}
Using AWS API gateway proxy you'll need to return return events.APIGatewayProxyResponse
so indexHandler
will be different.
func indexHandler(ctx context.Context, req events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) {
GetWeather()
GetSurf()
CheckSurf(ForecastGroup)
p := CodCallPage{Title: "Swell Forecast", RunTime: htmlRunDate, DailyHtmlData: DailyMatchingSwells}
var res bytes.Buffer
if err := codcallTemplateInit.Execute(&res, p); err != nil {
return events.APIGatewayProxyResponse{StatusCode: 400, Body: err.Error()}, err
}
return events.APIGatewayProxyResponse{Body: res.String(), StatusCode: 200}, nil
}
</details>
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论