Fork me on GitHub
#graalvm
<
2023-05-03
>
bmcgavin09:05:37

Hello there, I have something that I hope isn't an XY problem relating to holy-lambda, native image, and an aws lambda:thread:

bmcgavin09:05:07

I'm trying to call dynamodb from a native image lambda, and I've gone through faraday (which includes deprecated joda.time and commons-logging which caused issues I couldn't / didn't want to get into) and https://github.com/igrishaev/dynamodb which gave a similar error to one I'm about to paste from the cognitect-aws libraries :

bmcgavin09:05:26

I've added an agent payload for holy-lambda to invoke dynamodb and the agent gives this error (but succeeds) when generating the configs :

Exception in agent-context:  #error {
 :cause No implementation of method: :-invoke of protocol: #'cognitect.aws.client.protocol/Client found for class: nil
 :via
 [{:type java.lang.IllegalArgumentException
   :message No implementation of method: :-invoke of protocol: #'cognitect.aws.client.protocol/Client found for class: nil
   :at [clojure.core$_cache_protocol_fn invokeStatic core_deftype.clj 583]}]
 :trace
 [[clojure.core$_cache_protocol_fn invokeStatic core_deftype.clj 583]
  [cognitect.aws.client.protocol$fn__10680$G__10636__10687 invoke protocol.clj 7]
  [cognitect.aws.client.api$invoke invokeStatic api.clj 130]
  [bmcgavin.birthday.db.dynamodb$fn__13282 invokeStatic dynamodb.clj 112]
  [bmcgavin.birthday.db.dynamodb$fn__13282 invoke dynamodb.clj 112]
  [bmcgavin.birthday.db.dynamodb__init load nil 112]
  [bmcgavin.birthday.db.dynamodb__init <clinit> nil -1]
  [java.lang.Class forName0 Class.java -2]
  [java.lang.Class forName Class.java 398]
  [clojure.lang.RT classForName RT.java 2212]
  [clojure.lang.RT classForName RT.java 2221]
  [clojure.lang.RT loadClassForName RT.java 2240]
  [clojure.lang.RT load RT.java 449]
  [clojure.lang.RT load RT.java 424]
  [clojure.core$load$fn__6856 invoke core.clj 6115]
  [clojure.core$load invokeStatic core.clj 6114]
  [clojure.core$load doInvoke core.clj 6098]
  [clojure.lang.RestFn invoke RestFn.java 408]
  [clojure.core$load_one invokeStatic core.clj 5897]
  [clojure.core$load_one invoke core.clj 5892]
  [clojure.core$load_lib$fn__6796 invoke core.clj 5937]
  [clojure.core$load_lib invokeStatic core.clj 5936]
  [clojure.core$load_lib doInvoke core.clj 5917]
  [clojure.lang.RestFn applyTo RestFn.java 142]
  [clojure.core$apply invokeStatic core.clj 669]
  [clojure.core$load_libs invokeStatic core.clj 5974]
  [clojure.core$load_libs doInvoke core.clj 5958]
  [clojure.lang.RestFn applyTo RestFn.java 137]
  [clojure.core$apply invokeStatic core.clj 669]
  [clojure.core$require invokeStatic core.clj 5996]
  [bmcgavin.birthday.db$loading__6737__auto____13264 invoke db.clj 1]
  [bmcgavin.birthday.db__init load nil 1]
  [bmcgavin.birthday.db__init <clinit> nil -1]
  [java.lang.Class forName0 Class.java -2]
  [java.lang.Class forName Class.java 398]
  [clojure.lang.RT classForName RT.java 2212]
  [clojure.lang.RT classForName RT.java 2221]
  [clojure.lang.RT loadClassForName RT.java 2240]
  [clojure.lang.RT load RT.java 449]
  [clojure.lang.RT load RT.java 424]
  [clojure.core$load$fn__6856 invoke core.clj 6115]
  [clojure.core$load invokeStatic core.clj 6114]
  [clojure.core$load doInvoke core.clj 6098]
  [clojure.lang.RestFn invoke RestFn.java 408]
  [clojure.core$load_one invokeStatic core.clj 5897]
  [clojure.core$load_one invoke core.clj 5892]
  [clojure.core$load_lib$fn__6796 invoke core.clj 5937]
  [clojure.core$load_lib invokeStatic core.clj 5936]
  [clojure.core$load_lib doInvoke core.clj 5917]
  [clojure.lang.RestFn applyTo RestFn.java 142]
  [clojure.core$apply invokeStatic core.clj 669]
  [clojure.core$load_libs invokeStatic core.clj 5974]
  [clojure.core$load_libs doInvoke core.clj 5958]
  [clojure.lang.RestFn applyTo RestFn.java 137]
  [clojure.core$apply invokeStatic core.clj 669]
  [clojure.core$require invokeStatic core.clj 5996]
  [bmcgavin.birthday.api$loading__6737__auto____3 invoke api.clj 1]
  [bmcgavin.birthday.api__init load nil 1]
  [bmcgavin.birthday.api__init <clinit> nil -1]
  [java.lang.Class forName0 Class.java -2]
  [java.lang.Class forName Class.java 398]
  [clojure.lang.RT classForName RT.java 2212]
  [clojure.lang.RT classForName RT.java 2221]
  [clojure.lang.RT loadClassForName RT.java 2240]
  [clojure.lang.RT load RT.java 449]
  [clojure.lang.RT load RT.java 424]
  [clojure.core$load$fn__6856 invoke core.clj 6115]
  [clojure.core$load invokeStatic core.clj 6114]
  [clojure.core$load doInvoke core.clj 6098]
  [clojure.lang.RestFn invoke RestFn.java 408]
  [clojure.lang.Var invoke Var.java 384]
  [clojure.lang.Util loadWithClass Util.java 251]
  [bmcgavin.birthday.api <clinit> nil -1]]}

bmcgavin09:05:23

The error I had with the other dynamodb library was very similar ('no implementation of method for protocol) but about mask and at runtime.

Karol Wójcik11:05:43

Oh sorry. This is agent throwing an error. If this throws in agent it means it’s in regular Java process. It’s not directly connected to GraalVM.

Karol Wójcik11:05:55

Took another look. Answered in #C01UQJ4JC9Y channel.

🙌 2
igrishaev14:05:11

Sorry what is the issue with the igrishaev/dynamodb library?

bmcgavin14:05:14

Hi! I didn't understand the agent for holy lambda and I think I needed to use that to pre-fetch the masking protocol. No problem with the library itself.

igrishaev14:05:21

Asking because I've been using that lib with native image in the cloud, and it works

igrishaev14:05:20

btw, there is another lightweight framework for a binary lambda what you can find useful: https://github.com/igrishaev/lambda

👍 2
bmcgavin14:05:48

Thanks, I'll check it out.

igrishaev14:05:59

what is great about that lib, it builds a single bootstrap file which is a runtime by itself. Runs on bare linux (provided.al2)

bmcgavin15:05:46

Nice, thanks both! I've learnt a lot about bare bones lambdas from these repos.