当前位置: 首页 > 知识库问答 >
问题:

无法执行使用Micronaut和Graal构建的AWS Lambda函数:解码JSON流时出错

程赞
2023-03-14

我使用Graal和Micronaut构建了一个原生java AWS Lambda函数,如下所述

将其部署到AWS Lambda(自定义运行时)后,我无法成功执行它。

AWS显示的错误是:

{
  "errorType": "Runtime.ExitError",
  "errorMessage": "RequestId: 9a231ad9-becc-49f7-832a-f9088f821fb2 Error: Runtime exited with error: exit status 1"
}

AWS日志输出为:

START RequestId: 9a231ad9-becc-49f7-832a-f9088f821fb2 Version: $LATEST
01:13:08.015 [main] INFO  i.m.context.env.DefaultEnvironment - Established active environments: [ec2, cloud, function]
Error executing function (Use -x for more information): Error decoding JSON stream for type [request]: No content to map due to end-of-input
 at [Source: (BufferedInputStream); line: 1, column: 0]
END RequestId: 9a231ad9-becc-49f7-832a-f9088f821fb2
REPORT RequestId: 9a231ad9-becc-49f7-832a-f9088f821fb2  Duration: 698.31 ms Billed Duration: 700 ms     Memory Size: 512 MB Max Memory Used: 54 MB  
RequestId: 9a231ad9-becc-49f7-832a-f9088f821fb2 Error: Runtime exited with error: exit status 1
Runtime.ExitError

但是当我使用本地测试它时

echo '{"value":"testing"}' | ./server

我得到了

01:35:56.675 [main] INFO  i.m.context.env.DefaultEnvironment - Established active environments: [function]
{"value":"New value: testing"}

功能代码为:

@FunctionBean("user-data-function")
public class UserDataFunction implements Function<UserDataRequest, UserData> {

    private static final Logger LOG = LoggerFactory.getLogger(UserDataFunction.class);

    private final UserDataService userDataService;

    public UserDataFunction(UserDataService userDataService) {
        this.userDataService = userDataService;
    }

    @Override
    public UserData apply(UserDataRequest request) {
        if (LOG.isDebugEnabled()) {
            LOG.debug("Request: {}", request.getValue());
        }

        return userDataService.get(request.getValue());
    }
}

UserDataService是:

@Singleton
public class UserDataService {

    public UserData get(String value) {
        UserData userData = new UserData();
        userData.setValue("New value: " + value);

        return userData;
    }
}

为了在AWS控制台上测试它,我配置了以下测试事件:

{ "value": "aws lambda test" }

注:我向AWS Lambda上传了一个zip文件,其中包含“服务器”和“引导”文件,以允许如前所述的“自定义运行时”。

我做错了什么?

提前谢谢。

Tiago Peixoto。

编辑:添加了AWS控制台上使用的lambda测试事件。

共有1个答案

周奇
2023-03-14

好的,我想出来了。我刚刚更改了这个引导文件

#!/bin/sh
set -euo pipefail
./server

到这个

#!/bin/sh
set -euo pipefail

# Processing
while true
do
  HEADERS="$(mktemp)"
  # Get an event
  EVENT_DATA=$(curl -sS -LD "$HEADERS" -X GET "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/next")
  REQUEST_ID=$(grep -Fi Lambda-Runtime-Aws-Request-Id "$HEADERS" | tr -d '[:space:]' | cut -d: -f2)

  # Execute the handler function from the script
  RESPONSE=$(echo "$EVENT_DATA" | ./server)

  # Send the response
  curl -X POST "http://${AWS_LAMBDA_RUNTIME_API}/2018-06-01/runtime/invocation/$REQUEST_ID/response"  -d "$RESPONSE"
done

如本文所述

 类似资料:
  • 此处提供的示例项目:https://github.com/codependent/micronaut-aws-lambda-proxy-graal 我在Amazon AWS上部署了一个Micronaut应用程序,作为Lambda函数。它被编译成GraalVM本机映像,并使用AWS Lambda自定义运行时运行。 如果应用程序不使用DynamoDB,它将运行平稳。当配置它并作为普通Java应用程序启

  • 我有以下错误:"无法使用Gradle发行版'https://services.gradle.org/distributions/gradle-4.4-all.zip'执行构建。" 只有当我的gradle文件中有这样的内容时才会出现这种情况:“class path ' com . Android . tools . build:gradle:3 . 1 . 2 '” 如果我把它切换回:“类路径'网站

  • 我试图使用Micronaut、GraalVM和Docker在Java中创建和部署AWS Lambda函数。我正在按照本教程使用GraalVM运行时创建AWS lambda。 我使用命令创建了java项目。然后在不改变代码或配置文件的情况下,尝试用GraalVM本机映像构建Docker映像。在docker build步骤中,当构建graalvm本机映像时,我会收到以下警告: 警告:正在中止独立映像生

  • 当试图用Jenkins编译一个简单的Grails2.1应用程序时,我遇到了失败,原因如下: 执行脚本编译时出错:启动失败:/tmp/jenkins-grails/projects/eskridgebudget/scriptcache/_grailscompile_groovy.class(没有这样的文件或目录) 可能有关联,也可能没有关联。 我可以从命令行在同一个框上成功地构建同一个项目。 Gra

  • 我正在尝试使用Spark stream库从kafka读取一个json字符串。该代码能够连接到kafka broker,但在解码消息时失败。代码的灵感来自 https://github.com/killrweather/killrweather/blob/master/killrweather-examples/src/main/scala/com/datastax/killrweather/kaf