[{"data":1,"prerenderedAt":402},["ShallowReactive",2],{"content-svc-lambda-guides-effectively-running-java-on-serverless-integration":3},{"markdown":4,"frontMatterAttributes":5,"bodyRaw":20,"menu":21,"menuType":393,"isCollapseableMenu":24,"nextDocItem":280,"previousDocItem":262,"contributorPaths":394,"contentName":401,"slug":279,"readingTime":276},"\u003Cp>Once the AWS Lambda code has been tested in isolation, we need to make sure that it works together with the other \nservices it interacts with. Some functionalities can be delegated entirely to managed services such as Amazon S3, \nor created without using any internally developed code. There is no need to test these managed services, \nbut you do need to test the integration with these services.\u003C\u002Fp>\n\u003Ch4>Testing with Emulators\u003C\u002Fh4>\n\u003Cp>One way to test the integration with cloud managed services is using Emulator, \na locally running application which mimics a production AWS service.\u003C\u002Fp>\n\u003Cp>Emulators have APIs that are similar to their cloud counterparts and provide similar return values. \nThey can also simulate state changes that are initiated by API calls. For example, \nyou might use AWS SAM to run a function with AWS SAM local to emulate the Lambda service so that you can quickly \ninvoke a function. See \u003Ca href=\"https:\u002F\u002Fdocs.aws.amazon.com\u002Fserverless-application-model\u002Flatest\u002Fdeveloperguide\u002Fusing-sam-cli-local.html\">AWS SAM local\u003C\u002Fa> in the AWS Serverless Application Model Developer Guide for details.\u003C\u002Fp>\n\u003Cp>The advantages of test with emulators include the following:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Emulators can facilitate fast local development iterations and testing.\u003C\u002Fli>\n\u003Cli>Emulators provide a familiar environment for developers used to developing code in a local environment.\u003C\u002Fli>\n\u003Cli>Emulators do not require any changes to cloud infrastructure (such as developer cloud accounts), \nso it’s easy to implement with existing testing patterns.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Testing with emulators has these disadvantages:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Emulators can be difficult to set up and replicate, especially when used in CI\u002FCD pipelines. \u003C\u002Fli>\n\u003Cli>Emulated features and APIs typically lag behind service updates. \nThis can lead to errors because tested code does not match the actual API, and impedes the adoption of new features.\u003C\u002Fli>\n\u003Cli>Emulators require support, updates, bug fixes, and feature parity enhancements. \nThese are the responsibility of the emulator author, which could be a third-party company.\u003C\u002Fli>\n\u003Cli>Tests that rely on emulators may provide successful results locally, but fail in the cloud due to production security \npolicies, inter-service configurations, or exceeding Lambda quotas.\u003C\u002Fli>\n\u003Cli>Many AWS services do not have emulators available. If you rely on emulation, \nyou may not have a satisfactory testing option for portions of your application.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch4>Integration Testing with actual resources in the cloud\u003C\u002Fh4>\n\u003Cp>You can run integration tests against cloud-based code that also interacts with cloud-based services.\u003C\u002Fp>\n\u003Cp>Although the test runs locally, it interacts with cloud-based resources. \nThese resources have been deployed using the AWS Serverless Application Model and AWS SAM command line tool. \u003C\u002Fp>\n\u003Cp>To demonstrate how we can implement and run Integration Tests in the cloud for the \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-test-samples\u002Fblob\u002Fmain\u002Fjava-test-samples\u002Fapigw-lambda-ddb\u002FTicketsFunction\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fexample\u002FTicketFunction.java\">TicketFunction\u003C\u002Fa>, \nwe will use the code in \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-test-samples\u002Fblob\u002Fmain\u002Fjava-test-samples\u002Fapigw-lambda-ddb\u002FTicketsFunction\u002Fsrc\u002Ftest\u002Fjava\u002Fcom\u002Fexample\u002FTicketFunctionIntegrationTest.java\">TicketFunctionIntegrationTest.java\u003C\u002Fa>.\u003C\u002Fp>\n\u003Cp>This tests assumes that the DynamoDB table is provisioned in your AWS account, \nand you have the appropriate credentials locally to access this account (for example in \u003Ccode>~\u002F.aws\u002Fcredentials\u003C\u002Fcode>). \nTo do that, you need first to deploy the SAM Template provided in the repository using the commands \n\u003Ccode>sam build\u003C\u002Fcode> and \u003Ccode>sam deploy\u003C\u002Fcode> as follows:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">$ sam build\n...\nBuild Succeeded\n\n$ sam deploy --guided\nConfiguring SAM deploy\n======================\n\n  Looking for config file [samconfig.toml] :  Found\n  Reading default arguments  :  Success\n\n  Setting default arguments for &#39;sam deploy&#39;\n  =========================================\n  Stack Name [apigw-lambda-ddb]: apigw-lambda-ddb\n  AWS Region [us-east-2]: us-east-2\n  ....\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\n\u003Cp>Make sure to specify the AWS Region us-east-2 as TicketFunctionIntegrationTest.java assumes that the DynamoDb table is deployed in us-east-2\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch4>Mock event payload but integrate with AWS Services in the cloud\u003C\u002Fh4>\n\u003Cp>So far we have seen\nhow to write unit tests by mocking classes we defined to wrap API calls to AWS Services such as DynamoDB.\nIn an integration test, you still will mock the event payload but instead of mocking the DynamoDB APIs,\nyou will actually call the \nreal APIs on cloud.\u003C\u002Fp>\n\u003Cp>Our integration tests then can feed custom input events to our Lambda Function and test the behavior in real as we are \ncalling the actual API to AWS Services. \nIt is the best practice to define these input events as json files stored in the \u003Ccode>src\u002Ftest\u002Fresources\u002Fevents\u003C\u002Fcode> folder.\u003C\u002Fp>\n\u003Cp>We will use the \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Faws\u002Faws-lambda-java-libs\u002Ftree\u002Fmain\u002Faws-lambda-java-tests\">aws-lambda-java-tests\u003C\u002Fa> library\nto seamlessly load \nand deserialize JSON events and inject them in your tests.\u003C\u002Fp>\n\u003Cp>The \u003Ccode>@Event\u003C\u002Fcode> annotation provides loaders for the most common event types available in \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Faws\u002Faws-lambda-java-libs\u002Ftree\u002Fmain\u002Faws-lambda-java-events\">aws-lambda-java-events\u003C\u002Fa>. \nIt requires the path of a json file with the event definition from the \u003Ccode>src\u002Ftest\u002Fresources\u003C\u002Fcode> folder, \nand the \u003Ccode>aws-lambda-java-events\u003C\u002Fcode> type to map the event with.\u003C\u002Fp>\n\u003Cp>Similar to unit tests, we use the JUnit5 \u003Ccode>ParameterizedTest\u003C\u002Fcode> annotation to inject arguments into a test, \nso we can run the same test one or more times with different parameters.\u003C\u002Fp>\n\u003Cp>The major difference in integration tests compared to unit tests is\nthat the actual DynamoDB database on AWS will be used in the test.\nTherefore,\nmake sure the AWS credentials used in the tests are valid and a \u003Ccode>DynamoDBClient\u003C\u002Fcode> is available in the same region as the \ndatabase for assertion.\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-java\">@ExtendWith(SystemStubsExtension.class)\npublic class TicketFunctionIntegrationTest {\n\n  private static final Region TEST_REGION = Region.US_EAST_2;\n  @SystemStub\n  private static EnvironmentVariables environmentVariables;\n\n  private final DynamoDbClient ddbClient = DynamoDbClient.builder()\n    .region(TEST_REGION)\n    .build();\n  \n  private List&lt;String&gt; ticketList = new ArrayList&lt;&gt;();\n\n  @BeforeAll\n  public static void setup() {\n    ProfileCredentialsProvider credentialsProvider = ProfileCredentialsProvider.create(&quot;default&quot;);\n    AwsCredentials awsCredentials = credentialsProvider.resolveCredentials();\n    environmentVariables.set(&quot;AWS_ACCESS_KEY_ID&quot;, awsCredentials.accessKeyId());\n    environmentVariables.set(&quot;AWS_SECRET_ACCESS_KEY&quot;, awsCredentials.secretAccessKey());\n    environmentVariables.set(&quot;AWS_REGION&quot;, TEST_REGION.id());\n  }\n\n  @ParameterizedTest\n  @Event(value = &quot;events\u002Fapigw_request_1.json&quot;, type = APIGatewayProxyRequestEvent.class)\n  public void testPutTicket(APIGatewayProxyRequestEvent event, EnvironmentVariables environmentVariables) {\n    TicketFunction function = new TicketFunction();\n\n    \u002F\u002F Note there is no mocking API used before calling the handler\n    APIGatewayProxyResponseEvent response = function.handleRequest(event, null);\n    Assertions.assertNotNull(response);\n    Assertions.assertNotNull(response.getBody());\n\n    String uuidStr = response.getBody();\n    Assertions.assertNotNull(uuidStr);\n\n    ticketList.add(uuidStr.substring(1, uuidStr.length() - 1));\n    DynamoTestUtil.validateItems(ticketList, ddbClient);\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>You can find the complete integration test code for this example in \n\u003Ca href=\"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-test-samples\u002Fblob\u002Fmain\u002Fjava-test-samples\u002Fapigw-lambda-ddb\u002FTicketsFunction\u002Fsrc\u002Ftest\u002Fjava\u002Fcom\u002Fexample\u002FTicketFunctionIntegrationTest.java\">TicketFunctionIntegrationTest.java\u003C\u002Fa> and all the other examples in the \nsame GitHub repository \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-test-samples\">serverless-test-samples\u003C\u002Fa>.\u003C\u002Fp>\n",{"title":6,"order":7,"authors":8,"callout":11,"resources":15},"Integration Testing",8,[9,10],"Lorenzo Micheli","Dhiraj Mahapatro",{"title":12,"description":13,"link":14},"Read the Serverless testing guide","This guide dives deeper into Serverless testing","https:\u002F\u002Fserverlessland.com\u002Ftesting",[16],{"link":17,"text":18,"type":19},"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-test-samples\u002Ftree\u002Fmain\u002Fjava-test-samples","Serverless Java test samples","GitHub","Once the AWS Lambda code has been tested in isolation, we need to make sure that it works together with the other \nservices it interacts with. Some functionalities can be delegated entirely to managed services such as Amazon S3, \nor created without using any internally developed code. There is no need to test these managed services, \nbut you do need to test the integration with these services.\n\n#### Testing with Emulators\n\nOne way to test the integration with cloud managed services is using Emulator, \na locally running application which mimics a production AWS service.\n\nEmulators have APIs that are similar to their cloud counterparts and provide similar return values. \nThey can also simulate state changes that are initiated by API calls. For example, \nyou might use AWS SAM to run a function with AWS SAM local to emulate the Lambda service so that you can quickly \ninvoke a function. See [AWS SAM local](https:\u002F\u002Fdocs.aws.amazon.com\u002Fserverless-application-model\u002Flatest\u002Fdeveloperguide\u002Fusing-sam-cli-local.html) in the AWS Serverless Application Model Developer Guide for details.\n\nThe advantages of test with emulators include the following:\n\n- Emulators can facilitate fast local development iterations and testing.\n- Emulators provide a familiar environment for developers used to developing code in a local environment.\n- Emulators do not require any changes to cloud infrastructure (such as developer cloud accounts), \n  so it’s easy to implement with existing testing patterns.\n\nTesting with emulators has these disadvantages:\n\n- Emulators can be difficult to set up and replicate, especially when used in CI\u002FCD pipelines. \n- Emulated features and APIs typically lag behind service updates. \n  This can lead to errors because tested code does not match the actual API, and impedes the adoption of new features.\n- Emulators require support, updates, bug fixes, and feature parity enhancements. \n  These are the responsibility of the emulator author, which could be a third-party company.\n- Tests that rely on emulators may provide successful results locally, but fail in the cloud due to production security \n  policies, inter-service configurations, or exceeding Lambda quotas.\n- Many AWS services do not have emulators available. If you rely on emulation, \n  you may not have a satisfactory testing option for portions of your application.\n\n#### Integration Testing with actual resources in the cloud\nYou can run integration tests against cloud-based code that also interacts with cloud-based services.\n\nAlthough the test runs locally, it interacts with cloud-based resources. \nThese resources have been deployed using the AWS Serverless Application Model and AWS SAM command line tool. \n\nTo demonstrate how we can implement and run Integration Tests in the cloud for the [TicketFunction](https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-test-samples\u002Fblob\u002Fmain\u002Fjava-test-samples\u002Fapigw-lambda-ddb\u002FTicketsFunction\u002Fsrc\u002Fmain\u002Fjava\u002Fcom\u002Fexample\u002FTicketFunction.java), \nwe will use the code in [TicketFunctionIntegrationTest.java](https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-test-samples\u002Fblob\u002Fmain\u002Fjava-test-samples\u002Fapigw-lambda-ddb\u002FTicketsFunction\u002Fsrc\u002Ftest\u002Fjava\u002Fcom\u002Fexample\u002FTicketFunctionIntegrationTest.java).\n\nThis tests assumes that the DynamoDB table is provisioned in your AWS account, \nand you have the appropriate credentials locally to access this account (for example in `~\u002F.aws\u002Fcredentials`). \nTo do that, you need first to deploy the SAM Template provided in the repository using the commands \n`sam build` and `sam deploy` as follows:\n\n```bash\n$ sam build\n...\nBuild Succeeded\n\n$ sam deploy --guided\nConfiguring SAM deploy\n======================\n\n  Looking for config file [samconfig.toml] :  Found\n  Reading default arguments  :  Success\n\n  Setting default arguments for 'sam deploy'\n  =========================================\n  Stack Name [apigw-lambda-ddb]: apigw-lambda-ddb\n  AWS Region [us-east-2]: us-east-2\n  ....\n```\n\n> Make sure to specify the AWS Region us-east-2 as TicketFunctionIntegrationTest.java assumes that the DynamoDb table is deployed in us-east-2\n\n#### Mock event payload but integrate with AWS Services in the cloud\nSo far we have seen\nhow to write unit tests by mocking classes we defined to wrap API calls to AWS Services such as DynamoDB.\nIn an integration test, you still will mock the event payload but instead of mocking the DynamoDB APIs,\nyou will actually call the \nreal APIs on cloud.\n\nOur integration tests then can feed custom input events to our Lambda Function and test the behavior in real as we are \ncalling the actual API to AWS Services. \nIt is the best practice to define these input events as json files stored in the `src\u002Ftest\u002Fresources\u002Fevents` folder.\n\nWe will use the [aws-lambda-java-tests](https:\u002F\u002Fgithub.com\u002Faws\u002Faws-lambda-java-libs\u002Ftree\u002Fmain\u002Faws-lambda-java-tests) library\nto seamlessly load \nand deserialize JSON events and inject them in your tests.\n\nThe `@Event` annotation provides loaders for the most common event types available in [aws-lambda-java-events](https:\u002F\u002Fgithub.com\u002Faws\u002Faws-lambda-java-libs\u002Ftree\u002Fmain\u002Faws-lambda-java-events). \nIt requires the path of a json file with the event definition from the `src\u002Ftest\u002Fresources` folder, \nand the `aws-lambda-java-events` type to map the event with.\n\nSimilar to unit tests, we use the JUnit5 `ParameterizedTest` annotation to inject arguments into a test, \nso we can run the same test one or more times with different parameters.\n\nThe major difference in integration tests compared to unit tests is\nthat the actual DynamoDB database on AWS will be used in the test.\nTherefore,\nmake sure the AWS credentials used in the tests are valid and a `DynamoDBClient` is available in the same region as the \ndatabase for assertion.\n\n```java\n@ExtendWith(SystemStubsExtension.class)\npublic class TicketFunctionIntegrationTest {\n\n  private static final Region TEST_REGION = Region.US_EAST_2;\n  @SystemStub\n  private static EnvironmentVariables environmentVariables;\n\n  private final DynamoDbClient ddbClient = DynamoDbClient.builder()\n    .region(TEST_REGION)\n    .build();\n  \n  private List\u003CString> ticketList = new ArrayList\u003C>();\n\n  @BeforeAll\n  public static void setup() {\n    ProfileCredentialsProvider credentialsProvider = ProfileCredentialsProvider.create(\"default\");\n    AwsCredentials awsCredentials = credentialsProvider.resolveCredentials();\n    environmentVariables.set(\"AWS_ACCESS_KEY_ID\", awsCredentials.accessKeyId());\n    environmentVariables.set(\"AWS_SECRET_ACCESS_KEY\", awsCredentials.secretAccessKey());\n    environmentVariables.set(\"AWS_REGION\", TEST_REGION.id());\n  }\n\n  @ParameterizedTest\n  @Event(value = \"events\u002Fapigw_request_1.json\", type = APIGatewayProxyRequestEvent.class)\n  public void testPutTicket(APIGatewayProxyRequestEvent event, EnvironmentVariables environmentVariables) {\n    TicketFunction function = new TicketFunction();\n\n    \u002F\u002F Note there is no mocking API used before calling the handler\n    APIGatewayProxyResponseEvent response = function.handleRequest(event, null);\n    Assertions.assertNotNull(response);\n    Assertions.assertNotNull(response.getBody());\n\n    String uuidStr = response.getBody();\n    Assertions.assertNotNull(uuidStr);\n\n    ticketList.add(uuidStr.substring(1, uuidStr.length() - 1));\n    DynamoTestUtil.validateItems(ticketList, ddbClient);\n  }\n}\n```\n\nYou can find the complete integration test code for this example in \n[TicketFunctionIntegrationTest.java](https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-test-samples\u002Fblob\u002Fmain\u002Fjava-test-samples\u002Fapigw-lambda-ddb\u002FTicketsFunction\u002Fsrc\u002Ftest\u002Fjava\u002Fcom\u002Fexample\u002FTicketFunctionIntegrationTest.java) and all the other examples in the \nsame GitHub repository [serverless-test-samples](https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-test-samples).\n",[22,42,68,197,249,298,314,353,375],{"title":23,"collapsible":24,"isCollapsed":25,"content":26},"Introduction",false,true,[27],{"title":28,"order":29,"authors":30,"callout":31,"prerequisite":35,"time":38,"path":39,"id":40,"link":41},"Getting Started",1,[10],{"title":32,"description":33,"link":34},"Watch this video","This Devoxx Belgium 2023 presentation shows effectively running Java on Serverless","https:\u002F\u002Fyoutu.be\u002Fu3tgOE8qFjI?t=5549",[36,37],"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":43,"collapsible":24,"isCollapsed":25,"content":44},"History",[45,53,60],{"title":46,"order":47,"authors":48,"time":49,"path":50,"id":51,"link":52},"Evolution of Java",3,[10],"1 min","history","history.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fhistory",{"title":54,"order":55,"authors":56,"time":38,"path":57,"id":58,"link":59},"Evolution of Compute",4,[10],"compute","compute.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fcompute",{"title":61,"order":62,"authors":63,"time":38,"path":65,"id":66,"link":67},"Challenges",5,[10,64],"Maximilian Schellhorn","challenge","challenge.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fchallenge",{"title":69,"collapsible":24,"isCollapsed":25,"content":70},"Best Practices",[71,89,99,105,122,139,157,173,187],{"title":72,"order":73,"youtubeVideoID":74,"authors":75,"callout":77,"resources":80,"time":85,"path":86,"id":87,"link":88},"Lambda Snapstart",6,"ZbnAithBNYY",[76,10],"Vipan Kumar",{"title":32,"description":78,"link":79},"This serverless office hours session dives deeper into Lambda SnapStart.","https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=Y5b8_KToeDY",[81],{"link":82,"text":83,"type":84},"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":90,"order":73,"authors":91,"callout":92,"time":49,"path":96,"id":97,"link":98},"Tiered Compilation",[76],{"title":93,"description":94,"link":95},"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":100,"order":73,"authors":101,"time":49,"path":102,"id":103,"link":104},"Utilize initialization phase",[10],"init-heavy-lifting","init-heavy-lifting.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Finit-heavy-lifting",{"title":106,"order":73,"authors":107,"youtubeVideoID":109,"resources":110,"time":118,"path":119,"id":120,"link":121},"Using RDS Proxy",[108,10],"Sonali Jena","ZQOqmMn_8jw",[111,115],{"link":112,"text":113,"type":114},"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":116,"type":114,"text":117},"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":123,"order":73,"authors":124,"callout":125,"prerequisite":129,"resources":131,"time":38,"path":136,"id":137,"link":138},"Choice of HTTP Clients",[76,10],{"title":126,"description":127,"link":128},"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",[130],"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.",[132],{"link":133,"type":134,"text":135},"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":140,"order":73,"authors":141,"youtubeVideoID":142,"resources":143,"time":118,"path":154,"id":155,"link":156},"Hexagonal Architecture",[76],"kRFg6fkVChQ",[144,148,151],{"link":145,"text":146,"type":147},"https:\u002F\u002Fdocs.aws.amazon.com\u002Fprescriptive-guidance\u002Flatest\u002Fhexagonal-architectures\u002Fwelcome.html","Hexagonal architecture","guidance",{"link":149,"text":150,"type":134},"https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fcompute\u002Fdeveloping-portable-aws-lambda-functions\u002F","Portable Lambda functions",{"link":152,"type":134,"text":153},"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":158,"order":73,"authors":159,"youtubeVideoID":161,"resources":162,"time":38,"path":170,"id":171,"link":172},"Powertools for AWS Lambda",[160],"Lavanya Tangutur","dH2GP6Lydj8",[163,167],{"link":164,"text":165,"type":166},"https:\u002F\u002Fgithub.com\u002Faws-powertools\u002Fpowertools-lambda-java","Powertools for AWS Lambda (Java)","github",{"link":168,"type":134,"text":169},"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":174,"order":73,"authors":175,"youtubeVideoID":176,"callout":177,"resources":181,"time":49,"path":184,"id":185,"link":186},"Lambda Power tuning ",[160,10],"z8wGSykEauI",{"title":178,"description":179,"link":180},"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",[182,183],{"link":112,"text":113,"type":114},{"link":116,"type":114,"text":117},"powertuning","powertuning.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fpowertuning",{"title":188,"order":73,"authors":189,"resources":190,"time":38,"path":194,"id":195,"link":196},"Using Graviton2",[10],[191],{"link":192,"text":193,"type":134},"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":198,"collapsible":24,"isCollapsed":25,"content":199},"Java frameworks",[200,214,223,239],{"title":201,"order":202,"authors":203,"resources":204,"time":38,"path":211,"id":212,"link":213},"Micronaut",7,[160,10],[205,208],{"link":206,"text":207,"type":19},"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-java-frameworks-samples\u002Ftree\u002Fmain","Serverless Java Frameworks",{"link":209,"text":210,"type":19},"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":215,"order":202,"authors":216,"resources":217,"time":38,"path":220,"id":221,"link":222},"Quarkus",[160,10],[218],{"link":206,"text":219,"type":19},"Quarkus sample application","quarkus","quarkus.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fquarkus",{"title":224,"order":202,"authors":225,"resources":226,"time":118,"path":236,"id":237,"link":238},"Spring",[160,64],[227,228,232],{"link":206,"text":219,"type":19},{"link":229,"text":230,"type":231},"https:\u002F\u002Fcatalog.workshops.aws\u002Fjava-on-aws-lambda\u002Fen-US","Java on AWS Lambda","workshop",{"link":233,"text":234,"type":235},"https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fdevops\u002Fdeveloping-with-java-and-spring-boot-using-amazon-codewhisperer\u002F","Build Spring Boot using Amazon CodeWhisperer","Blog","springboot","springboot.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fspringboot",{"title":240,"order":202,"authors":241,"resources":242,"time":38,"path":246,"id":247,"link":248},"GraalVM Native Image",[160,10],[243,245],{"link":206,"text":244,"type":19},"GraalVM sample application",{"link":229,"text":230,"type":231},"graalvm","graalvm.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fgraalvm",{"title":250,"collapsible":24,"isCollapsed":24,"content":251},"Testing a Java application",[252,262,271,280,289],{"title":253,"order":7,"authors":254,"callout":255,"resources":256,"time":258,"path":259,"id":260,"link":261},"Testing Serverless",[9],{"title":12,"description":13,"link":14},[257],{"link":17,"text":18,"type":19},"3 min","testing","testing.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Ftesting",{"title":263,"order":7,"authors":264,"callout":265,"resources":266,"time":118,"path":268,"id":269,"link":270},"Unit Testing",[9],{"title":12,"description":13,"link":14},[267],{"link":17,"text":18,"type":19},"unit","unit.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Funit",{"title":6,"order":7,"authors":272,"callout":273,"resources":274,"time":276,"path":277,"id":278,"link":279},[9,10],{"title":12,"description":13,"link":14},[275],{"link":17,"text":18,"type":19},"5 min","integration","integration.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fintegration",{"title":281,"order":7,"authors":282,"callout":283,"resources":284,"time":258,"path":286,"id":287,"link":288},"Functional Testing",[9,10],{"title":12,"description":13,"link":14},[285],{"link":17,"text":18,"type":19},"functional","functional.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Ffunctional",{"title":290,"order":7,"authors":291,"callout":292,"resources":293,"time":38,"path":295,"id":296,"link":297},"Load Testing",[10],{"title":12,"description":13,"link":14},[294],{"link":17,"text":18,"type":19},"load","load.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fload",{"title":299,"collapsible":24,"isCollapsed":25,"content":300},"Local Development",[301,308],{"title":302,"order":303,"authors":304,"time":49,"path":305,"id":306,"link":307},"IntelliJ",10,[10],"intellij","intellij.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fintellij",{"title":309,"order":303,"authors":310,"time":49,"path":311,"id":312,"link":313},"Visual Studio Code",[10],"vscode","vscode.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fvscode",{"title":315,"collapsible":24,"isCollapsed":25,"content":316},"Infrastructure as Code",[317,324,330,340],{"title":318,"order":319,"authors":320,"time":38,"path":321,"id":322,"link":323},"CloudFormation",9,[108],"cloudformation","cloudformation.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fcloudformation",{"title":325,"order":319,"authors":326,"time":276,"path":327,"id":328,"link":329},"AWS CDK",[108],"cdk","cdk.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fcdk",{"title":331,"order":319,"authors":332,"resources":333,"time":38,"path":337,"id":338,"link":339},"AWS SAM",[108],[334],{"link":335,"text":336,"type":134},"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":341,"order":319,"authors":342,"resources":343,"time":38,"path":350,"id":351,"link":352},"Terraform",[10],[344,347],{"link":345,"type":19,"text":346},"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-patterns\u002Ftree\u002Fmain\u002Fapigw-lambda-snapstart-terraform","Java sample with Terraform",{"link":348,"text":349,"type":114},"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":354,"collapsible":24,"isCollapsed":25,"content":355},"Benchmarking",[356],{"title":357,"order":358,"youtubeVideoID":359,"authors":360,"resources":361,"time":49,"path":372,"id":373,"link":374},"Performance Benchmarking",11,"wmEIMWigXGc",[10],[362,364,366,369],{"link":363,"text":230,"type":231},"https:\u002F\u002Fcatalog.workshops.aws\u002Fjava-on-aws-lambda\u002Fen-US\u002F01-migration\u002F02-optimizations\u002Fbenchmark",{"link":206,"text":365,"type":19},"Benchmark: Micronaut, Quarkus, and SpringBoot",{"link":367,"text":368,"type":19},"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-graalvm-demo","GraalVM native image on AWS Lambda Benchmarking",{"link":370,"text":371,"type":19},"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":376,"collapsible":24,"isCollapsed":25,"content":377},"Migration",[378],{"title":379,"order":380,"authors":381,"youtubeVideoID":382,"resources":383,"time":49,"path":390,"id":391,"link":392},"Migration Guide",12,[10],"u3tgOE8qFjI",[384,388],{"link":385,"text":386,"type":387},"https:\u002F\u002Fserverlessland.com\u002Fcontent\u002Fservice\u002Flambda\u002Fpaved-path\u002Fjava-replatforming\u002Fintroduction","Java re-platforming guide","Guide",{"link":229,"text":230,"type":389},"Workshop","migration","migration.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fmigration","LIST",[395,396,397,398,399,400],"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",1792578873659]