【问题标题】:Can't invoke function via URL无法通过 URL 调用函数
【发布时间】:2022-09-27 19:03:43
【问题描述】:

我基于 Micronaut 和 Kotlin 创建了一个 lambda 函数。它提供了两个控制器, \"/\" 只是说 Hello World 和 \"/somefunc\" 用于做事。 当我通过 CLI 执行它时,它按预期工作

aws lambda invoke --function-name MYFUNC --cli-binary-format raw-in-base64-out --payload \'{ \"path\": \"/somefunc\" }\' response.json

当我在 lambda 页面 https://eu-central-1.console.aws.amazon.com/lambda/home?region=eu-central-1#/functions/MYFUNC?tab=testing 上调用测试时 ,它按预期工作

但是当我调用公共 URL https://THEPUBLICURL.lambda-url.eu-central-1.on.aws/somefunc 时,它总是得到调用 \"/\" 控制器的结果。 而当我调用https://THEPUBLICURL.lambda-url.eu-central-1.on.aws/somefuncthatdoesnotexist 时,它也会响应\"/\" 控制器的回复。

函数处理程序设置为 io.micronaut.function.aws.proxy.MicronautLambdaHandler

调用公共 URL 时我做错了什么?

编辑:这是示例代码:

package com.example

import io.micronaut.http.annotation.Controller
import io.micronaut.http.annotation.Get
import io.micronaut.runtime.Micronaut.*

fun main(args: Array<String>) {
    run(*args)
}
@Controller
open class HomeController {
    @Get
    fun hello() = mapOf(\"message\" to \"Hello World\")
    @Get(\"/somefunc\")
    fun somefunc() = mapOf(\"message\" to \"Hello some world\")

}

    标签: amazon-web-services kotlin aws-lambda micronaut


    【解决方案1】:

    根据https://docs.aws.amazon.com/lambda/latest/dg/urls-invocation.html,lambda 的有效负载包括rawPath 属性,而不是path 属性。

    因此,您的 lambda 代码应根据属性。你的手动调用应该看起来像

    aws lambda invoke --function-name MYFUNC --cli-binary-format raw-in-base64-out --payload '{ "rawPath": "/somefunc" }' response.json
    

    【讨论】:

    • 所以我总是必须在调用 THEPUBLICURL.lambda-url.eu-central-1.on.aws 而不是简单地调用 THEPUBLICURL.lambda-url.eu-central-1.on.aws/somefunc 时提供有效负载?
    • @MadCatERZ 不!?你只是期待错误的有效载荷。你所做的一切都是正确的,除了期待path 而不是rawPath
    • 好的,更准确地说:我只想知道为什么在THEPUBLICURL.lambda-url.eu-central-1.on.aws/somefunc 上发出GET 请求不会产生对应函数@Get("/somefunc") fun somefunc(): Map&lt;String, String&gt; { 的结果返回值
    • @MadCatERZ 不需要更精确。这完全取决于@Get 应该做什么。推测在请求/事件中期望path,但没有找到path,只有rawPath。您没有显示任何处理请求的代码,我只是告诉您,您拥有的任何代码都是错误的,因为它忽略了rawPath
    • 同时,我实现了一个依赖于 event.rawPath 的 Node.js Lambda,几乎可以立即运行。我会做更多关于 Micronaut vs Lamba 的研究非常感谢你的耐心:-)
    【解决方案2】:

    所以我终于发现:似乎不可能将路径附加到公共 URL。 解决方案是使用 API 网关来调用 Lambda

    【讨论】:

      猜你喜欢
      • 2021-11-14
      • 1970-01-01
      • 2019-03-11
      • 2019-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-10-24
      • 2013-05-29
      相关资源
      最近更新 更多