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

时间:2019-08-25 01:47:52

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

我按照here

的说明使用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" }

PS ::我将包含“服务器”和“引导”文件的zip文件上传到AWS Lambda,以允许如前所述进行“自定义运行时”。

我做错了什么?

谢谢。

Tiago Peixoto。

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

1 个答案:

答案 0 :(得分:2)

好,我知道了。我只是从中更改了引导文件

#!/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

here

所述