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

无法使用MacOS Catalina在AWS Lambda函数中本机调用Quarkus函数

尉迟明贤
2023-03-14

我跟着https://quarkus.io/guides/amazon-lambda使用AWS在Lambda函数中运行Quarkus应用程序的教程。

在执行以下命令之前,一切正常,我可以在AWS中成功调用Lambda函数:

sh target/manage.sh invoke

但当我尝试使用以下命令以本机方式安装代码时:

mvn clean install -Pnative -Dnative-image.docker-build=true

我得到以下错误:

[ERROR] Failed to execute goal io.quarkus:quarkus-maven-plugin:1.7.3.Final:native-image (default) on project quarkus-lambda: Failed to generate native image: io.quarkus.builder.BuildException: Build failure: Build failed due to errors
[ERROR]         [error]: Build step io.quarkus.deployment.pkg.steps.NativeImageBuildStep#build threw an exception: java.lang.RuntimeException: Failed to build native image
[ERROR]         at io.quarkus.deployment.pkg.steps.NativeImageBuildStep.build(NativeImageBuildStep.java:389)
[ERROR]         at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
[ERROR]         at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
[ERROR]         at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
[ERROR]         at java.base/java.lang.reflect.Method.invoke(Method.java:566)
[ERROR]         at io.quarkus.deployment.ExtensionLoader$2.execute(ExtensionLoader.java:932)
[ERROR]         at io.quarkus.builder.BuildContext.run(BuildContext.java:277)
[ERROR]         at org.jboss.threads.ContextClassLoaderSavingRunnable.run(ContextClassLoaderSavingRunnable.java:35)
[ERROR]         at org.jboss.threads.EnhancedQueueExecutor.safeRun(EnhancedQueueExecutor.java:2046)
[ERROR]         at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.doRunTask(EnhancedQueueExecutor.java:1578)
[ERROR]         at org.jboss.threads.EnhancedQueueExecutor$ThreadBody.run(EnhancedQueueExecutor.java:1452)
[ERROR]         at java.base/java.lang.Thread.run(Thread.java:834)
[ERROR]         at org.jboss.threads.JBossThread.run(JBossThread.java:479)
[ERROR] Caused by: java.lang.RuntimeException: Image generation failed. Exit code: 125
[ERROR]         at io.quarkus.deployment.pkg.steps.NativeImageBuildStep.imageGenerationFailed(NativeImageBuildStep.java:491)
[ERROR]         at io.quarkus.deployment.pkg.steps.NativeImageBuildStep.build(NativeImageBuildStep.java:367)
[ERROR]         ... 12 more
[ERROR] -> [Help 1]
[ERROR] 
[ERROR] To see the full stack trace of the errors, re-run Maven with the -e switch.
[ERROR] Re-run Maven using the -X switch to enable full debug logging.

我还尝试了以下命令,该命令运行良好:

mvn package -Pnative

这是我运行上述命令时的最终日志:

[quarkus-lambda-1.0-SNAPSHOT-runner:10879]    (compile):  15,386.61 ms,  3.51 GB
[quarkus-lambda-1.0-SNAPSHOT-runner:10879]      compile:  26,031.26 ms,  3.51 GB
[quarkus-lambda-1.0-SNAPSHOT-runner:10879]        image:   2,312.47 ms,  3.51 GB
[quarkus-lambda-1.0-SNAPSHOT-runner:10879]        write:     765.22 ms,  3.51 GB
[quarkus-lambda-1.0-SNAPSHOT-runner:10879]      [total]:  60,426.97 ms,  3.51 GB
[INFO] [io.quarkus.deployment.QuarkusAugmentor] Quarkus augmentation completed in 63483ms
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time:  01:10 min
[INFO] Finished at: 2020-09-21T08:47:39+01:00
[INFO] ------------------------------------------------------------------------

当我尝试本机创建Lambda函数时,它也可以成功工作,如下日志所示:

