<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Joery Vreijsen</title>
    <description>The latest articles on DEV Community by Joery Vreijsen (@vr4j).</description>
    <link>https://dev.to/vr4j</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F571442%2Fdde66ed2-c3e2-4377-a15f-e7c43c543bb5.jpeg</url>
      <title>DEV Community: Joery Vreijsen</title>
      <link>https://dev.to/vr4j</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/vr4j"/>
    <language>en</language>
    <item>
      <title>Beat Java cold starts in AWS Lambda's with GraalVM</title>
      <dc:creator>Joery Vreijsen</dc:creator>
      <pubDate>Mon, 19 Oct 2020 00:00:00 +0000</pubDate>
      <link>https://dev.to/kabisasoftware/beat-java-cold-starts-in-aws-lambda-s-with-graalvm-2kj0</link>
      <guid>https://dev.to/kabisasoftware/beat-java-cold-starts-in-aws-lambda-s-with-graalvm-2kj0</guid>
      <description>&lt;p&gt;Let's face it, against all advice from your co-workers, friends, or even family, you still want to build a blazingly fast lambda with &lt;strong&gt;Java&lt;/strong&gt;. Either to prove a point, to win a bet, or because you are just as much a Java geek as me. &lt;/p&gt;

&lt;p&gt;With this blogpost I'm going to walk you through pre-compiling your Java lambda with GraalVM &lt;a href="https://www.graalvm.org/docs/introduction/"&gt;[1]&lt;/a&gt; to eliminate slow cold-start times.&lt;/p&gt;

&lt;h2&gt;
  
  
  Cold starts, what, where, and when?
&lt;/h2&gt;

&lt;p&gt;On the first invocation of your lambda, AWS boots up a container with the right runtime before actually calling your code. When using runtimes like NodeJs or Python, the cold start times are between 200-250 ms &lt;a href="https://levelup.gitconnected.com/aws-lambda-cold-start-language-comparisons-2019-edition-%EF%B8%8F-1946d32a0244"&gt;[2]&lt;/a&gt; while with Java it takes atleast 650 ms if not more depending on the specifics of your function code.&lt;/p&gt;

&lt;p&gt;Java's cold start is mainly caused by the JVM, which is started by default when using AWS' pre-configured Java runtime. Luckily AWS also provides us the option to create our own &lt;code&gt;custom runtime&lt;/code&gt; which allows us to use GraalVM to pre-compile our Java code into a binary that can be ran without the need of a JVM.&lt;/p&gt;

&lt;h2&gt;
  
  
  Let's get practical
&lt;/h2&gt;

&lt;p&gt;Let's take a simple Java program like our Lambda Authorizer from the previous blogpost &lt;a href="https://www.kabisa.nl/tech/enriching-requests-with-an-aws-lambda-authorizer/"&gt;[3]&lt;/a&gt;, which can be found on Github &lt;a href="https://github.com/VR4J/aws-enriching-lambda-authorizer"&gt;[4]&lt;/a&gt;, and start enabling it for GraalVM processing.&lt;/p&gt;

&lt;h3&gt;
  
  
  AWS Lambda Runtime API
&lt;/h3&gt;

&lt;p&gt;As we are going to build our own custom runtime, we have to interact with the AWS Lambda Runtime API &lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/runtimes-api.html"&gt;[5]&lt;/a&gt; ourselves.&lt;br&gt;
On this API there are three endpoints that we want to use:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;/runtime/invocation/next&lt;/code&gt; to get our next invocation, &lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/runtime/invocation/{AwsRequestId}/response&lt;/code&gt; to post the response to a specific invocation (request)&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;/runtime/invocation/{AwsRequestId}/error&lt;/code&gt; to post errors during the invocation (request).&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;A simple bootstrap class to handle this polling of the AWS Runtime API can be found on Github &lt;a href="https://github.com/VR4J/aws-enriching-lambda-authorizer/blob/feature/graal-vm/src/main/java/nl/theguild/lambda/Main.java"&gt;[6]&lt;/a&gt;.&lt;/p&gt;
&lt;h3&gt;
  
  
  Reflection
