[{"data":1,"prerenderedAt":403},["ShallowReactive",2],{"content-svc-lambda-guides-effectively-running-java-on-serverless-springboot":3},{"markdown":4,"frontMatterAttributes":5,"bodyRaw":24,"menu":25,"menuType":394,"isCollapseableMenu":28,"nextDocItem":232,"previousDocItem":215,"contributorPaths":395,"contentName":402,"slug":231,"readingTime":122},"\u003Cp>\u003Ca href=\"https:\u002F\u002Fspring.io\u002Fprojects\u002Fspring-boot\">Spring Boot\u003C\u002Fa> is the most popular Java application framework with +60% of \nJava developers reportedly using it. \nThere is a broad ecosystem (libraries, tools and resources) and developer experience.\nSpring Boot on a server initializes the environment once and handles multiple requests with the same instance, \nwhereas in AWS Lambda an execution environment is initialized on first invocation \nand can handle only one request at a time. \nAnother environment is started if another request comes in while the execution environment is busy.\u003C\u002Fp>\n\u003Ch4>Spring Cloud for AWS\u003C\u002Fh4>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fawspring.io\u002F\">Spring Cloud AWS\u003C\u002Fa> supports a subset of AWS services which drastically reduces the time needed\nto use their capabilities in a Spring Boot application. \nAWS services like Amazon RDS, Amazon SQS, Amazon SNS, Amazon S3, and more are already available.\nSpring Cloud AWS using Spring APIs and idioms to make it easy for Spring Boot developers to adapt above AWS services.\nFor example, Spring Messaging API with SQS, Spring Cache API with Amazon ElasticSearch, emails via Amazon SES,\nbootstrap property sources with AWS Parameter Store or Secrets Manager.\u003C\u002Fp>\n\u003Ch4>Spring Cloud Function\u003C\u002Fh4>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fspring.io\u002Fprojects\u002Fspring-cloud-function\">Spring Cloud Function\u003C\u002Fa> promotes the implementation of business \nlogic via Function interface.\nYou can use this in conjunction with AWS Lambda for payload translation, and to leverage Spring Boot features in \nfunctional environment.\u003C\u002Fp>\n\u003Ch4>Spring journey to AWS Lambda\u003C\u002Fh4>\n\u003Cp>Spring journey to AWS Lambda contains four steps:\u003C\u002Fp>\n\u003Ch4>Migrate\u003C\u002Fh4>\n\u003Cp>AWS Lambda is invoked via Events (API Event, S3 Object Event, SQS Event, etc.). \nEvents follow a certain structure, \nand this is different from accepting an HTTP connection.\nAWS Serverless Java Container is a library that acts as a conduit between Events and HTTP. \nIt transforms events so that Spring can handle them as if it was an HTTP request.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>Using AWS Serverless Java Container\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>If you still need to use \u003Ccode>@RestController\u003C\u002Fcode> in your SpringBoot application running on AWS Lambda, \nthen \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fawslabs\u002Faws-serverless-java-container\">AWS Serverless Java Container\u003C\u002Fa> \ncan be used which transforms events to framework specific \nHTTP Request structure. This is mainly used when routing via \u003Ccode>@RestController\u003C\u002Fcode>, rely on POJO serialization, \nand return HTTP status codes.\u003C\u002Fp>\n\u003Cp>All you have to do is to add the library to your code and provide a configuration class.\u003C\u002Fp>\n\u003Cp>AWS Serverless Java Container now supports Java 17 and SpringBoot 3. \nRefer this \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Fawslabs\u002Faws-serverless-java-container\u002Ftree\u002Fmain\u002Fsamples\u002Fspringboot3\u002Fpet-store\">pet-store\u003C\u002Fa> sample to\nlearn more about its use.\u003C\u002Fp>\n\u003Ch4>Optimize\u003C\u002Fh4>\n\u003Cul>\n\u003Cli>Right size the application memory setting with AWS Lambda power tuning.\u003C\u002Fli>\n\u003Cli>Enable AWS Lambda SnapStart for fast function startups\u003C\u002Fli>\n\u003Cli>Use Tiered Compilation to reduce cold-starts (for Java 11)\u003C\u002Fli>\n\u003Cli>Use AWS SDK &amp; Initialization best practices\u003C\u002Fli>\n\u003Cli>Pre-warm execution environments with Provisioned Concurrency.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch4>Refactor\u003C\u002Fh4>\n\u003Cul>\n\u003Cli>Improve performance and memory footprint by refactoring the application\u003C\u002Fli>\n\u003Cli>Using light-weight dependencies, for example:\u003Cul>\n\u003Cli>\u003Ccode>spring-data-jpa\u003C\u002Fcode> vs \u003Ccode>spring-data-jdbc\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>jackson\u003C\u002Fcode> vs \u003Ccode>jackon-jr\u003C\u002Fcode>\u003C\u002Fli>\n\u003Cli>\u003Ccode>log4J2\u003C\u002Fcode> vs \u003Ccode>SLF4J SimpleLogger\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003Cli>Move to a functional approach\u003Cul>\n\u003Cli>Avoid the overhead of providing an own HTTP server (API Gateway takes care of this)\u003C\u002Fli>\n\u003Cli>Use a functional approach using Spring Cloud Functions and directly handle the event from API Gateway\u003C\u002Fli>\n\u003Cli>\u003Ccode>RestController\u003C\u002Fcode> vs \u003Ccode>FunctionHandler&lt;Event&gt;\u003C\u002Fcode>\u003C\u002Fli>\n\u003C\u002Ful>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Prefer using \u003Ccode>Function\u003C\u002Fcode> interface, as mentioned above with Spring Cloud Function.\nAn AWS Lambda handler would look as the following:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-java\">@Component\npublic class UnicornPostFunction implements Function&lt;APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent&gt; {\n\n  @Override\n  public APIGatewayProxyResponseEvent apply(APIGatewayProxyRequestEvent input) {\n    try {\n      var unicorn = objectMapper.readValue(input.getBody(), Unicorn.class);\n      var savedUnicorn = unicornService.createUnicorn(unicorn);\n      return new APIGatewayProxyResponseEvent().withStatusCode(200).withBody(objectMapper.writeValueAsString(savedUnicorn));\n    } catch (Exception e) {\n      logger.error(&quot;Error creating unicorn&quot;, e);\n      return new APIGatewayProxyResponseEvent().withStatusCode(500).withBody(&quot;Error creating unicorn&quot;);\n    }\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>instead of \u003Ccode>@RestController\u003C\u002Fcode>:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-java\">@RestController\npublic class UnicornController {\n  \u002F\u002F...\n  @PostMapping(&quot;\u002Funicorns&quot;)\n  public ResponseEntity&lt;Unicorn&gt; createUnicorn(@RequestBody Unicorn unicorn) {\n    try {\n      var savedUnicorn = unicornService.createUnicorn(unicorn);\n      return ResponseEntity.ok(savedUnicorn);\n    } catch (Exception e) {\n      logger.error(&quot;Error creating unicorn&quot;, e);\n      throw new ResponseStatusException(INTERNAL_SERVER_ERROR, &quot;Error creating unicorn&quot;, e);\n    }\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch4>Accelerate\u003C\u002Fh4>\n\u003Cp>GraalVM Native image\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Spring Boot 3 provides native support for GraalVM native images\u003C\u002Fli>\n\u003Cli>\u003Ca href=\"https:\u002F\u002Fdocs.spring.io\u002Fspring-boot\u002Fdocs\u002Fcurrent\u002Freference\u002Fhtml\u002Fnative-image.html\">Create a native binary\u003C\u002Fa> - usage with AWS Lambda custom runtime\u003C\u002Fli>\n\u003Cli>Sub-second application startup\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Use alternative compile time frameworks on the JVM (Micronaut, Quarkus)\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Cloud-Native frameworks – Built for the cloud\u003C\u002Fli>\n\u003Cli>Allows you to shift certain tasks to build time (e.g., Dependency Injection)\u003C\u002Fli>\n\u003Cli>It can further improve application start-up and memory footprint\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch4>Considerations\u003C\u002Fh4>\n\u003Cul>\n\u003Cli>Function granularity and least privilege\u003C\u002Fli>\n\u003Cli>Connection pooling (Refer &quot;Using RDS Proxy&quot; page to learn more about connection pooling in AWS Lambda)\u003C\u002Fli>\n\u003Cli>Endpoint-based functionality (Spring Actuator, Metrics scraping)\u003C\u002Fli>\n\u003Cli>File-System logging\u003C\u002Fli>\n\u003Cli>Caching\u003C\u002Fli>\n\u003C\u002Ful>\n",{"title":6,"order":7,"authors":8,"resources":11},"Spring",7,[9,10],"Lavanya Tangutur","Maximilian Schellhorn",[12,16,20],{"link":13,"text":14,"type":15},"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-java-frameworks-samples\u002Ftree\u002Fmain","Quarkus sample application","GitHub",{"link":17,"text":18,"type":19},"https:\u002F\u002Fcatalog.workshops.aws\u002Fjava-on-aws-lambda\u002Fen-US","Java on AWS Lambda","workshop",{"link":21,"text":22,"type":23},"https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fdevops\u002Fdeveloping-with-java-and-spring-boot-using-amazon-codewhisperer\u002F","Build Spring Boot using Amazon CodeWhisperer","Blog","[Spring Boot](https:\u002F\u002Fspring.io\u002Fprojects\u002Fspring-boot) is the most popular Java application framework with +60% of \nJava developers reportedly using it. \nThere is a broad ecosystem (libraries, tools and resources) and developer experience.\nSpring Boot on a server initializes the environment once and handles multiple requests with the same instance, \nwhereas in AWS Lambda an execution environment is initialized on first invocation \nand can handle only one request at a time. \nAnother environment is started if another request comes in while the execution environment is busy.\n\n#### Spring Cloud for AWS\n[Spring Cloud AWS](https:\u002F\u002Fawspring.io\u002F) supports a subset of AWS services which drastically reduces the time needed\nto use their capabilities in a Spring Boot application. \nAWS services like Amazon RDS, Amazon SQS, Amazon SNS, Amazon S3, and more are already available.\nSpring Cloud AWS using Spring APIs and idioms to make it easy for Spring Boot developers to adapt above AWS services.\nFor example, Spring Messaging API with SQS, Spring Cache API with Amazon ElasticSearch, emails via Amazon SES,\nbootstrap property sources with AWS Parameter Store or Secrets Manager.\n\n#### Spring Cloud Function\n[Spring Cloud Function](https:\u002F\u002Fspring.io\u002Fprojects\u002Fspring-cloud-function) promotes the implementation of business \nlogic via Function interface.\nYou can use this in conjunction with AWS Lambda for payload translation, and to leverage Spring Boot features in \nfunctional environment.\n\n#### Spring journey to AWS Lambda\nSpring journey to AWS Lambda contains four steps:\n\n#### Migrate\nAWS Lambda is invoked via Events (API Event, S3 Object Event, SQS Event, etc.). \nEvents follow a certain structure, \nand this is different from accepting an HTTP connection.\nAWS Serverless Java Container is a library that acts as a conduit between Events and HTTP. \nIt transforms events so that Spring can handle them as if it was an HTTP request.\n\n**Using AWS Serverless Java Container**\n\nIf you still need to use `@RestController` in your SpringBoot application running on AWS Lambda, \nthen [AWS Serverless Java Container](https:\u002F\u002Fgithub.com\u002Fawslabs\u002Faws-serverless-java-container) \ncan be used which transforms events to framework specific \nHTTP Request structure. This is mainly used when routing via `@RestController`, rely on POJO serialization, \nand return HTTP status codes.\n\nAll you have to do is to add the library to your code and provide a configuration class.\n\nAWS Serverless Java Container now supports Java 17 and SpringBoot 3. \nRefer this [pet-store](https:\u002F\u002Fgithub.com\u002Fawslabs\u002Faws-serverless-java-container\u002Ftree\u002Fmain\u002Fsamples\u002Fspringboot3\u002Fpet-store) sample to\nlearn more about its use.\n\n#### Optimize\n- Right size the application memory setting with AWS Lambda power tuning.\n- Enable AWS Lambda SnapStart for fast function startups\n- Use Tiered Compilation to reduce cold-starts (for Java 11)\n- Use AWS SDK & Initialization best practices\n- Pre-warm execution environments with Provisioned Concurrency.\n\n#### Refactor\n- Improve performance and memory footprint by refactoring the application\n- Using light-weight dependencies, for example:\n  - `spring-data-jpa` vs `spring-data-jdbc`\n  - `jackson` vs `jackon-jr`\n  - `log4J2` vs `SLF4J SimpleLogger`\n- Move to a functional approach\n  - Avoid the overhead of providing an own HTTP server (API Gateway takes care of this)\n  - Use a functional approach using Spring Cloud Functions and directly handle the event from API Gateway\n  - `RestController` vs `FunctionHandler\u003CEvent>`\n\nPrefer using `Function` interface, as mentioned above with Spring Cloud Function.\nAn AWS Lambda handler would look as the following:\n\n```java\n@Component\npublic class UnicornPostFunction implements Function\u003CAPIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent> {\n\n  @Override\n  public APIGatewayProxyResponseEvent apply(APIGatewayProxyRequestEvent input) {\n    try {\n      var unicorn = objectMapper.readValue(input.getBody(), Unicorn.class);\n      var savedUnicorn = unicornService.createUnicorn(unicorn);\n      return new APIGatewayProxyResponseEvent().withStatusCode(200).withBody(objectMapper.writeValueAsString(savedUnicorn));\n    } catch (Exception e) {\n      logger.error(\"Error creating unicorn\", e);\n      return new APIGatewayProxyResponseEvent().withStatusCode(500).withBody(\"Error creating unicorn\");\n    }\n  }\n}\n```\n\ninstead of `@RestController`:\n\n```java\n@RestController\npublic class UnicornController {\n  \u002F\u002F...\n  @PostMapping(\"\u002Funicorns\")\n  public ResponseEntity\u003CUnicorn> createUnicorn(@RequestBody Unicorn unicorn) {\n    try {\n      var savedUnicorn = unicornService.createUnicorn(unicorn);\n      return ResponseEntity.ok(savedUnicorn);\n    } catch (Exception e) {\n      logger.error(\"Error creating unicorn\", e);\n      throw new ResponseStatusException(INTERNAL_SERVER_ERROR, \"Error creating unicorn\", e);\n    }\n  }\n}\n```\n\n#### Accelerate\nGraalVM Native image\n- Spring Boot 3 provides native support for GraalVM native images\n- [Create a native binary](https:\u002F\u002Fdocs.spring.io\u002Fspring-boot\u002Fdocs\u002Fcurrent\u002Freference\u002Fhtml\u002Fnative-image.html) - usage with AWS Lambda custom runtime\n- Sub-second application startup\n\nUse alternative compile time frameworks on the JVM (Micronaut, Quarkus)\n\n- Cloud-Native frameworks – Built for the cloud\n- Allows you to shift certain tasks to build time (e.g., Dependency Injection)\n- It can further improve application start-up and memory footprint\n\n#### Considerations\n- Function granularity and least privilege\n- Connection pooling (Refer \"Using RDS Proxy\" page to learn more about connection pooling in AWS Lambda)\n- Endpoint-based functionality (Spring Actuator, Metrics scraping)\n- File-System logging\n- Caching\n",[26,47,72,200,242,299,315,354,376],{"title":27,"collapsible":28,"isCollapsed":29,"content":30},"Introduction",false,true,[31],{"title":32,"order":33,"authors":34,"callout":36,"prerequisite":40,"time":43,"path":44,"id":45,"link":46},"Getting Started",1,[35],"Dhiraj Mahapatro",{"title":37,"description":38,"link":39},"Watch this video","This Devoxx Belgium 2023 presentation shows effectively running Java on Serverless","https:\u002F\u002Fyoutu.be\u002Fu3tgOE8qFjI?t=5549",[41,42],"Understanding of Java","Understanding of AWS Lambda","2 min","1-introduction","1-introduction.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002F1-introduction",{"title":48,"collapsible":28,"isCollapsed":29,"content":49},"History",[50,58,65],{"title":51,"order":52,"authors":53,"time":54,"path":55,"id":56,"link":57},"Evolution of Java",3,[35],"1 min","history","history.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fhistory",{"title":59,"order":60,"authors":61,"time":43,"path":62,"id":63,"link":64},"Evolution of Compute",4,[35],"compute","compute.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fcompute",{"title":66,"order":67,"authors":68,"time":43,"path":69,"id":70,"link":71},"Challenges",5,[35,10],"challenge","challenge.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fchallenge",{"title":73,"collapsible":28,"isCollapsed":29,"content":74},"Best Practices",[75,93,103,109,126,143,161,176,190],{"title":76,"order":77,"youtubeVideoID":78,"authors":79,"callout":81,"resources":84,"time":89,"path":90,"id":91,"link":92},"Lambda Snapstart",6,"ZbnAithBNYY",[80,35],"Vipan Kumar",{"title":37,"description":82,"link":83},"This serverless office hours session dives deeper into Lambda SnapStart.","https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=Y5b8_KToeDY",[85],{"link":86,"text":87,"type":88},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=IIKe2dx9Ag0","Spring IO (Barcelona)","video","8 min","snapstart","snapstart.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fsnapstart",{"title":94,"order":77,"authors":95,"callout":96,"time":54,"path":100,"id":101,"link":102},"Tiered Compilation",[80],{"title":97,"description":98,"link":99},"Read this blog","This AWS blog explains Tiered compilation in details","https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fcompute\u002Fincreasing-performance-of-java-aws-lambda-functions-using-tiered-compilation\u002F","tiered-compilation","tiered-compilation.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Ftiered-compilation",{"title":104,"order":77,"authors":105,"time":54,"path":106,"id":107,"link":108},"Utilize initialization phase",[35],"init-heavy-lifting","init-heavy-lifting.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Finit-heavy-lifting",{"title":110,"order":77,"authors":111,"youtubeVideoID":113,"resources":114,"time":122,"path":123,"id":124,"link":125},"Using RDS Proxy",[112,35],"Sonali Jena","ZQOqmMn_8jw",[115,119],{"link":116,"text":117,"type":118},"https:\u002F\u002Faws.amazon.com\u002Fgetting-started\u002Fhands-on\u002Fset-up-shared-database-connection-amazon-rds-proxy\u002F","Shared DB connections with RDS Proxy","user guide",{"link":120,"type":118,"text":121},"https:\u002F\u002Fdocs.aws.amazon.com\u002FAmazonRDS\u002Flatest\u002FAuroraUserGuide\u002Frds-proxy.html","RDS Proxy","4 min","rds-proxy","rds-proxy.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Frds-proxy",{"title":127,"order":77,"authors":128,"callout":129,"prerequisite":133,"resources":135,"time":43,"path":140,"id":141,"link":142},"Choice of HTTP Clients",[80,35],{"title":130,"description":131,"link":132},"Read this Blog","This blog explains how AWS CRT HTTP Client offers faster startup time and small memory footprint","https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fdeveloper\u002Fannouncing-availability-of-the-aws-crt-http-client-in-the-aws-sdk-for-java-2-x\u002F",[134],"Before moving on to HTTP clients, the first and foremost requirement to improve performance in Lambda functions is to upgrade from AWS SDK Java v1 to AWS SDK Java v2 as soon as possible. Version 2 of the AWS SDK was released in Nov 2018 with a lot of performance upgrades.",[136],{"link":137,"type":138,"text":139},"https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fdeveloper\u002Faws-sdk-for-java-2-x-released\u002F","blog","AWS SDK for Java v2","http-clients","http-clients.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fhttp-clients",{"title":144,"order":77,"authors":145,"youtubeVideoID":146,"resources":147,"time":122,"path":158,"id":159,"link":160},"Hexagonal Architecture",[80],"kRFg6fkVChQ",[148,152,155],{"link":149,"text":150,"type":151},"https:\u002F\u002Fdocs.aws.amazon.com\u002Fprescriptive-guidance\u002Flatest\u002Fhexagonal-architectures\u002Fwelcome.html","Hexagonal architecture","guidance",{"link":153,"text":154,"type":138},"https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fcompute\u002Fdeveloping-portable-aws-lambda-functions\u002F","Portable Lambda functions",{"link":156,"type":138,"text":157},"https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fcompute\u002Fdeveloping-evolutionary-architecture-with-aws-lambda\u002F","Building evolutionary architecture on AWS Lambda","hexagonal","hexagonal.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fhexagonal",{"title":162,"order":77,"authors":163,"youtubeVideoID":164,"resources":165,"time":43,"path":173,"id":174,"link":175},"Powertools for AWS Lambda",[9],"dH2GP6Lydj8",[166,170],{"link":167,"text":168,"type":169},"https:\u002F\u002Fgithub.com\u002Faws-powertools\u002Fpowertools-lambda-java","Powertools for AWS Lambda (Java)","github",{"link":171,"type":138,"text":172},"https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fopensource\u002Fsimplifying-serverless-best-practices-with-aws-lambda-powertools-java\u002F","Best practices with Powertools","powertools","powertools.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fpowertools",{"title":177,"order":77,"authors":178,"youtubeVideoID":179,"callout":180,"resources":184,"time":54,"path":187,"id":188,"link":189},"Lambda Power tuning ",[9,35],"z8wGSykEauI",{"title":181,"description":182,"link":183},"Watch the video","This video covers a variety of AWS Lambda performance and cost optimization techniques including use of Power tuning.","https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=z8wGSykEauI",[185,186],{"link":116,"text":117,"type":118},{"link":120,"type":118,"text":121},"powertuning","powertuning.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fpowertuning",{"title":191,"order":77,"authors":192,"resources":193,"time":43,"path":197,"id":198,"link":199},"Using Graviton2",[35],[194],{"link":195,"text":196,"type":138},"https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fcompute\u002Fmigrating-aws-lambda-functions-to-arm-based-aws-graviton2-processors\u002F","Using Arm-based Graviton2 processors","graviton","graviton.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fgraviton",{"title":201,"collapsible":28,"isCollapsed":28,"content":202},"Java frameworks",[203,215,223,232],{"title":204,"order":7,"authors":205,"resources":206,"time":43,"path":212,"id":213,"link":214},"Micronaut",[9,35],[207,209],{"link":13,"text":208,"type":15},"Serverless Java Frameworks",{"link":210,"text":211,"type":15},"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-patterns\u002Ftree\u002Fmain\u002Fapigw-lambda-rds-snapstart","Micronaut with RDS","micronaut","micronaut.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fmicronaut",{"title":216,"order":7,"authors":217,"resources":218,"time":43,"path":220,"id":221,"link":222},"Quarkus",[9,35],[219],{"link":13,"text":14,"type":15},"quarkus","quarkus.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fquarkus",{"title":6,"order":7,"authors":224,"resources":225,"time":122,"path":229,"id":230,"link":231},[9,10],[226,227,228],{"link":13,"text":14,"type":15},{"link":17,"text":18,"type":19},{"link":21,"text":22,"type":23},"springboot","springboot.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fspringboot",{"title":233,"order":7,"authors":234,"resources":235,"time":43,"path":239,"id":240,"link":241},"GraalVM Native Image",[9,35],[236,238],{"link":13,"text":237,"type":15},"GraalVM sample application",{"link":17,"text":18,"type":19},"graalvm","graalvm.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fgraalvm",{"title":243,"collapsible":28,"isCollapsed":29,"content":244},"Testing a Java application",[245,262,271,281,290],{"title":246,"order":247,"authors":248,"callout":250,"resources":254,"time":258,"path":259,"id":260,"link":261},"Testing Serverless",8,[249],"Lorenzo Micheli",{"title":251,"description":252,"link":253},"Read the Serverless testing guide","This guide dives deeper into Serverless testing","https:\u002F\u002Fserverlessland.com\u002Ftesting",[255],{"link":256,"text":257,"type":15},"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-test-samples\u002Ftree\u002Fmain\u002Fjava-test-samples","Serverless Java test samples","3 min","testing","testing.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Ftesting",{"title":263,"order":247,"authors":264,"callout":265,"resources":266,"time":122,"path":268,"id":269,"link":270},"Unit Testing",[249],{"title":251,"description":252,"link":253},[267],{"link":256,"text":257,"type":15},"unit","unit.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Funit",{"title":272,"order":247,"authors":273,"callout":274,"resources":275,"time":277,"path":278,"id":279,"link":280},"Integration Testing",[249,35],{"title":251,"description":252,"link":253},[276],{"link":256,"text":257,"type":15},"5 min","integration","integration.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fintegration",{"title":282,"order":247,"authors":283,"callout":284,"resources":285,"time":258,"path":287,"id":288,"link":289},"Functional Testing",[249,35],{"title":251,"description":252,"link":253},[286],{"link":256,"text":257,"type":15},"functional","functional.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Ffunctional",{"title":291,"order":247,"authors":292,"callout":293,"resources":294,"time":43,"path":296,"id":297,"link":298},"Load Testing",[35],{"title":251,"description":252,"link":253},[295],{"link":256,"text":257,"type":15},"load","load.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fload",{"title":300,"collapsible":28,"isCollapsed":29,"content":301},"Local Development",[302,309],{"title":303,"order":304,"authors":305,"time":54,"path":306,"id":307,"link":308},"IntelliJ",10,[35],"intellij","intellij.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fintellij",{"title":310,"order":304,"authors":311,"time":54,"path":312,"id":313,"link":314},"Visual Studio Code",[35],"vscode","vscode.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fvscode",{"title":316,"collapsible":28,"isCollapsed":29,"content":317},"Infrastructure as Code",[318,325,331,341],{"title":319,"order":320,"authors":321,"time":43,"path":322,"id":323,"link":324},"CloudFormation",9,[112],"cloudformation","cloudformation.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fcloudformation",{"title":326,"order":320,"authors":327,"time":277,"path":328,"id":329,"link":330},"AWS CDK",[112],"cdk","cdk.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fcdk",{"title":332,"order":320,"authors":333,"resources":334,"time":43,"path":338,"id":339,"link":340},"AWS SAM",[112],[335],{"link":336,"text":337,"type":138},"https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fcompute\u002Fbuilding-serverless-java-applications-with-the-aws-sam-cli\u002F","Java Serverless AWS SAM CLI","sam","sam.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fsam",{"title":342,"order":320,"authors":343,"resources":344,"time":43,"path":351,"id":352,"link":353},"Terraform",[35],[345,348],{"link":346,"type":15,"text":347},"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-patterns\u002Ftree\u002Fmain\u002Fapigw-lambda-snapstart-terraform","Java sample with Terraform",{"link":349,"text":350,"type":118},"https:\u002F\u002Fdocs.aws.amazon.com\u002Fserverless-application-model\u002Flatest\u002Fdeveloperguide\u002Fwhat-is-terraform-support.html","AWS SAM CLI Terraform support","terraform","terraform.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fterraform",{"title":355,"collapsible":28,"isCollapsed":29,"content":356},"Benchmarking",[357],{"title":358,"order":359,"youtubeVideoID":360,"authors":361,"resources":362,"time":54,"path":373,"id":374,"link":375},"Performance Benchmarking",11,"wmEIMWigXGc",[35],[363,365,367,370],{"link":364,"text":18,"type":19},"https:\u002F\u002Fcatalog.workshops.aws\u002Fjava-on-aws-lambda\u002Fen-US\u002F01-migration\u002F02-optimizations\u002Fbenchmark",{"link":13,"text":366,"type":15},"Benchmark: Micronaut, Quarkus, and SpringBoot",{"link":368,"text":369,"type":15},"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-graalvm-demo","GraalVM native image on AWS Lambda Benchmarking",{"link":371,"text":372,"type":15},"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-kotlin-demo","Benchmark Kotlin on Serverless","benchmark","benchmark.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fbenchmark",{"title":377,"collapsible":28,"isCollapsed":29,"content":378},"Migration",[379],{"title":380,"order":381,"authors":382,"youtubeVideoID":383,"resources":384,"time":54,"path":391,"id":392,"link":393},"Migration Guide",12,[35],"u3tgOE8qFjI",[385,389],{"link":386,"text":387,"type":388},"https:\u002F\u002Fserverlessland.com\u002Fcontent\u002Fservice\u002Flambda\u002Fpaved-path\u002Fjava-replatforming\u002Fintroduction","Java re-platforming guide","Guide",{"link":17,"text":18,"type":390},"Workshop","migration","migration.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fmigration","LIST",[396,397,398,399,400,401],"content\u002Fcontributors\u002Fdhiraj-mahapatro.json","content\u002Fcontributors\u002Fsonali-jena.json","content\u002Fcontributors\u002Flavanya-tangutur.json","content\u002Fcontributors\u002Fvipan-kumar.json","content\u002Fcontributors\u002Florenzo-micheli.json","content\u002Fcontributors\u002Fmaximilian-schellhorn.json","Effectively running Java on Serverless",1792665273119]