无法在 AWS Lambda 上部署流口水决策 table

Unable to deploy drools decision table on AWS Lambda

我正在尝试将一个 drools 项目(使用 eclipse 构建)部署到 AWS Lambda 上,但 运行 遇到了 Lambda 的一些权限问题。

首先,让我描述一下我的 AWS Lambda 函数和我的部署结构:

当我触发 AWS Lambda 时,我在尝试访问 demorule/demo.xls 时收到 permissions denied 错误(下方的完整堆栈跟踪)。 创建KieSession时在代码中触发此错误:

kSession = kContainer.newKieSession("demorule");

我相信上面的代码行将 excel 文件提取到默认目录 /var/task 并尝试读取它。 AWS Lambda 默认限制对默认目录中文件的权限。 此问题的当前解决方法是在 /tmp 目录中创建文件。

任何 help/feedback 将不胜感激,


"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.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)"

我无法用 .xls 文件解决这个问题,但使用 .drl 文件可以解决。我将 .xls 编译为 .drl 文件,然后将 drools maven 项目作为 jar 打包到我的 AWS Lambda 项目中。

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

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

下的目录