&lt;/h3&gt;

&lt;p&gt;One of the downsides of pre-compiling with GraalVM is that it can't handle reflection very well, which means that we have to create a &lt;code&gt;reflect.json&lt;/code&gt; configuration file, where we can point GraalVM to the classes it should prepare for reflective use. Since we use Jackson as our serialization library we should configure all classes that need (de)serialization in the &lt;code&gt;reflect.json&lt;/code&gt; file.&lt;/p&gt;

&lt;p&gt;Example entry in the &lt;code&gt;reflect.json&lt;/code&gt; configuration file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"name"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"nl.theguild.lambda.model.DefaultResponse"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"allPublicMethods"&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="err"&gt;...&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For the complete &lt;code&gt;reflect.json&lt;/code&gt; check Github &lt;a href="https://github.com/VR4J/aws-enriching-lambda-authorizer/blob/feature/graal-vm/reflect.json"&gt;[7]&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Compiling the image!
&lt;/h3&gt;

&lt;p&gt;Yes! The interesting part! Now that we prepared our little Java project for native-image compilation let's see how it is done.&lt;/p&gt;

&lt;p&gt;First we need to make sure our jar comes with a proper manifest stating our mainClass, which can be done by adding the following config to our &lt;code&gt;pom.xml&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight xml"&gt;&lt;code&gt;&lt;span class="nt"&gt;&amp;lt;plugin&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;artifactId&amp;gt;&lt;/span&gt;maven-jar-plugin&lt;span class="nt"&gt;&amp;lt;/artifactId&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;version&amp;gt;&lt;/span&gt;3.0.2&lt;span class="nt"&gt;&amp;lt;/version&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;configuration&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;archive&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;manifest&amp;gt;&lt;/span&gt;
                &lt;span class="nt"&gt;&amp;lt;mainClass&amp;gt;&lt;/span&gt;nl.theguild.lambda.Main&lt;span class="nt"&gt;&amp;lt;/mainClass&amp;gt;&lt;/span&gt;
            &lt;span class="nt"&gt;&amp;lt;/manifest&amp;gt;&lt;/span&gt;
        &lt;span class="nt"&gt;&amp;lt;/archive&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;lt;/configuration&amp;gt;&lt;/span&gt;
&lt;span class="nt"&gt;&amp;lt;/plugin&amp;gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We then can start creating a simple bash script that will preform all the necessary steps to end up with our custom-runtime zip.&lt;/p&gt;

&lt;p&gt;Step 1: Create our jar file.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;mvn clean &lt;span class="nb"&gt;install&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 2: Run GraalVM inside a docker container, and mount our project.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; graal &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;:/&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PATH_TO_PROJECT&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; oracle/graalvm-ce:19.2.0
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 3: Install and run GraalVM's &lt;code&gt;native-image&lt;/code&gt; command while including our &lt;code&gt;reflect.json&lt;/code&gt; configuration, and enabling http.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;gu &lt;span class="nb"&gt;install &lt;/span&gt;native-image&lt;span class="p"&gt;;&lt;/span&gt;
native-image &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-H&lt;/span&gt;:EnableURLProtocols&lt;span class="o"&gt;=&lt;/span&gt;http &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-H&lt;/span&gt;:ReflectionConfigurationFiles&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PATH_TO_PROJECT&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/reflect.json &lt;span class="se"&gt;\&lt;/span&gt;
    &lt;span class="nt"&gt;-jar&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PATH_TO_JAR&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 4: Move our native image to a folder which we can later on &lt;code&gt;zip&lt;/code&gt; for usage in the AWS Lambda.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;mkdir&lt;/span&gt; /&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PATH_TO_PROJECT&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/target/custom-runtime&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="nb"&gt;cp&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;BINARY_RESULT&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; &lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PATH_TO_PROJECT&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;/target/custom-runtime&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Step 5: Create a &lt;code&gt;bootstrap&lt;/code&gt; file that instructs AWS on how to run the native image.&lt;/p&gt;

