是否可以使用 Java SDK 在对 AWS Lambda 的 Invoke 请求中包含 headers 和查询参数

Is it possible to include headers and query parameters with the Invoke request to AWS Lambda using the Java SDK

我正在通过使用 Invoke

直接从 AWS Java SDK 调用它来替换 Lambda 前面的 AWS API 网关
InvokeRequest request = new InvokeRequest();
try {
    request.putCustomQueryParameter("city", "Seattle");
    request.withFunctionName(functionName).withPayload(ByteBuffer.wrap(IOUtils.toByteArray(content)));
} catch (IOException e1) {
    e1.printStackTrace();
}

有没有办法在请求的同时传入headers或查询参数?我尝试了上面的代码,但我只能发送有效载荷。

快速回答: putCustomRequestHeader 只能用于向发送到 AWS Lambda 服务的 HTTP 请求添加请求 headers。它们不会被转发到 AWS Lambda 函数。

详细回答:我相信您在这里混淆了两种不同的东西,并且对术语有误解。如果您调用 AWS Lambda 函数,您将向 AWS Lambda 服务发送 HTTP 请求,然后该服务将执行 Lambda 函数的实际调用(并将您的有效负载数据转发到该函数)。例如,AWS Lambda 服务会查看是否有空闲函数并使用它,否则它会启动一个新的函数实例并使用它。

a) 直接调用 AWS Lambda

如果您想 invoke an AWS Lambda Function 使用 AWS SDK,您可以从您的代码中执行此操作,例如一个 Java 程序:

Java Program --> Invoke AWS Lambda Function

这意味着,您的代码正在直接调用 Lambda 函数。在这种情况下,您只能向函数提供有效负载。如果你想添加任何“附加”数据,你只能扩展有效载荷数据。

b) 间接调用 AWS Lambda

还有一种方法可以“间接”调用 Lambda 函数,例如一个位于 API 网关后面的函数。这样的 Lambda 函数可以接收 HTTP headers 和查询参数,因为 API 网关正在接收 HTTP 请求并将 HTTP 事件转发到 AWS Lambda 函数:

Java Program --> Send HTTP request --> API Gateway receives HTTP --> API Gateway invokes AWS Lambda Function with HTTP event data

在 API 网关调用 AWS Lambda 函数的最后一步中,API 网关也将“仅”调用 Lambda 函数。但它提供所有 HTTP 数据(它之前收到的)作为 Lambda 函数的有效负载数据。这就是为什么您可以在这种情况下访问 HTTP headers 和查询参数。

您问题的解答

如果您确实需要提供 HTTP headers 或查询参数,请在您的函数前面放置一个 API 网关。但是,如果您只想从您的代码中调用您的函数,那么只需扩展您发送的有效负载数据并添加您想要提供的数据。