<?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: Patryk Szczypień</title>
    <description>The latest articles on DEV Community by Patryk Szczypień (@patryk_szczypie_f1c7101c).</description>
    <link>https://dev.to/patryk_szczypie_f1c7101c</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%2F1754548%2Fbb0e1494-a9da-4446-99ed-b254bd321c4e.png</url>
      <title>DEV Community: Patryk Szczypień</title>
      <link>https://dev.to/patryk_szczypie_f1c7101c</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/patryk_szczypie_f1c7101c"/>
    <language>en</language>
    <item>
      <title>Deploying native Quarkus REST API's in AWS Lambda</title>
      <dc:creator>Patryk Szczypień</dc:creator>
      <pubDate>Tue, 09 Jul 2024 19:55:04 +0000</pubDate>
      <link>https://dev.to/patryk_szczypie_f1c7101c/deploying-quarkus-rest-apis-in-aws-lambda-1j62</link>
      <guid>https://dev.to/patryk_szczypie_f1c7101c/deploying-quarkus-rest-apis-in-aws-lambda-1j62</guid>
      <description>&lt;p&gt;In recent days or weeks, as someone relatively new to &lt;a href="https://aws.amazon.com/products/?aws-products-all.sort-by=item.additionalFields.productNameLowercase&amp;amp;aws-products-all.sort-order=asc&amp;amp;awsf.re%3AInvent=*all&amp;amp;awsf.Free%20Tier%20Type=*all&amp;amp;awsf.tech-category=*all" rel="noopener noreferrer"&gt;AWS services&lt;/a&gt;, I faced challenges running a &lt;a href="https://quarkus.io/" rel="noopener noreferrer"&gt;Quarkus&lt;/a&gt; application I've been working on, on AWS Lambda.&lt;/p&gt;

&lt;p&gt;From the start I wanted to run it as a native image, but developing the project on a laptop with an Apple Silicon chip caused some issues that I needed to overcome first.&lt;/p&gt;

&lt;p&gt;Once this was sorted that out, the next problem was in resolving some internal server errors that occurred when invoking the Lambda containing my app.&lt;/p&gt;

&lt;p&gt;Overall, it was a frustrating experience at times, but it was rewarding in the end. The app now runs super-fast inside a Lambda (about 0.5 seconds or less to invoke), and I've gained valuable knowledge about some AWS services.&lt;/p&gt;

&lt;p&gt;I'm writing this article for two reasons:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;As a solution reminder in case I forget how to solve these problems but need to do it again someday.&lt;/li&gt;
&lt;li&gt;As a hopefully useful resource for someone (you?) who is currently struggling with the same problems I faced recently.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Let's dive in!&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Create a Quarkus app
&lt;/h2&gt;

&lt;p&gt;I won't go into much detail about how to create a Quarkus app since there are plenty of resources that explain it.&lt;/p&gt;

&lt;p&gt;For a starter project, let's create an app called quarkus-lambda with the following extensions:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;quarkus-rest&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;quarkus-amazon-lambda-rest&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For simplicity, let's create just one REST endpoint in the app:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight java"&gt;&lt;code&gt;

&lt;span class="nd"&gt;@Path&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"/hello"&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;RestApi&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;

    &lt;span class="nd"&gt;@GET&lt;/span&gt;
    &lt;span class="nd"&gt;@Produces&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="nc"&gt;MediaType&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;TEXT_PLAIN&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt; &lt;span class="nf"&gt;hello&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;"Hello from Quarkus REST"&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;When running it via &lt;code&gt;quarkus dev&lt;/code&gt; we should confirm it uses Lambda:&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;

2024-07-09 17:19:24,938 INFO  [io.qua.ama.lam.run.MockEventServer] (build-51) Mock Lambda Event Server Started
__  ____  __  _____   ___  __ ____  ______ 
 --/ __ \/ / / / _ | / _ \/ //_/ / / / __/ 
 -/ /_/ / /_/ / __ |/ , _/ ,&amp;lt; / /_/ /\ \   
