Aws lambda 无法在AWS Lambda上部署drools决策表

Aws lambda 无法在AWS Lambda上部署drools决策表,aws-lambda,drools,Aws Lambda,Drools,我试图将drools项目(使用eclipse构建)部署到AWS Lambda上,但在Lambda上遇到了一些权限问题 首先,让我描述我的AWS Lambda功能和部署结构: 我将drools项目打包到一个jar=>droolsdemo.jar中 (我的drools项目在/src/main/resources/demorule下只有一个决策表(demo.xls) 我创建了一个AWS Lambda项目,其中包含droolsdemo.jar作为依赖项 我的AWS Lambda项目是一个简单的包

我试图将drools项目(使用eclipse构建)部署到AWS Lambda上,但在Lambda上遇到了一些权限问题

首先,让我描述我的AWS Lambda功能和部署结构:

  • 我将drools项目打包到一个jar=>droolsdemo.jar中
    • (我的drools项目在/src/main/resources/demorule下只有一个决策表(demo.xls)
  • 我创建了一个AWS Lambda项目,其中包含droolsdemo.jar作为依赖项
    • 我的AWS Lambda项目是一个简单的包装器,它接收输入,创建会话,触发所有规则,然后返回规则输出。 我将AWS Lambda项目上传到AWS
当我触发AWS Lambda时,在尝试访问demorule/demo.xls(下面是完整堆栈跟踪)时,我得到一个
权限被拒绝的
错误。 创建会话时,代码中会触发此错误:

kSession = kContainer.newKieSession("demorule");
我相信上面这行代码将excel文件提取到默认目录
/var/task
,并尝试读取它。默认情况下,AWS Lambda限制对默认目录中文件的权限。 当前解决此问题的方法是在
/tmp
目录中创建文件

  • 是否可以指示Drools将excel文件解压缩到特定目录
  • 否则,是否可以指示Drools创建一个以文件路径作为输入而不是会话名称(将.xls/.drl文件驻留在项目外部)的会话
  • 或者,通过配置AWS Lambda是否有其他解决方法(具有权限)
如有任何帮助/反馈,将不胜感激


“errorMessage”:“/var/task/demorule/demo.xls(权限被拒绝)”,
“errorType”:“java.io.FileNotFoundException”,
“stackTrace”:
“java.io.RandomAccessFile.open0(本机方法)”,
“java.io.RandomAccessFile.open(RandomAccessFile.java:316)”,
“java.io.RandomAccessFile.(RandomAccessFile.java:243)”,
“org.apache.poi.poifs.nio.FileBackedDataSource.newSrcFile(FileBackedDataSource.java:130)”,
“org.apache.poi.poifs.nio.FileBackedDataSource.(FileBackedDataSource.java:46)”,
“org.apache.poi.poifs.filesystem.NPOIFSFileSystem.(NPOIFSFileSystem.java:218)”,
“org.apache.poi.poifs.filesystem.NPOIFSFileSystem.(NPOIFSFileSystem.java:166)”,
“org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:278)”,
“org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:250)”,
“org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:229)”,
“org.drools.decisiontable.parser.xls.ExcelParser.parseFile(ExcelParser.java:95)”,
“org.drools.decisiontable.SpreadsheetCompiler.parseResource(SpreadsheetCompiler.java:123)”,
“org.drools.decisiontable.SpreadsheetCompiler.compile(SpreadsheetCompiler.java:110)”,
“org.drools.decisiontable.SpreadsheetCompiler.compile(SpreadsheetCompiler.java:83)”,
“org.drools.decisiontable.DecisionTableProviderImpl.CompilerSource(DecisionTableProviderImpl.java:78)”,
“org.drools.decisiontable.DecisionTableProviderImpl.loadFromResource(DecisionTableProviderImpl.java:44)”,
“org.drools.compiler.compiler.DecisionTableFactory.loadFromResource(DecisionTableFactory.java:37)”,
“org.drools.compiler.builder.impl.KnowledgeBuilderImpl.decisionTableToPackageDescr(KnowledgeBuilderImpl.java:404)”,
“org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl$12.map(CompositeKnowledgeBuilderImpl.java:437)”,
“org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl.buildResource(CompositeKnowledgeBuilderImpl.java:322)”,
“org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl.buildPackageDescr(CompositeKnowledgeBuilderImpl.java:307)”,
“org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl.buildPackages(CompositeKnowledgeBuilderImpl.java:114)”,
“org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl.build(CompositeKnowledgeBuilderImpl.java:105)”,
“org.drools.compiler.kie.builder.impl.AbstractKieModule.buildKnowledgePackages(AbstractKieModule.java:243)”,
“org.drools.compiler.kie.builder.impl.KieContainerImpl.createKieBase(KieContainerImpl.java:484)”,
“org.drools.compiler.kie.builder.impl.kieecontainerImpl.getKieBase(kieecontainerImpl.java:447)”,
“org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:604)”,
“org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:575)”

