У меня есть программа Go, которая предоставляет информацию о волнах в формате html при попадании по URL-адресу. Он работал на виртуальной машине с обратным прокси-сервером 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, и мне нужно вызывать лямбда-функцию для запуска моего кода. Поэтому я изменил код на следующий.
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)
}
Когда я запускаю тест AWS, лямба работает с текстом JSON по умолчанию.
{
"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"
}
Я не уверен, игнорируется ли тест лямбда-функцией, или функция не возвращает HTML правильным образом, или лямбда-функция ожидает JSON, а не HTML? Любые указатели, которые помогут мне понять и где я должен искать, пожалуйста?
Спасибо, но они работают ни в одной лямбде. Мне помог ответ @yosher lutski ниже.





Нет необходимости запускать 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, вам нужно будет вернуть return 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
}
Спасибо!. Это работает, когда я запускаю тестовую функцию, теперь я вижу html в консоли. Однако, когда я назначаю триггер шлюза API для вызова функции, я получаю в браузере следующее: "{"message":"Internal Server Error"}". Я пробовал триггеры HTTP API и REST API. Мой следующий квест :)
Привет @AndyM, я рад, что это помогло, было бы неплохо, если бы ты отметил это как правильный ответ. для вашего следующего вопроса я попытаюсь вместо этого вернуть APIGatewayProxyResponse. Я отредактирую это в своем ответе.
Спасибо. Я использовал ваше обновление для возврата APIGatewayProxyResponse. Теперь я получаю сообщение об ошибке. «не может использовать events.APIGatewayProxyResponse{…} (значение типа events.APIGatewayProxyResponse) в качестве строкового значения в операторе возврата». Я смотрю, как это исправить.
Большое спасибо, йошер, теперь я понимаю, что возврат необходим для правильной работы функции. . Исправлено и работает. Для всех остальных я исправил тип возврата в APIGatewayProxyResponse и должен был установить заголовки := map[string]string{ "Content-Type": "text/html; charset=UTF-8", } для отображения html.
Вероятно, время ожидания вашей
GetWeather()и других функцийGet*истекло. Вы должны проверить, действительно ли вы можете подключиться к тому месту, где эти вызовы пытаются подключиться.