--\___\_\____/_/ |_/_/|_/_/|_|\____/___/   
2024-07-09 17:19:25,583 INFO  [io.qua.ama.lam.run.AbstractLambdaPollLoop] (Lambda Thread (DEVELOPMENT)) Listening on: http://localhost:8080/_lambda_/2018-06-01/runtime/invocation/next

2024-07-09 17:19:25,604 INFO  [io.quarkus] (Quarkus Main Thread) quarkus-lambda 1.0.0-SNAPSHOT on JVM (powered by Quarkus 3.12.1) started in 1.345s. 
2024-07-09 17:19:25,605 INFO  [io.quarkus] (Quarkus Main Thread) Profile dev activated. Live Coding activated.
2024-07-09 17:19:25,606 INFO  [io.quarkus] (Quarkus Main Thread) Installed features: [amazon-lambda, cdi, rest, security, smallrye-context-propagation, vertx]


&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;p&gt;We can also confirm it works by doing an HTTP GET request on the running server:&lt;/p&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;p&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; curl localhost:8080/hello&lt;br&gt;
Hello from Quarkus REST%&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  

&lt;ol&gt;
&lt;li&gt;Build a native image of the app
&lt;/li&gt;
&lt;/ol&gt;
&lt;/h2&gt;


&lt;p&gt;This is where my first problems started to arise. When following guides like &lt;a href="https://quarkus.io/guides/aws-lambda-http#deploying-a-native-executable" rel="noopener noreferrer"&gt;AWS LAMBDA WITH QUARKUS REST, UNDERTOW, OR REACTIVE ROUTES&lt;/a&gt;, I encountered issues because I was developing on an ARM64 processor.&lt;/p&gt;

&lt;p&gt;The part about &lt;a href="https://quarkus.io/guides/aws-lambda-http#deploying-a-native-executable" rel="noopener noreferrer"&gt;Deploying a native executable&lt;/a&gt; didn't work with the &lt;code&gt;sam local start-api&lt;/code&gt; or &lt;code&gt;sam deploy&lt;/code&gt; commands.&lt;/p&gt;

&lt;p&gt;Here's a &lt;a href="https://github.com/quarkusio/quarkus/issues/38715" rel="noopener noreferrer"&gt;GitHub issue&lt;/a&gt; describing my problem.&lt;/p&gt;

&lt;p&gt;Instead of deploying the necessary AWS services via sam, I decided to create a Docker image instead, push it to AWS Elastic Container Registry (ECR), and create the Lambda from it:&lt;/p&gt;

&lt;h3&gt;
  
  
  1. Build native image inside a docker container
&lt;/h3&gt;


&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;

&lt;p&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; quarkus build &lt;span class="nt"&gt;--native&lt;/span&gt; &lt;span class="nt"&gt;--no-tests&lt;/span&gt; &lt;span class="nt"&gt;-Dquarkus&lt;/span&gt;.native.container-build&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;true&lt;/span&gt;&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
&lt;br&gt;
  &lt;br&gt;
  

&lt;ol&gt;
&lt;li&gt;Login into AWS ECR
&lt;/li&gt;
&lt;/ol&gt;
&lt;/h3&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;


&lt;p&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; aws ecr get-login-password &lt;span class="nt"&gt;--region&lt;/span&gt; &amp;lt;AWS_REGION&amp;gt; | docker login &lt;span class="nt"&gt;--username&lt;/span&gt; AWS &lt;span class="nt"&gt;--password-stdin&lt;/span&gt; &amp;lt;AWS_ID&amp;gt;.dkr.ecr.&amp;lt;AWS_REGION&amp;gt;.amazonaws.com&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
&lt;br&gt;
  &lt;br&gt;
  

&lt;ol&gt;
&lt;li&gt;Create repository on ECR
&lt;/li&gt;
&lt;/ol&gt;
&lt;/h3&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;


&lt;p&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; aws ecr create-repository &lt;span class="nt"&gt;--repository-name&lt;/span&gt; quarkus-lambda&lt;br&gt;
&lt;span class="c"&gt;# you'll get a repository tag as a response which is used in the next steps&lt;/span&gt;&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
&lt;br&gt;
  &lt;br&gt;
  

