Как вернуть HTML из функции Go Lambda?

У меня есть программа 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? Любые указатели, которые помогут мне понять и где я должен искать, пожалуйста?

Вероятно, время ожидания вашей GetWeather() и других функций Get* истекло. Вы должны проверить, действительно ли вы можете подключиться к тому месту, где эти вызовы пытаются подключиться.

Marcin 08.06.2023 12:20

Спасибо, но они работают ни в одной лямбде. Мне помог ответ @yosher lutski ниже.

AndyM 08.06.2023 14:54
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
2
50
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Нет необходимости запускать 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 08.06.2023 14:52

Привет @AndyM, я рад, что это помогло, было бы неплохо, если бы ты отметил это как правильный ответ. для вашего следующего вопроса я попытаюсь вместо этого вернуть APIGatewayProxyResponse. Я отредактирую это в своем ответе.

yosher lutski 08.06.2023 15:43

Спасибо. Я использовал ваше обновление для возврата APIGatewayProxyResponse. Теперь я получаю сообщение об ошибке. «не может использовать events.APIGatewayProxyResponse{…} (значение типа events.APIGatewayProxyResponse) в качестве строкового значения в операторе возврата». Я смотрю, как это исправить.

AndyM 08.06.2023 16:06

Большое спасибо, йошер, теперь я понимаю, что возврат необходим для правильной работы функции. . Исправлено и работает. Для всех остальных я исправил тип возврата в APIGatewayProxyResponse и должен был установить заголовки := map[string]string{ "Content-Type": "text/html; charset=UTF-8", } для отображения html.

AndyM 08.06.2023 16:44

Другие вопросы по теме