&lt;p&gt;AWS defines in their documentation &lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html"&gt;[8]&lt;/a&gt; that every custom-runtime should be a zip including a &lt;code&gt;bootstrap&lt;/code&gt; shell file that can jump start the function.&lt;/p&gt;

&lt;p&gt;In our case that bootstrap file can be a simple one looking something like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="c"&gt;#!/bin/sh&lt;/span&gt;
&lt;span class="nb"&gt;set&lt;/span&gt; &lt;span class="nt"&gt;-euo&lt;/span&gt; pipefail
./&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PROJECT_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Adding all those steps into one single bash script results in the following file:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nv"&gt;PROJECT_NAME&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;aws-enriching-lambda-authorizer
&lt;span class="nv"&gt;PROJECT_VERSION&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;1.0.0

&lt;span class="c"&gt;# Generate Jar file&lt;/span&gt;
mvn clean &lt;span class="nb"&gt;install&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c"&gt;# Generate Native Image&lt;/span&gt;
docker run &lt;span class="nt"&gt;--rm&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; graal &lt;span class="nt"&gt;-v&lt;/span&gt; &lt;span class="si"&gt;$(&lt;/span&gt;&lt;span class="nb"&gt;pwd&lt;/span&gt;&lt;span class="si"&gt;)&lt;/span&gt;:/&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PROJECT_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt; oracle/graalvm-ce:19.2.0 &lt;span class="se"&gt;\&lt;/span&gt;
    /bin/bash &lt;span class="nt"&gt;-c&lt;/span&gt; &lt;span class="s2"&gt;"gu install native-image; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
                  native-image &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
                        -H:ReflectionConfigurationFiles=/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PROJECT_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/reflect.json &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
                    -jar /&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PROJECT_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/target/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PROJECT_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PROJECT_VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;.jar &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
                    ; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
                    mkdir /&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PROJECT_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/target/custom-runtime &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
                    ; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
                    cp &lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PROJECT_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;-&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PROJECT_VERSION&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; /&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PROJECT_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/target/custom-runtime/&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PROJECT_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="nt"&gt;-e&lt;/span&gt; &lt;span class="s2"&gt;"#!/bin/sh &lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
set -euo pipefail &lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s2"&gt; &lt;/span&gt;&lt;span class="se"&gt;\&lt;/span&gt;&lt;span class="s2"&gt;
./&lt;/span&gt;&lt;span class="k"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;PROJECT_NAME&lt;/span&gt;&lt;span class="k"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; target/custom-runtime/bootstrap&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c"&gt;# Make bootstrap executable&lt;/span&gt;
&lt;span class="nb"&gt;chmod&lt;/span&gt; +x target/custom-runtime/bootstrap&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c"&gt;# Zip&lt;/span&gt;
&lt;span class="nb"&gt;rm&lt;/span&gt; &lt;span class="nv"&gt;$PROJECT_NAME&lt;/span&gt;&lt;span class="nt"&gt;-custom-runtime&lt;/span&gt;.zip
&lt;span class="nb"&gt;cd &lt;/span&gt;target/custom-runtime &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="nb"&gt;exit
&lt;/span&gt;zip &lt;span class="nt"&gt;-X&lt;/span&gt; &lt;span class="nt"&gt;-r&lt;/span&gt; ../../&lt;span class="nv"&gt;$PROJECT_NAME&lt;/span&gt;&lt;span class="nt"&gt;-custom-runtime&lt;/span&gt;.zip &lt;span class="nb"&gt;.&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  HOORAY!
&lt;/h2&gt;

&lt;p&gt;We now have our &lt;code&gt;aws-enriching-lambda-authorizer-custom-runtime.zip&lt;/code&gt; that we can use in our AWS Lambda and enjoy our rapid fast cold start timings... WHILE USING JAVA!&lt;/p&gt;