&lt;ol&gt;
&lt;li&gt;Build a container which runs the app in native mode.
&lt;/li&gt;
&lt;/ol&gt;
&lt;/h3&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;


&lt;p&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; docker build &lt;span class="nt"&gt;-f&lt;/span&gt; src/main/docker/Dockerfile.native &lt;span class="nt"&gt;-t&lt;/span&gt; &amp;lt;AWS_ID&amp;gt;.dkr.ecr.&amp;lt;AWS_REGION&amp;gt;.amazonaws.com/quarkus-lambda &lt;span class="nb"&gt;.&lt;/span&gt;&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h3&gt;
&lt;br&gt;
  &lt;br&gt;
  

&lt;ol&gt;
&lt;li&gt;Push the built container to ECR
&lt;/li&gt;
&lt;/ol&gt;
&lt;/h3&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;


&lt;p&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt; docker push &amp;lt;AWS_ID&amp;gt;.dkr.ecr.&amp;lt;AWS_REGION&amp;gt;.amazonaws.com/quarkus-lambda&lt;/p&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;
&lt;h2&gt;
&lt;br&gt;
  &lt;br&gt;
  

&lt;ol&gt;
&lt;li&gt;Create the Lambda function on AWS
&lt;/li&gt;
&lt;/ol&gt;
&lt;/h2&gt;


&lt;p&gt;Now we need to create a Lambda function to run our application when invoked.&lt;/p&gt;

&lt;p&gt;The best way to do it would probably be via an IaaS script using  &lt;a href="https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html" rel="noopener noreferrer"&gt;CloudFormation&lt;/a&gt; or &lt;a href="https://www.terraform.io" rel="noopener noreferrer"&gt;Terraform&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Here we'll do it manually by clicking around in the AWS console:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Login into AWS, go to Lambda and click on &lt;strong&gt;Create function&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fufjqto24o37ztg7zumcy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fufjqto24o37ztg7zumcy.png" alt="Create AWS Lambda function"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Choose &lt;strong&gt;Container image&lt;/strong&gt; to create the function from&lt;/li&gt;
&lt;li&gt;Enter a function name&lt;/li&gt;
&lt;li&gt;Browse images to find the image container we created and pushed to ECR &lt;/li&gt;
&lt;li&gt;(important for Mac / Apple Silicon) choose &lt;code&gt;arm64&lt;/code&gt; as the Architecture&lt;/li&gt;
&lt;li&gt;Click on &lt;strong&gt;Create function&lt;/strong&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You should see a result like this:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvwrl79jf01jg0tm7chbo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fvwrl79jf01jg0tm7chbo.png" alt="AWS Lambda function page"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Create a trigger for the Lambda function&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;We need to invoke the lambda somehow and want to use our &lt;code&gt;/hello&lt;/code&gt; endpoint for this.&lt;br&gt;
To do it we must create an API Gateway trigger and configure it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click on &lt;strong&gt;Create Trigger&lt;/strong&gt; and select &lt;em&gt;API Gateway&lt;/em&gt; as the source.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnrypecf3jswv5sf6zodo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fnrypecf3jswv5sf6zodo.png" alt="Create trigger"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We'll create a new REST API, and let's keep it open for simplicity.&lt;/p&gt;

&lt;p&gt;Our trigger is now created:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Forpc3ewcn3ma921bqnrd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Forpc3ewcn3ma921bqnrd.png" alt="Lambda function trigger created"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's open it:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkk8dax77gdmbtzy2rcpa.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fkk8dax77gdmbtzy2rcpa.png" alt="Lambda function trigger details"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The resources basically define paths of our application like &lt;code&gt;v1/api/orders/list&lt;/code&gt;, &lt;code&gt;/v1/api/recipes/edit/1&lt;/code&gt;, etc.&lt;/p&gt;

&lt;p&gt;On this page we need to differentiate between "static" paths that don't change much, like &lt;code&gt;/v1/api&lt;/code&gt; and "dynamic" ones like &lt;code&gt;/orders/list&lt;/code&gt; and &lt;code&gt;/recipes/edit/1&lt;/code&gt;.&lt;br&gt;
For better differentiation in this case you would probably do &lt;code&gt;/v1/api/orders&lt;/code&gt; and &lt;code&gt;/v1/recipes&lt;/code&gt; as the static parts and &lt;code&gt;/list&lt;/code&gt; and &lt;code&gt;/edit/1&lt;/code&gt; as dynamic.&lt;/p&gt;