我无法用.xls文件解决此问题,但改用.drl文件还是有效的。我将.xls编译成.drl文件,然后将drools maven项目作为jar打包到我的AWS Lambda项目中


将项目部署到AWS Lambda后,成功读取了.drl文件。

我无法用.xls文件解决此问题,但改用.drl文件还是有效的。我将.xls编译成.drl文件,然后将drools maven项目作为jar打包到我的AWS Lambda项目中


将项目部署到AWS Lambda后,成功读取了.drl文件。

作为替代方案,您可以使用这些文件设置一个S3存储桶,并使用一些AWS SDK代码访问它们。我还知道,如果确实需要,您可以从/tmp文件夹进行写和读操作,但您仍然需要从S3中提取文件并将其写入/tmp

下的目录。作为替代方案,您可以使用这些文件设置S3存储桶,并使用一些AWS SDK代码访问它们。我还知道,如果您真的需要,您可以从/tmp文件夹进行写和读操作,但是您仍然需要从S3中提取文件并将其写入/tmp

下的目录,其中有完整的堆栈跟踪?一般来说,不可能运行任何打包在JAR中的Java程序,就好像它仍然在Eclipse工作区中一样。因此,像/src/main/re这样的文件引用
"errorMessage": "/var/task/demorule/demo.xls (Permission denied)",
    "errorType": "java.io.FileNotFoundException",
    "stackTrace":
      "java.io.RandomAccessFile.open0(Native Method)",
      "java.io.RandomAccessFile.open(RandomAccessFile.java:316)",
      "java.io.RandomAccessFile.<init>(RandomAccessFile.java:243)", 
      "org.apache.poi.poifs.nio.FileBackedDataSource.newSrcFile(FileBackedDataSource.java:130)",
      "org.apache.poi.poifs.nio.FileBackedDataSource.<init>(FileBackedDataSource.java:46)",
      "org.apache.poi.poifs.filesystem.NPOIFSFileSystem.<init>(NPOIFSFileSystem.java:218)",
      "org.apache.poi.poifs.filesystem.NPOIFSFileSystem.<init>(NPOIFSFileSystem.java:166)",
      "org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:278)",
      "org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:250)",
      "org.apache.poi.ss.usermodel.WorkbookFactory.create(WorkbookFactory.java:229)",
      "org.drools.decisiontable.parser.xls.ExcelParser.parseFile(ExcelParser.java:95)",
      "org.drools.decisiontable.SpreadsheetCompiler.parseResource(SpreadsheetCompiler.java:123)",
      "org.drools.decisiontable.SpreadsheetCompiler.compile(SpreadsheetCompiler.java:110)",
      "org.drools.decisiontable.SpreadsheetCompiler.compile(SpreadsheetCompiler.java:83)",
      "org.drools.decisiontable.DecisionTableProviderImpl.compileResource(DecisionTableProviderImpl.java:78)",
      "org.drools.decisiontable.DecisionTableProviderImpl.loadFromResource(DecisionTableProviderImpl.java:44)",
      "org.drools.compiler.compiler.DecisionTableFactory.loadFromResource(DecisionTableFactory.java:37)",
      "org.drools.compiler.builder.impl.KnowledgeBuilderImpl.decisionTableToPackageDescr(KnowledgeBuilderImpl.java:404)",
      "org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl$12.map(CompositeKnowledgeBuilderImpl.java:437)",
      "org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl.buildResource(CompositeKnowledgeBuilderImpl.java:322)",
      "org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl.buildPackageDescr(CompositeKnowledgeBuilderImpl.java:307)",
      "org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl.buildPackages(CompositeKnowledgeBuilderImpl.java:114)",
      "org.drools.compiler.builder.impl.CompositeKnowledgeBuilderImpl.build(CompositeKnowledgeBuilderImpl.java:105)",
      "org.drools.compiler.kie.builder.impl.AbstractKieModule.buildKnowledgePackages(AbstractKieModule.java:243)",
      "org.drools.compiler.kie.builder.impl.KieContainerImpl.createKieBase(KieContainerImpl.java:484)",
      "org.drools.compiler.kie.builder.impl.KieContainerImpl.getKieBase(KieContainerImpl.java:447)",
      "org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:604)",
      "org.drools.compiler.kie.builder.impl.KieContainerImpl.newKieSession(KieContainerImpl.java:575)"