【问题标题】:Call a specific route in a lambda function written using Chalice在使用 Chalice 编写的 lambda 函数中调用特定路由
【发布时间】:2019-09-10 22:17:06
【问题描述】:

我是 Chalice 的新手,我正在尝试在 python 脚本中使用 boto3 调用 aws lambda。我需要知道如何在该 lambda 中调用特定的“路线”。也许在事件中设置客户端上下文或其他内容?

python 脚本可以调用 lambda 函数,但不确定我如何调用(传入)该 lambda 中的路由。

app.py 中的代码:

@app.route('/dosomething', methods=['GET'], cors=True)
def doSomething():
    results = somethingWasDone()
    return {"result": results}

因此,如果 lambda 的名称是 myLambda,我想调用 myLambda 并告诉它触发上述代码以进行 dosomething 路由。谢谢

【问题讨论】:

  • 我认为你必须制作一个测试事件并发送测试事件。测试事件表单应类似于 AWS API Gateway 事件表单。 API 网关事件有一个path 参数,这是关键。
  • @Lamanus 有答案。请注意,像 Chalice 这样的框架提供了实际的 Lambda 入口点,然后使用 route 装饰器来决定如何处理传入事件(API 网关或 ALB)。有关示例事件,请参阅 docs.aws.amazon.com/lambda/latest/dg/with-on-demand-https.htmldocs.aws.amazon.com/lambda/latest/dg/services-alb.html
  • @Lamanus 您有链接或其他示例代码吗?我找不到任何东西,也无法使用 api gw 客户端,因为我想直接调用 lambda。
  • @bimsapi 我找不到任何调用 lambda 并在链接中传递路径的代码。
  • 我想我没听懂这个问题。通常,您通过 HTTP 调用 Chalice 应用程序的 Lambda。请参阅 chalice.readthedocs.io/en/latest/quickstart.html 中的 curl 示例。 chalice deploy 为 HTTP 和 Lambda 创建一个 API 网关。您向网关提交 HTTP 请求,网关将 HTTP 协议元素映射到传递给 Chalice Lambda 的事件中的字段,后者决定调用哪个路由/函数。如果您直接通过 boto 而不是 HTTP 调用 Lambda,您可以通过提供其事件的等效项(这些链接指向的内容)来模拟 API 网关。

标签: python amazon-web-services aws-lambda boto3 chalice


【解决方案1】:

要调用任何 Lambda 函数,您需要使用 lambda:Invoke API 调用。在 AWS CLI 中,通过 aws lambda invoke 调用它;来自boto3,它通过boto3.client('lambda').invoke(**kwargs) 调用。

最相关的论点是:

  • 函数名称。要调用的函数的名称(在 CLI 上为 --function-name
  • 调用类型。确定是调用 API 同步 (RequestResponse) 还是异步 (Event)(CLI:--invocation-type
  • 有效载荷。成为 event 参数的数据传递给 Lambda 处理程序(CLI:--payload,并且可以作为文件 URL 提供。例如,--payload file://./relative/path.json

此外,当通过aws lambda invoke 调用时,您需要指定一个输出文件,Lambda 的结果将被写入其中。

见:

在使用 Chalice 或任何实现类似“Web 路由”行为的框架时,仅调用所需的路由需要您提供一个看起来像 API Gateway 或 Application Load Balancer 生成的事件的事件。即,如果您有 N 条路由,框架通常只会部署一个 Lambda 函数,并使用事件中编码的 HTTP 信息来确定在函数中调用哪个路由。

见:

最小的事件文件 (payload.json) 可能如下所示。特别相关的是pathresource 参数。您可能需要使 resource 与 Chalice 为您生成的 API Gateway 中的值匹配。

{
  "path": "/",
  "resource": "/",
  "queryStringParameters": {},
  "headers": {},
  "httpMethod": "GET",
  "requestContext": {
    "httpMethod": "GET"
  },
  "body": {}
}

生成的 CLI 调用如下所示:

aws lambda invoke --function-name fn \
  --payload file://./payload.json \
  --invocation-type RequestResponse \
  output.txt

希望对您有所帮助。

【讨论】:

  • 谢谢!我会试试这个。我知道如何调用 lambda,但传递圣杯路由所需的路由是我需要弄清楚的部分。此外,我正在使用 boto3 进行调用,但相同的有效负载文件也应该在那里工作。
猜你喜欢
  • 1970-01-01
  • 2019-07-18
  • 1970-01-01
  • 2012-05-08
  • 1970-01-01
  • 2020-01-31
  • 2020-04-21
  • 1970-01-01
  • 2019-01-20
相关资源
最近更新 更多