无法在 AWS Lambda 上部署流口水决策 table
Unable to deploy drools decision table on AWS Lambda
我正在尝试将一个 drools 项目(使用 eclipse 构建)部署到 AWS Lambda 上,但 运行 遇到了 Lambda 的一些权限问题。
首先,让我描述一下我的 AWS Lambda 函数和我的部署结构:
- 我将我的 drools 项目打包成一个 jar => droolsdemo.jar
- (我的 drools 项目只有一个决定 table (demo.xls) 在 /src/main/resources/demorule 下)
- 我创建了一个包含 droolsdemo.jar 作为依赖项的 AWS Lambda 项目
- 我的 AWS Lambda 项目是一个简单的包装器,它接收输入、创建 KieSession、触发所有规则,然后 returns 规则输出。
我将 AWS Lambda 项目上传到 AWS
当我触发 AWS Lambda 时,我在尝试访问 demorule/demo.xls 时收到 permissions denied
错误(下方的完整堆栈跟踪)。
创建KieSession时在代码中触发此错误:
kSession = kContainer.newKieSession("demorule");
我相信上面的代码行将 excel 文件提取到默认目录 /var/task
并尝试读取它。 AWS Lambda 默认限制对默认目录中文件的权限。
此问题的当前解决方法是在 /tmp
目录中创建文件。
- 是否可以指示 Drools 将 excel 文件提取到特定目录?
- 否则,是否可以指示 Drools 创建一个以文件路径而不是会话名称作为输入的 KieSession(使 .xls/.drl 文件位于项目外部)?
- 或者,是否有通过配置 AWS Lambda 的其他解决方法(具有权限)?
任何 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
下的目录
我正在尝试将一个 drools 项目(使用 eclipse 构建)部署到 AWS Lambda 上,但 运行 遇到了 Lambda 的一些权限问题。
首先,让我描述一下我的 AWS Lambda 函数和我的部署结构:
- 我将我的 drools 项目打包成一个 jar => droolsdemo.jar
- (我的 drools 项目只有一个决定 table (demo.xls) 在 /src/main/resources/demorule 下)
- 我创建了一个包含 droolsdemo.jar 作为依赖项的 AWS Lambda 项目
- 我的 AWS Lambda 项目是一个简单的包装器,它接收输入、创建 KieSession、触发所有规则,然后 returns 规则输出。 我将 AWS Lambda 项目上传到 AWS
当我触发 AWS Lambda 时,我在尝试访问 demorule/demo.xls 时收到 permissions denied
错误(下方的完整堆栈跟踪)。
创建KieSession时在代码中触发此错误:
kSession = kContainer.newKieSession("demorule");
我相信上面的代码行将 excel 文件提取到默认目录 /var/task
并尝试读取它。 AWS Lambda 默认限制对默认目录中文件的权限。
此问题的当前解决方法是在 /tmp
目录中创建文件。
- 是否可以指示 Drools 将 excel 文件提取到特定目录?
- 否则,是否可以指示 Drools 创建一个以文件路径而不是会话名称作为输入的 KieSession(使 .xls/.drl 文件位于项目外部)?
- 或者,是否有通过配置 AWS Lambda 的其他解决方法(具有权限)?
任何 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
下的目录