Search code examples
aws-lambdadrools

Unable to deploy drools decision table on AWS Lambda


I am trying to deploy a drools project (built using eclipse) onto AWS Lambda but ran into some permission issues with Lambda.

First, let me describe my AWS Lambda function and my deployment structure:

  • I package my drools project into a jar => droolsdemo.jar
    • (My drools project has only one decision table (demo.xls) under /src/main/resources/demorule )
  • I create a AWS Lambda project that includes droolsdemo.jar as a dependency
    • My AWS Lambda project is a simple wrapper that receives input, creates a KieSession, triggers all rules, and then returns rule outputs. I upload the AWS Lambda project to AWS

When I trigger the AWS Lambda, I get a permissions denied error while trying to access demorule/demo.xls (full stack trace below). This error is triggered in the code when the KieSession is created:

kSession = kContainer.newKieSession("demorule");

I believe that the above line of code extracts the excel file into the default directory /var/task and tries to read it. AWS Lambda by default restricts permissions on files in the default directory. Current workarounds for this issue involve creating files in the /tmp directory instead.

  • Is it possible to direct Drools to extract the excel file to a specific directory?
  • Otherwise, is it possible to direct Drools to create a KieSession with a filepath as an input instead of a session-name (having the .xls/.drl file residing outside of the project)?
  • Or, is there some other workaround (with permissions) by configuring AWS Lambda?

Any help/feedback would be greatly appreciated,


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

Solution

  • I couldn't fix this issue with .xls files, but using .drl files instead worked. I compiled the .xls to .drl files and then packed the drools maven project as a jar into my AWS Lambda project.

    After deploying the project to AWS Lambda, the .drl file was read successfully.