Как вызвать AWS Lamda из AWS API Gateway в Scala?

Я создал экземпляр AWS API Gateway для AWS Lambda.

Как я могу обрабатывать методы HTTP в функции Lamda?

Мой пример кода:

    class ApiGatewayHandler extends RequestHandler[Request, ApiGatewayResponse] {

  def handleRequest(input: Request, context: Context): ApiGatewayResponse = {

    val headers = Map("x-custom-response-header" -> "my custom response header value")
    ApiGatewayResponse(200, "Go Serverless v1.0! Your function executed successfully!",
      JavaConverters.mapAsJavaMap[String, Object](headers),
      true)
  }
}

Класс запроса:

class Request(@BeanProperty var key1: String, @BeanProperty var key2: String, @BeanProperty var key3: String) {
  def this() = this("", "", "")
}

Как мне обрабатывать различные методы HTTP? Какие библиотеки следует использовать?


person Sekhar    schedule 01.12.2018    source источник


Ответы (1)


AWS API Gateway позволяет передавать такую ​​информацию, как метод HTTP, путь запроса, заголовки и т. д., в AWS Lambda с помощью Интеграция Lambda Proxy.

После успешной настройки включите библиотеки aws-lambda-java- core и aws-lambda-java-events в свой проект.

В СБТ:

libraryDependencies ++= Seq(
   "com.amazonaws" % "aws-lambda-java-core" % "1.2.0",
   "com.amazonaws" % "aws-lambda-java-events" % "2.2.3"
)

Это официальные библиотеки от AWS для разработки функций AWS Lambda в Java/Scala.

Кроме того, вам понадобится библиотека обработки JSON, например circe.

В СБТ:

val circeVersion = "0.10.0"

libraryDependencies ++= Seq(
  "io.circe" %% "circe-core",
  "io.circe" %% "circe-generic",
  "io.circe" %% "circe-parser"
).map(_ % circeVersion)

Теперь вы можете легко адаптировать свой обработчик для использования новой модели:

import scala.collection.JavaConverters._
import com.amazonaws.services.lambda.runtime.events.{APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent}
import com.amazonaws.services.lambda.runtime.{Context, RequestHandler}
import io.circe._, io.circe.generic.auto._, io.circe.parser._, io.circe.syntax._
// TODO: Import your Request class!

object Handler extends RequestHandler[APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent] {

  override def handleRequest(input: APIGatewayProxyRequestEvent, context: Context): APIGatewayProxyResponseEvent = {

    def log(message: String): Unit = context.getLogger.log(message)

    log("--- Received new request ---")
    log(s"Method: '${input.getHttpMethod}'") // Example use of HTTP method
    log(s"Proxy Path: '${input.getPath}'") // Example use of request path

    val request = decode[Request](input.getBody) // Decode request using circe

    request match {
        case Right(req) => // TODO: Implement business logic
        case Left(req) => // TODO: Implement error handling
    }

    val response = new APIGatewayProxyResponseEvent() // Example for a response
        .withStatusCode(200)
        .withHeaders(
            Map(
                "Content-Type" -> "text/raw",
                // TODO: Add your own headers
            ).asJava // Convert the Scala Map to a Java Map
        )
        .withBody("Under construction!") // Or use circe again to encode a POJO

    response // Return the response
  }
}

Я не смог полностью протестировать этот пример, поэтому обязательно вернитесь с любыми проблемами, с которыми вы можете столкнуться.

Кстати, сообщения журнала, которые будет создавать ваша функция AWS Lambda, можно найти в AWS Cloudwatch.

Надеюсь, это поможет.

person Markus Appel    schedule 03.12.2018