&lt;p&gt;Navigate to the &lt;code&gt;AWS Console&lt;/code&gt; -&amp;gt; &lt;code&gt;Lambda&lt;/code&gt; -&amp;gt; &lt;code&gt;Create function&lt;/code&gt;, choose &lt;code&gt;custom-runtime -&amp;gt; use default bootstrap&lt;/code&gt; and click &lt;code&gt;create&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Now that we have a lambda, we can go to &lt;code&gt;Actions&lt;/code&gt; and upload our zip file, after which we can configure a test-event.&lt;/p&gt;

&lt;p&gt;As our authorizer lambda is triggered by the api-gateway we can use the default &lt;code&gt;Amazon API Gateway AWS Proxy&lt;/code&gt; event, and simply add an &lt;code&gt;"Authorization": "Bearer 12345"&lt;/code&gt; header to the request.&lt;/p&gt;

&lt;p&gt;When we now hit &lt;code&gt;test&lt;/code&gt; we see our lambda responding in just &lt;code&gt;283ms&lt;/code&gt;, matching the cold-start times of other runtimes, show that to your co-workers, friends, and family! &lt;/p&gt;

&lt;p&gt;&lt;a href="https://res.cloudinary.com/practicaldev/image/fetch/s--ruudjnbY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/ZPZ953W.png" class="article-body-image-wrapper"&gt;&lt;img src="https://res.cloudinary.com/practicaldev/image/fetch/s--ruudjnbY--/c_limit%2Cf_auto%2Cfl_progressive%2Cq_auto%2Cw_880/https://i.imgur.com/ZPZ953W.png" alt=""&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Source
&lt;/h2&gt;

&lt;p&gt;Github: &lt;a href="https://github.com/VR4J/aws-enriching-lambda-authorizer/tree/feature/graal-vm"&gt;https://github.com/VR4J/aws-enriching-lambda-authorizer/tree/feature/graal-vm&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;p&gt;[1] &lt;a href="https://www.graalvm.org/docs/introduction/"&gt;https://www.graalvm.org/docs/introduction/&lt;/a&gt;&lt;br&gt;
[2] &lt;a href="https://levelup.gitconnected.com/aws-lambda-cold-start-language-comparisons-2019-edition-%EF%B8%8F-1946d32a0244"&gt;https://levelup.gitconnected.com&lt;/a&gt;&lt;br&gt;&lt;br&gt;
[3] &lt;a href="https://www.kabisa.nl/tech/enriching-requests-with-an-aws-lambda-authorizer"&gt;https://www.kabisa.nl/tech/enriching-requests-with-an-aws-lambda-authorizer&lt;/a&gt;&lt;br&gt;&lt;br&gt;
[4] &lt;a href="https://github.com/VR4J/aws-enriching-lambda-authorizer"&gt;https://github.com/VR4J/aws-enriching-lambda-authorizer&lt;/a&gt;&lt;br&gt;&lt;br&gt;
[5] &lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/runtimes-api.html"&gt;https://docs.aws.amazon.com/lambda/latest/dg/runtimes-api.html&lt;/a&gt;&lt;br&gt;&lt;br&gt;
[6] &lt;a href="https://github.com/VR4J/aws-enriching-lambda-authorizer/blob/feature/graal-vm/src/main/java/nl/theguild/lambda/Main.java"&gt;https://github.com/VR4J/aws-enriching-lambda-authorizer/blob/feature/graal-vm/src/main/java/nl/theguild/lambda/Main.java&lt;/a&gt;&lt;br&gt;&lt;br&gt;
[7] &lt;a href="https://github.com/VR4J/aws-enriching-lambda-authorizer/blob/feature/graal-vm/reflect.json"&gt;https://github.com/VR4J/aws-enriching-lambda-authorizer/blob/feature/graal-vm/reflect.json&lt;/a&gt;&lt;br&gt;&lt;br&gt;
[8] &lt;a href="https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html"&gt;https://docs.aws.amazon.com/lambda/latest/dg/runtimes-custom.html&lt;/a&gt;&lt;br&gt;&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