target/manage.sh native create
Creating function
++ aws lambda create-function --function-name QuarkusLambdaNative --zip-file fileb:///Users/rafadelnero/Desktop/dev/java/work/quarkus-lambda/target/function.zip --handler io.quarkus.amazon.lambda.runtime.QuarkusStreamHandler::handleRequest --runtime provided --role arn:aws:iam::661273428467:role/lambda-role --timeout 15 --memory-size 256 --environment 'Variables={DISABLE_SIGNAL_HANDLERS=true}'
{
    "FunctionName": "QuarkusLambdaNative", 
    "LastModified": "2020-09-21T07:51:40.327+0000", 
    "RevisionId": "f703cd6d-60a7-409a-8c9b-f5ce47719f44", 
    "MemorySize": 256, 
    "Environment": {
        "Variables": {
            "DISABLE_SIGNAL_HANDLERS": "true"
        }
    }, 
    "Version": "$LATEST", 
    "Role": "arn:aws:iam::661273428467:role/lambda-role", 
    "Timeout": 15, 
    "Runtime": "provided", 
    "TracingConfig": {
        "Mode": "PassThrough"
    }, 
    "CodeSha256": "lNXMPlOuQt4id0+W8okeTm+NlHvAUw8f7suQatSOXJ8=", 
    "Description": "", 
    "CodeSize": 8230977, 
    "FunctionArn": "arn:aws:lambda:eu-west-1:661273428467:function:QuarkusLambdaNative", 
    "Handler": "io.quarkus.amazon.lambda.runtime.QuarkusStreamHandler::handleRequest"
}

我的函数在AWS中,但当我尝试调用它时,会出现以下错误:

target/manage.sh invoke       
Invoking function
aws-cli/1.16.96 Python/2.7.16 Darwin/19.6.0 botocore/1.12.86
target/manage.sh: line 29: [: -ge: unary operator expected
++ aws lambda invoke response.txt --function-name QuarkusLambda --payload file://payload.json --log-type Tail --query LogResult --output text
++ base64 --decode

An error occurred (ResourceNotFoundException) when calling the Invoke operation: Function not found: arn:aws:lambda:eu-west-1:661273428467:function:QuarkusLambda
cat: response.txt: No such file or directory

配置了以下变量:

GRAALVM_HOME=/Library/Java/JavaVirtualMachines/graalvm-ce-java11-20.2.0/Contents/Home
JAVA_HOME=/Users/rafadelnero/.jenv/versions/graalvm64-11.0.8

我的Mac电脑版本如下:MacOS Catalina 10.15.6

你知道怎样才能解决这个问题吗?

共有1个答案

梁才
2023-03-14

谢谢,赛艇!你的建议是解决方案的一部分!

为了让它发挥作用,我遵循了两个步骤:

  • 将Quarkus版本更新为1.8.2。最终输入pom文件

然后我按照上面提到的指定步骤进行操作。

另一个需要提到的重要一点是,在我之前使用的版本1.7.3。Final命令mvn清洁安装-D原生-Dquarkus.native.container-build=true不起作用,这使得解决这个问题变得更加困难。

 类似资料:
  • 问题内容: 因此,我再次制作了一个不错的python程序,它使我的生活变得更加轻松,并节省了大量时间。当然,这涉及一个由virtualenvwrapper功能制成的virtualenv。该项目有一个requests.txt文件,其中包含一些必需的库(也要求:D),如果没有这些库,该程序将无法运行。 我试图添加一个可执行的外壳脚本,该脚本将位于我的路径中(实际上是符号链接)。现在,在此脚本中,我需要

  • 问题内容: 设置如下: 显然,它被配置为返回一些值,并且确实是被嘲笑的。结果是:mockito抱怨​​我经常打给我(强调:NOT !),并且希望只打一次它! 以下更改有效: 我的问题很简单:这是怎么回事?为什么Mockito会验证对传递给函数的 参数 的调用,而不是对函数本身的调用? 问题答案: 正如我在评论中提到的那样,Mockito实际上以不直观的方式处于有状态状态。很多时候,存根或验证的方法

  • 我正在尝试通过DOM方法创建一个按钮,单击该按钮即可更改状态。我尝试将“this”作为变量传递给函数的参数 并尝试在函数末尾添加. bind(this),但没有成功。

  • 我无法通过JPA2.1调用Oracle函数。但是,相同的函数可以很好地使用JDBCallable语句。 我在实体类中有以下定义。 在我的DAO中,我称之为甲骨文函数, Oracle功能: 我得到这个错误,

  • 问题内容: 我有一个plsql函数,我想从我的函数中调用另一个函数。我怎样才能做到这一点? 这是正确的方法吗? 问题答案: 函数必须返回一个值,否则您应该具有该函数的分配目标。

  • 这可能是一个真正的新手问题,但我正在编写一个Android应用程序,它需要使用一个用C编写的.so库。该.so由几个类组成,是通用C语言,而不是JNI语言。 除了JNI之外,有没有办法从AndroidJava应用程序调用C函数?我所看到的关于JNI的一切都表明,您必须重写本机代码以特定于JNI,如果只给您一个. so,那真是太不方便了。 在Android 4.0.3中,从java应用程序调用本机函