&lt;p&gt;But what matters here, is that we need to declare the dynamic parts as &lt;strong&gt;&lt;em&gt;proxy resources&lt;/em&gt;&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;In our app we only have one endpoint &lt;code&gt;/hello&lt;/code&gt; and no &lt;code&gt;/quarkus-lambda&lt;/code&gt; endpoint - so let's delete it:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7m6mjhseiu0eatey3swm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7m6mjhseiu0eatey3swm.png" alt="Resources after deletion"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Next let's create a &lt;strong&gt;&lt;em&gt;Proxy resource&lt;/em&gt;&lt;/strong&gt; for our &lt;code&gt;/hello&lt;/code&gt; path and call it &lt;code&gt;{my-api+}&lt;/code&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqexkccyjrz851si02ky9.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqexkccyjrz851si02ky9.png" alt="Resources with created proxy"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We now have the new resource definition but no Integration setup, meaning it's not connected to anything in particular.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F69ajmr7xrp88fxucb6nj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F69ajmr7xrp88fxucb6nj.png" alt="Resource without integration"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's make it invoke our Quarkus app inside the lambda function we've created!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;click on &lt;strong&gt;ANY&lt;/strong&gt; below the &lt;code&gt;/{my-api+}&lt;/code&gt; resource&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ficgox57lqfe65kyuw6kp.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Ficgox57lqfe65kyuw6kp.png" alt="Resource details view"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Click on Edit integration, select Lambda function, and choose our Lambda&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9cwv5ssa2vz8fbevynk5.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9cwv5ssa2vz8fbevynk5.png" alt="Resource integration details"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;IMPORTANT!&lt;/strong&gt; make sure to select the &lt;em&gt;Lambda proxy integration&lt;/em&gt; checkbox - otherwise you'll probably get a NullPointerException when invoking your Quarkus app&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7czc447p16lr0exoklpm.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F7czc447p16lr0exoklpm.png" alt="Proxy integration checkbox"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Test your endpoint
&lt;/h2&gt;

&lt;p&gt;With the integration to the Lambda function covered, we can now test our endpoint.&lt;br&gt;
An easy way to do this, is to select &lt;strong&gt;&lt;em&gt;ANY&lt;/em&gt;&lt;/strong&gt; below our &lt;code&gt;/{my-api+}&lt;/code&gt; proxy resource, and then select the &lt;strong&gt;Test&lt;/strong&gt; tab:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F917ea7mkux4qx4ej2i46.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F917ea7mkux4qx4ej2i46.png" alt="Lambda test tab"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;We fill the &lt;code&gt;{my-api+}&lt;/code&gt; value with our only endpoint in the application - &lt;code&gt;hello&lt;/code&gt;, set the method type to &lt;code&gt;GET&lt;/code&gt; and click the "Test" button.&lt;/p&gt;

&lt;p&gt;When everything was setup properly, we should get the following response from our Lambda function:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ghrfeg9he3py6nzbzwg.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F2ghrfeg9he3py6nzbzwg.png" alt="API Gateway response"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Let's also check the Lambda's log output in CloudWatch:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe9uzgx27fodzq6631mlo.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fe9uzgx27fodzq6631mlo.png" alt="CloudWatch log output"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;As you can see, it takes about 0,5s to run our Quarkus app when invoking the lambda.&lt;/p&gt;

&lt;p&gt;And that's it - I hope this is helpful to someone!&lt;/p&gt;

&lt;p&gt;Feel free to comment or message me, if you have any questions.&lt;/p&gt;

&lt;p&gt;I'll probably write another article soon about calling various AWS services like S3, DynamoDB, Cognito, etc., from a Quarkus app running inside a Lambda function.&lt;/p&gt;

</description>
      <category>webdev</category>
      <category>quarkus</category>
      <category>aws</category>
      <category>java</category>
    </item>
  </channel>
</rss>
