[{"data":1,"prerenderedAt":402},["ShallowReactive",2],{"content-svc-lambda-guides-effectively-running-java-on-serverless-snapstart":3},{"markdown":4,"frontMatterAttributes":5,"bodyRaw":21,"menu":22,"menuType":393,"isCollapseableMenu":25,"nextDocItem":80,"previousDocItem":60,"contributorPaths":394,"contentName":401,"slug":79,"readingTime":76},"\u003Ch4>Cold Start Latency\u003C\u002Fh4>\n\u003Cp>As we saw in previous sections, there are a few steps in the Lambda invocation lifecycle. \nBefore Lambda can handle incoming requests, it spends time initializing the function, \nwhich includes creating an execution environment, loading the function&#39;s code, starting the runtime, and initializing the function code. \nThis is referred to as cold start time, which is often the largest contributor to startup latency. \nThis can cause degraded user experience for interactive workloads.\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"\u002Fassets\u002Fexternal\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fassets\u002Fsnap_init_duration.png\" alt=\"SnapStartInitDuration\">\u003C\u002Fp>\n\u003Ch4>What is Lambda SnapStart?\u003C\u002Fh4>\n\u003Cp>\u003Ca href=\"https:\u002F\u002Fdocs.aws.amazon.com\u002Flambda\u002Flatest\u002Fdg\u002Fsnapstart.html\">SnapStart for AWS Lambda\u003C\u002Fa> helps improve startup performance by up to 10x at no extra cost. \nIt typically requires no changes to the function code, thus minimizing effort required by developers. \nWith SnapStart, Lambda initializes your function when you publish a function version. \nLambda takes a \u003Ca href=\"https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fopensource\u002Ffirecracker-open-source-secure-fast-microvm-serverless\u002F\">Firecracker microVM\u003C\u002Fa> \nsnapshot of the memory and disk state of the initialized execution environment, \nencrypts the snapshot, and caches it for low-latency access. When you invoke the function version for the first time, \nand as the invocations scale up, Lambda resumes new execution environments from the cached snapshot instead of \ninitializing them from scratch, improving startup latency.\u003C\u002Fp>\n\u003Cp>\u003Cimg src=\"\u002Fassets\u002Fexternal\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fassets\u002Fsnap_overview.png\" alt=\"SnapOverview\">\u003C\u002Fp>\n\u003Cp>A function version activated with SnapStart transitions to an \n\u003Ca href=\"https:\u002F\u002Fdocs.aws.amazon.com\u002Flambda\u002Flatest\u002Fdg\u002Ffunctions-states.html\">Inactive state\u003C\u002Fa> if it remains idle for 14 days, \nafter which Lambda deletes the snapshot. \nWhen this inactive Lambda is invoked, the invocation fails and Lambda begins initializing a new snapshot in the background, \nduring which the function version remains in \u003Ca href=\"https:\u002F\u002Fdocs.aws.amazon.com\u002Flambda\u002Flatest\u002Fdg\u002Ffunctions-states.html\">Pending state\u003C\u002Fa>. \nAfter the snapshot is complete, \nthe function version transitions to Active state, and then it is ready for invocation.\u003C\u002Fp>\n\u003Ch4>Activating SnapStart\u003C\u002Fh4>\n\u003Cp>As of this writing, SnapStart can be configured on any Lambda with Java 17 and Java 11 managed runtimes. \nSnapStart can be \u003Ca href=\"https:\u002F\u002Fdocs.aws.amazon.com\u002Flambda\u002Flatest\u002Fdg\u002Fsnapstart-activate.html\">activated on new and existing functions\u003C\u002Fa> \nusing the AWS Console, AWS CLI or AWS Lambda API. \u003C\u002Fp>\n\u003Cblockquote>\n\u003Cp>An important point to note while activating Lambda SnapStart is that when SnapStart is enabled,\nyou have to publish a new Lambda version before invoking and using SnapStart benefits.\nSnapStart can be used only on a published Lambda function version or alias that points to a version,\ninstead of the \u003Ccode>$latest\u003C\u002Fcode> version.\nIn order to avail the benefits of Lambda SnapStart,\nthe services that are invoking Lambda function have to point to\nthat version of Lambda function where SnapStart is enabled.\nFor example, an Amazon API Gateway endpoint has to point to the \nARN of the Lambda function which has the version at the end of the ARN or better,\nto a Lambda alias which points to that version of\nLambda function.\nYou can see how that is done in the Terraform example below.\u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Cp>You can also use AWS SAM and AWS CDK to enable SnapStart for a Lambda function.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>AWS SAM\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-yaml\">AWSTemplateFormatVersion: &#39;2010-09-09&#39;\nTransform: AWS::Serverless-2016-10-31\n\nResources:\n  HellowWorldFunction:\n    Type: AWS::Serverless::Function\n    Properties:\n      CodeUri: target\u002Fsample-app-aws.jar\n      Handler: com.example::handleRequest\n      Runtime: java17\n      Timeout: 30\n      MemorySize: 1024\n      AutoPublishAlias: live\n      SnapStart:\n        ApplyOn: PublishedVersions\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>AWS CDK\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-java\">Function.Builder.create(this, &quot;HelloFunction&quot;)\n  .runtime(Runtime.JAVA_17)\n  .code(Code.fromAsset(&quot;build\u002Flibs\u002Fsample-app-aws.jar&quot;))\n  .handler(&quot;example.Handler::handleRequest&quot;)\n  .snapStart(SnapStartConf.ON_PUBLISHED_VERSIONS)\n  .build();\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Cstrong>Terraform\u003C\u002Fstrong>\u003C\u002Fp>\n\u003Cp>For Terraform,\nyou have to explicitly create a Lambda alias that points to the Lambda version where SnapStart is enabled.\nThat way, an Amazon API Gateway endpoint can point to that Lambda alias.\nThe Terraform template code would look like the following:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-hcl\">resource &quot;aws_lambda_function&quot; &quot;UnicornStockBrokerFunction&quot; {\n  function_name = &quot;UnicornStockBrokerFunction&quot;\n  filename = var.SourceCodePath\n  handler = &quot;org.springframework.cloud.function.adapter.aws.FunctionInvoker::handleRequest&quot;\n  runtime = &quot;java11&quot;\n\n  environment {\n    variables = {\n      TABLE_NAME = aws_dynamodb_table.transactions_table.name\n      BUCKET_NAME = aws_s3_bucket.validationfiles-bucket.id\n      JAVA_TOOL_OPTIONS = &quot;-XX:+TieredCompilation -XX:TieredStopAtLevel=1&quot;\n    }\n  }\n\n  source_code_hash = filebase64sha256(var.SourceCodePath)\n  role = aws_iam_role.UnicornStockBrokerFunctionRole.arn\n\n  timeout     = &quot;200&quot;\n  memory_size = &quot;2048&quot;\n\n  # Enable SnapStart and apply on Published Versions\n  snap_start {\n    apply_on =&quot;PublishedVersions&quot;\n  }\n  publish = true\n}\n\n# Create an Alias pointing to the newly created Lambda version\nresource &quot;aws_lambda_alias&quot; &quot;UnicornStockBrokerFunction_SnapStartAlias&quot; {\n  name             = &quot;SnapStart&quot;\n  description      = &quot;Alias for SnapStart&quot;\n  function_name    = aws_lambda_function.UnicornStockBrokerFunction.function_name\n  function_version = aws_lambda_function.UnicornStockBrokerFunction.version\n}\n\nresource &quot;aws_api_gateway_integration&quot; &quot;createproduct-lambda&quot; {\n  rest_api_id = aws_api_gateway_rest_api.unicornstockbroker_apigw.id\n  resource_id = aws_api_gateway_method.createtransactions.resource_id\n  http_method = aws_api_gateway_method.createtransactions.http_method\n\n  integration_http_method = &quot;POST&quot;\n  type                    = &quot;AWS_PROXY&quot;\n\n  # Point API GW endpoint to the Lambda alias invoke ARN\n  uri = aws_lambda_alias.UnicornStockBrokerFunction_SnapStartAlias.invoke_arn\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Refer this \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-patterns\u002Fblob\u002Fmain\u002Fapigw-lambda-snapstart-terraform\u002Fstack.tf\">sample application\u003C\u002Fa> \nfor the full implementation.\u003C\u002Fp>\n\u003Ch4>Considerations\u003C\u002Fh4>\n\u003Cul>\n\u003Cli>\u003Cp>\u003Cstrong>Ephemeral Data:\u003C\u002Fstrong> \n  Due to a different lifecycle than traditional Lambda, there are some special considerations for SnapStart enabled \n  Lambda functions. With on-demand Lambda, sometimes it is optimal to initialize certain data in the init phase \n  so that it can be reused for future invocations. In SnapStart enabled Lambdas this data is stored along with the snapshot. \n  So ephemeral data (like database passwords, network connections) may not be valid when restored from a snapshot days or weeks later.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\u003Cp>\u003Cstrong>Uniqueness:\u003C\u002Fstrong> Another challenge with storing snapshots is if seeds used to generate random data are stored with a snapshot, \nthen randomness may not be guaranteed. AWS has changed managed runtimes to ensure uniqueness and \nrandomness when restoring functions. These updates have been incorporated in Amazon Linux 2. \nJava’s built-in random number generator \u003Ccode>java.security.SecureRandom\u003C\u002Fcode> also maintains uniqueness when resuming from a snapshot. \nIf you generate uniqueness via custom code then avoid caching data that is intended to be unique, \ninstead generate this data either inside the function handler or use runtime hooks described below.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\u003Cp>\u003Cstrong>Credential Provider Chain:\u003C\u002Fstrong> The AWS SDK searches for credentials in a \n\u003Ca href=\"https:\u002F\u002Fdocs.aws.amazon.com\u002Fsdk-for-java\u002Flatest\u002Fdeveloper-guide\u002Fcredentials-chain.html#credentials-default\">predetermined order\u003C\u002Fa>.\nHowever, SnapStart removes the environment variable provider, as the snapshot should not include environment variables,\nwhich will include temporary access\u002Fsecret keys in the environment.\nThis is to prevent temporary credentials from getting included in the snapshot.\nThe recommendation is to use either \u003Ccode>ContainerCredentialsProvider\u003C\u002Fcode> or the \u003Ccode>DefaultCredentialsProvider\u003C\u002Fcode>, \nwhich will search through that chain and land on the container credentials provider.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\u003Cp>\u003Cstrong>Support:\u003C\u002Fstrong> As of August 2024, Provisioned Concurrency is not supported by Lambda SnapStart. However, Lambda SnapStart is available for both x86_64 and Graviton2 processors (arm64).\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Cp>Refer to additional \u003Ca href=\"https:\u002F\u002Fdocs.aws.amazon.com\u002Flambda\u002Flatest\u002Fdg\u002Fsnapstart-best-practices.html\">best practices\u003C\u002Fa>\nfor working with Lambda SnapStart.\u003C\u002Fp>\n\u003Ch4>Runtime Hooks\u003C\u002Fh4>\n\u003Cp>Lambda SnapStart supports \u003Ca href=\"https:\u002F\u002Fdocs.aws.amazon.com\u002Flambda\u002Flatest\u002Fdg\u002Fsnapstart-runtime-hooks.html\">pre- and post-hooks\u003C\u002Fa> \nto allow developers a way to customize how the function reacts to snapshot creation and restore.\nThe Lambda Java managed runtime uses the open-source \u003Ca href=\"https:\u002F\u002Fopenjdk.org\u002Fprojects\u002Fcrac\u002F\">Coordinated Restore at Checkpoint\u003C\u002Fa> \n(CRaC) project to provide hook support. The managed Java runtime contains a customized CRaC context implementation that \ncalls your Lambda function’s runtime hooks before completing snapshot creation and after restoring \nthe execution environment from a snapshot.\u003C\u002Fp>\n\u003Cp>Here is an example of runtime hooks where DynamoDB \u003Ccode>describeTable()\u003C\u002Fcode> call is made to create a connection to DynamoDB\nbefore checkpointing:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-java\">import org.crac.Resource;\nimport org.crac.Core;\nimport org.crac.Context;\n\npublic class HelloWorldHandler implements RequestHandler&lt;APIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent&gt;, Resource {\n  private final ObjectMapper objectMapper = new ObjectMapper();\n  private static final String PRODUCT_TABLE_NAME = System.getenv(&quot;PRODUCT_TABLE_NAME&quot;);\n  \n  private final DynamoDbAsyncClient dynamoDbClient = DynamoDbAsyncClient.builder()\n    .credentialsProvider(DefaultCredentialsProvider.create())\n    .region(Region.of(System.getenv(SdkSystemSetting.AWS_REGION.environmentVariable())))\n    .httpClientBuilder(AwsCrtAsyncHttpClient.builder())\n    .build();\n\n  public HelloWorldHandler() {\n    Core.getGlobalContext().register(this);\n  }\n\n  public APIGatewayProxyResponseEvent handleRequest(String APIGatewayProxyRequestEvent, Context context) throws IOException {\n    \u002F\u002F Use DynamoDB client to put\u002Fget item after parsing incoming event\n    \u002F\u002F and return product as result\n\n    return new APIGatewayProxyResponseEvent()\n      .withStatusCode(200)\n      .withHeaders(Map.of(CONTENT_TYPE, &quot;application\u002Fjson&quot;))\n      .withBody(objectMapper.writeValueAsString(product));\n  }\n\n  @Override\n  public void beforeCheckpoint(Context&lt;? extends Resource&gt; context) throws Exception {\n    \u002F\u002F This code executes right before a checkpoint is created\n    System.out.println(&quot;Before Checkpoint&quot;);\n    \n    try {\n      dynamoDbClient.describeTable(DescribeTableRequest.builder()\n        .tableName(PRODUCT_TABLE_NAME)\n        .build()\n      ).get();\n    } catch (InterruptedException | ExecutionException e) {\n      logger.error(&quot;describeTable failed with message {}&quot;, e.getMessage());\n    }\n  }\n\n  @Override\n  public void afterRestore(Context&lt;? extends Resource&gt; context) throws Exception {\n    \u002F\u002F This code executes right after a Lambda is restored from a checkpoint, \n    \u002F\u002F and before it is ready to handle requests\n    System.out.println(&quot;After Restore&quot;);\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cblockquote>\n\u003Cp>Make sure the runtime hook method signature has \u003Ccode>throws Exception\u003C\u002Fcode> even if an IDE complains about an exception not\nbeing thrown. This helps in troubleshooting while looking at the Lambda function&#39;s execution logs. \u003C\u002Fp>\n\u003C\u002Fblockquote>\n\u003Ch4>Resource Priming\u003C\u002Fh4>\n\u003Cp>Due to the nature of how just in time (JIT) compilation of Java works, \nit is best to execute all possible code paths before a snapshot is taken to ensure that your Java application needs \nminimal JIT compilation upon first invocation. This process is called Priming and can be done by using before snapshot hook. \nFor example, if your function reads from DynamoDB, you can call a read operation in the \u003Ccode>beforeCheckpoint()\u003C\u002Fcode> hook thus \nensuring that AWS SDK for Java and any other libraries needed for this operation are compiled and saved with the snapshot. \nHowever, particular care should be taken to catch exceptions to not interrupt the snapshot process.\u003C\u002Fp>\n\u003Ch4>SnapStart Bug Scanner\u003C\u002Fh4>\n\u003Cp>It is also recommended that you use \u003Ca href=\"https:\u002F\u002Fgithub.com\u002Faws\u002Faws-lambda-snapstart-java-rules\">SnapStart Bug Scanner\u003C\u002Fa> \nthat can scan code for known anti-patterns with SnapStart.\u003C\u002Fp>\n\u003Ch4>Trying out Lambda SnapStart\u003C\u002Fh4>\n\u003Cp>You can try out Lambda SnapStart through the \npublicly available \u003Ca href=\"https:\u002F\u002Fcatalog.workshops.aws\u002Fjava-on-aws-lambda\u002Fen-US\">Java on AWS Lambda\u003C\u002Fa> workshop.\u003C\u002Fp>\n",{"title":6,"order":7,"youtubeVideoID":8,"authors":9,"callout":12,"resources":16},"Lambda Snapstart",6,"ZbnAithBNYY",[10,11],"Vipan Kumar","Dhiraj Mahapatro",{"title":13,"description":14,"link":15},"Watch this video","This serverless office hours session dives deeper into Lambda SnapStart.","https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=Y5b8_KToeDY",[17],{"link":18,"text":19,"type":20},"https:\u002F\u002Fwww.youtube.com\u002Fwatch?v=IIKe2dx9Ag0","Spring IO (Barcelona)","video","#### Cold Start Latency\n\nAs we saw in previous sections, there are a few steps in the Lambda invocation lifecycle. \nBefore Lambda can handle incoming requests, it spends time initializing the function, \nwhich includes creating an execution environment, loading the function's code, starting the runtime, and initializing the function code. \nThis is referred to as cold start time, which is often the largest contributor to startup latency. \nThis can cause degraded user experience for interactive workloads.\n\n![SnapStartInitDuration](\u002Fassets\u002Fexternal\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fassets\u002Fsnap_init_duration.png)\n\n#### What is Lambda SnapStart?\n[SnapStart for AWS Lambda](https:\u002F\u002Fdocs.aws.amazon.com\u002Flambda\u002Flatest\u002Fdg\u002Fsnapstart.html) helps improve startup performance by up to 10x at no extra cost. \nIt typically requires no changes to the function code, thus minimizing effort required by developers. \nWith SnapStart, Lambda initializes your function when you publish a function version. \nLambda takes a [Firecracker microVM](https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fopensource\u002Ffirecracker-open-source-secure-fast-microvm-serverless\u002F) \nsnapshot of the memory and disk state of the initialized execution environment, \nencrypts the snapshot, and caches it for low-latency access. When you invoke the function version for the first time, \nand as the invocations scale up, Lambda resumes new execution environments from the cached snapshot instead of \ninitializing them from scratch, improving startup latency.\n\n![SnapOverview](\u002Fassets\u002Fexternal\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fassets\u002Fsnap_overview.png)\n\nA function version activated with SnapStart transitions to an \n[Inactive state](https:\u002F\u002Fdocs.aws.amazon.com\u002Flambda\u002Flatest\u002Fdg\u002Ffunctions-states.html) if it remains idle for 14 days, \nafter which Lambda deletes the snapshot. \nWhen this inactive Lambda is invoked, the invocation fails and Lambda begins initializing a new snapshot in the background, \nduring which the function version remains in [Pending state](https:\u002F\u002Fdocs.aws.amazon.com\u002Flambda\u002Flatest\u002Fdg\u002Ffunctions-states.html). \nAfter the snapshot is complete, \nthe function version transitions to Active state, and then it is ready for invocation.\n\n#### Activating SnapStart\nAs of this writing, SnapStart can be configured on any Lambda with Java 17 and Java 11 managed runtimes. \nSnapStart can be [activated on new and existing functions](https:\u002F\u002Fdocs.aws.amazon.com\u002Flambda\u002Flatest\u002Fdg\u002Fsnapstart-activate.html) \nusing the AWS Console, AWS CLI or AWS Lambda API. \n\n> An important point to note while activating Lambda SnapStart is that when SnapStart is enabled,\n> you have to publish a new Lambda version before invoking and using SnapStart benefits.\n> SnapStart can be used only on a published Lambda function version or alias that points to a version,\n> instead of the `$latest` version.\n> In order to avail the benefits of Lambda SnapStart,\n> the services that are invoking Lambda function have to point to\n> that version of Lambda function where SnapStart is enabled.\n> For example, an Amazon API Gateway endpoint has to point to the \n> ARN of the Lambda function which has the version at the end of the ARN or better,\n> to a Lambda alias which points to that version of\n> Lambda function.\n> You can see how that is done in the Terraform example below.\n\nYou can also use AWS SAM and AWS CDK to enable SnapStart for a Lambda function.\n\n**AWS SAM**\n\n```yaml\nAWSTemplateFormatVersion: '2010-09-09'\nTransform: AWS::Serverless-2016-10-31\n\nResources:\n  HellowWorldFunction:\n    Type: AWS::Serverless::Function\n    Properties:\n      CodeUri: target\u002Fsample-app-aws.jar\n      Handler: com.example::handleRequest\n      Runtime: java17\n      Timeout: 30\n      MemorySize: 1024\n      AutoPublishAlias: live\n      SnapStart:\n        ApplyOn: PublishedVersions\n```\n\n**AWS CDK**\n\n```java\nFunction.Builder.create(this, \"HelloFunction\")\n  .runtime(Runtime.JAVA_17)\n  .code(Code.fromAsset(\"build\u002Flibs\u002Fsample-app-aws.jar\"))\n  .handler(\"example.Handler::handleRequest\")\n  .snapStart(SnapStartConf.ON_PUBLISHED_VERSIONS)\n  .build();\n```\n\n**Terraform**\n\nFor Terraform,\nyou have to explicitly create a Lambda alias that points to the Lambda version where SnapStart is enabled.\nThat way, an Amazon API Gateway endpoint can point to that Lambda alias.\nThe Terraform template code would look like the following:\n\n```hcl\nresource \"aws_lambda_function\" \"UnicornStockBrokerFunction\" {\n  function_name = \"UnicornStockBrokerFunction\"\n  filename = var.SourceCodePath\n  handler = \"org.springframework.cloud.function.adapter.aws.FunctionInvoker::handleRequest\"\n  runtime = \"java11\"\n\n  environment {\n    variables = {\n      TABLE_NAME = aws_dynamodb_table.transactions_table.name\n      BUCKET_NAME = aws_s3_bucket.validationfiles-bucket.id\n      JAVA_TOOL_OPTIONS = \"-XX:+TieredCompilation -XX:TieredStopAtLevel=1\"\n    }\n  }\n\n  source_code_hash = filebase64sha256(var.SourceCodePath)\n  role = aws_iam_role.UnicornStockBrokerFunctionRole.arn\n\n  timeout     = \"200\"\n  memory_size = \"2048\"\n\n  # Enable SnapStart and apply on Published Versions\n  snap_start {\n    apply_on =\"PublishedVersions\"\n  }\n  publish = true\n}\n\n# Create an Alias pointing to the newly created Lambda version\nresource \"aws_lambda_alias\" \"UnicornStockBrokerFunction_SnapStartAlias\" {\n  name             = \"SnapStart\"\n  description      = \"Alias for SnapStart\"\n  function_name    = aws_lambda_function.UnicornStockBrokerFunction.function_name\n  function_version = aws_lambda_function.UnicornStockBrokerFunction.version\n}\n\nresource \"aws_api_gateway_integration\" \"createproduct-lambda\" {\n  rest_api_id = aws_api_gateway_rest_api.unicornstockbroker_apigw.id\n  resource_id = aws_api_gateway_method.createtransactions.resource_id\n  http_method = aws_api_gateway_method.createtransactions.http_method\n\n  integration_http_method = \"POST\"\n  type                    = \"AWS_PROXY\"\n\n  # Point API GW endpoint to the Lambda alias invoke ARN\n  uri = aws_lambda_alias.UnicornStockBrokerFunction_SnapStartAlias.invoke_arn\n}\n```\n\nRefer this [sample application](https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-patterns\u002Fblob\u002Fmain\u002Fapigw-lambda-snapstart-terraform\u002Fstack.tf) \nfor the full implementation.\n\n#### Considerations\n\n- **Ephemeral Data:** \n    Due to a different lifecycle than traditional Lambda, there are some special considerations for SnapStart enabled \n    Lambda functions. With on-demand Lambda, sometimes it is optimal to initialize certain data in the init phase \n    so that it can be reused for future invocations. In SnapStart enabled Lambdas this data is stored along with the snapshot. \n    So ephemeral data (like database passwords, network connections) may not be valid when restored from a snapshot days or weeks later.\n\n- **Uniqueness:** Another challenge with storing snapshots is if seeds used to generate random data are stored with a snapshot, \n  then randomness may not be guaranteed. AWS has changed managed runtimes to ensure uniqueness and \n  randomness when restoring functions. These updates have been incorporated in Amazon Linux 2. \n  Java’s built-in random number generator `java.security.SecureRandom` also maintains uniqueness when resuming from a snapshot. \n  If you generate uniqueness via custom code then avoid caching data that is intended to be unique, \n  instead generate this data either inside the function handler or use runtime hooks described below.\n\n- **Credential Provider Chain:** The AWS SDK searches for credentials in a \n  [predetermined order](https:\u002F\u002Fdocs.aws.amazon.com\u002Fsdk-for-java\u002Flatest\u002Fdeveloper-guide\u002Fcredentials-chain.html#credentials-default).\n  However, SnapStart removes the environment variable provider, as the snapshot should not include environment variables,\n  which will include temporary access\u002Fsecret keys in the environment.\n  This is to prevent temporary credentials from getting included in the snapshot.\n  The recommendation is to use either `ContainerCredentialsProvider` or the `DefaultCredentialsProvider`, \n  which will search through that chain and land on the container credentials provider.\n\n- **Support:** As of August 2024, Provisioned Concurrency is not supported by Lambda SnapStart. However, Lambda SnapStart is available for both x86_64 and Graviton2 processors (arm64).\n\nRefer to additional [best practices](https:\u002F\u002Fdocs.aws.amazon.com\u002Flambda\u002Flatest\u002Fdg\u002Fsnapstart-best-practices.html)\nfor working with Lambda SnapStart.\n\n#### Runtime Hooks\nLambda SnapStart supports [pre- and post-hooks](https:\u002F\u002Fdocs.aws.amazon.com\u002Flambda\u002Flatest\u002Fdg\u002Fsnapstart-runtime-hooks.html) \nto allow developers a way to customize how the function reacts to snapshot creation and restore.\nThe Lambda Java managed runtime uses the open-source [Coordinated Restore at Checkpoint](https:\u002F\u002Fopenjdk.org\u002Fprojects\u002Fcrac\u002F) \n(CRaC) project to provide hook support. The managed Java runtime contains a customized CRaC context implementation that \ncalls your Lambda function’s runtime hooks before completing snapshot creation and after restoring \nthe execution environment from a snapshot.\n\nHere is an example of runtime hooks where DynamoDB `describeTable()` call is made to create a connection to DynamoDB\nbefore checkpointing:\n\n```java\nimport org.crac.Resource;\nimport org.crac.Core;\nimport org.crac.Context;\n\npublic class HelloWorldHandler implements RequestHandler\u003CAPIGatewayProxyRequestEvent, APIGatewayProxyResponseEvent>, Resource {\n  private final ObjectMapper objectMapper = new ObjectMapper();\n  private static final String PRODUCT_TABLE_NAME = System.getenv(\"PRODUCT_TABLE_NAME\");\n  \n  private final DynamoDbAsyncClient dynamoDbClient = DynamoDbAsyncClient.builder()\n    .credentialsProvider(DefaultCredentialsProvider.create())\n    .region(Region.of(System.getenv(SdkSystemSetting.AWS_REGION.environmentVariable())))\n    .httpClientBuilder(AwsCrtAsyncHttpClient.builder())\n    .build();\n\n  public HelloWorldHandler() {\n    Core.getGlobalContext().register(this);\n  }\n\n  public APIGatewayProxyResponseEvent handleRequest(String APIGatewayProxyRequestEvent, Context context) throws IOException {\n    \u002F\u002F Use DynamoDB client to put\u002Fget item after parsing incoming event\n    \u002F\u002F and return product as result\n\n    return new APIGatewayProxyResponseEvent()\n      .withStatusCode(200)\n      .withHeaders(Map.of(CONTENT_TYPE, \"application\u002Fjson\"))\n      .withBody(objectMapper.writeValueAsString(product));\n  }\n\n  @Override\n  public void beforeCheckpoint(Context\u003C? extends Resource> context) throws Exception {\n    \u002F\u002F This code executes right before a checkpoint is created\n    System.out.println(\"Before Checkpoint\");\n    \n    try {\n      dynamoDbClient.describeTable(DescribeTableRequest.builder()\n        .tableName(PRODUCT_TABLE_NAME)\n        .build()\n      ).get();\n    } catch (InterruptedException | ExecutionException e) {\n      logger.error(\"describeTable failed with message {}\", e.getMessage());\n    }\n  }\n\n  @Override\n  public void afterRestore(Context\u003C? extends Resource> context) throws Exception {\n    \u002F\u002F This code executes right after a Lambda is restored from a checkpoint, \n    \u002F\u002F and before it is ready to handle requests\n    System.out.println(\"After Restore\");\n  }\n}\n```\n\n> Make sure the runtime hook method signature has `throws Exception` even if an IDE complains about an exception not\n> being thrown. This helps in troubleshooting while looking at the Lambda function's execution logs. \n\n#### Resource Priming\nDue to the nature of how just in time (JIT) compilation of Java works, \nit is best to execute all possible code paths before a snapshot is taken to ensure that your Java application needs \nminimal JIT compilation upon first invocation. This process is called Priming and can be done by using before snapshot hook. \nFor example, if your function reads from DynamoDB, you can call a read operation in the `beforeCheckpoint()` hook thus \nensuring that AWS SDK for Java and any other libraries needed for this operation are compiled and saved with the snapshot. \nHowever, particular care should be taken to catch exceptions to not interrupt the snapshot process.\n\n#### SnapStart Bug Scanner\nIt is also recommended that you use [SnapStart Bug Scanner](https:\u002F\u002Fgithub.com\u002Faws\u002Faws-lambda-snapstart-java-rules) \nthat can scan code for known anti-patterns with SnapStart.\n\n#### Trying out Lambda SnapStart\nYou can try out Lambda SnapStart through the \npublicly available [Java on AWS Lambda](https:\u002F\u002Fcatalog.workshops.aws\u002Fjava-on-aws-lambda\u002Fen-US) workshop.\n",[23,42,68,188,241,298,314,353,375],{"title":24,"collapsible":25,"isCollapsed":26,"content":27},"Introduction",false,true,[28],{"title":29,"order":30,"authors":31,"callout":32,"prerequisite":35,"time":38,"path":39,"id":40,"link":41},"Getting Started",1,[11],{"title":13,"description":33,"link":34},"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":25,"isCollapsed":26,"content":44},"History",[45,53,60],{"title":46,"order":47,"authors":48,"time":49,"path":50,"id":51,"link":52},"Evolution of Java",3,[11],"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,[11],"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,[11,64],"Maximilian Schellhorn","challenge","challenge.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fchallenge",{"title":69,"collapsible":25,"isCollapsed":25,"content":70},"Best Practices",[71,80,90,96,113,130,148,164,178],{"title":6,"order":7,"youtubeVideoID":8,"authors":72,"callout":73,"resources":74,"time":76,"path":77,"id":78,"link":79},[10,11],{"title":13,"description":14,"link":15},[75],{"link":18,"text":19,"type":20},"8 min","snapstart","snapstart.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fsnapstart",{"title":81,"order":7,"authors":82,"callout":83,"time":49,"path":87,"id":88,"link":89},"Tiered Compilation",[10],{"title":84,"description":85,"link":86},"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":91,"order":7,"authors":92,"time":49,"path":93,"id":94,"link":95},"Utilize initialization phase",[11],"init-heavy-lifting","init-heavy-lifting.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Finit-heavy-lifting",{"title":97,"order":7,"authors":98,"youtubeVideoID":100,"resources":101,"time":109,"path":110,"id":111,"link":112},"Using RDS Proxy",[99,11],"Sonali Jena","ZQOqmMn_8jw",[102,106],{"link":103,"text":104,"type":105},"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":107,"type":105,"text":108},"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":114,"order":7,"authors":115,"callout":116,"prerequisite":120,"resources":122,"time":38,"path":127,"id":128,"link":129},"Choice of HTTP Clients",[10,11],{"title":117,"description":118,"link":119},"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",[121],"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.",[123],{"link":124,"type":125,"text":126},"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":131,"order":7,"authors":132,"youtubeVideoID":133,"resources":134,"time":109,"path":145,"id":146,"link":147},"Hexagonal Architecture",[10],"kRFg6fkVChQ",[135,139,142],{"link":136,"text":137,"type":138},"https:\u002F\u002Fdocs.aws.amazon.com\u002Fprescriptive-guidance\u002Flatest\u002Fhexagonal-architectures\u002Fwelcome.html","Hexagonal architecture","guidance",{"link":140,"text":141,"type":125},"https:\u002F\u002Faws.amazon.com\u002Fblogs\u002Fcompute\u002Fdeveloping-portable-aws-lambda-functions\u002F","Portable Lambda functions",{"link":143,"type":125,"text":144},"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":149,"order":7,"authors":150,"youtubeVideoID":152,"resources":153,"time":38,"path":161,"id":162,"link":163},"Powertools for AWS Lambda",[151],"Lavanya Tangutur","dH2GP6Lydj8",[154,158],{"link":155,"text":156,"type":157},"https:\u002F\u002Fgithub.com\u002Faws-powertools\u002Fpowertools-lambda-java","Powertools for AWS Lambda (Java)","github",{"link":159,"type":125,"text":160},"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":165,"order":7,"authors":166,"youtubeVideoID":167,"callout":168,"resources":172,"time":49,"path":175,"id":176,"link":177},"Lambda Power tuning ",[151,11],"z8wGSykEauI",{"title":169,"description":170,"link":171},"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",[173,174],{"link":103,"text":104,"type":105},{"link":107,"type":105,"text":108},"powertuning","powertuning.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fpowertuning",{"title":179,"order":7,"authors":180,"resources":181,"time":38,"path":185,"id":186,"link":187},"Using Graviton2",[11],[182],{"link":183,"text":184,"type":125},"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":189,"collapsible":25,"isCollapsed":26,"content":190},"Java frameworks",[191,206,215,231],{"title":192,"order":193,"authors":194,"resources":195,"time":38,"path":203,"id":204,"link":205},"Micronaut",7,[151,11],[196,200],{"link":197,"text":198,"type":199},"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-java-frameworks-samples\u002Ftree\u002Fmain","Serverless Java Frameworks","GitHub",{"link":201,"text":202,"type":199},"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":207,"order":193,"authors":208,"resources":209,"time":38,"path":212,"id":213,"link":214},"Quarkus",[151,11],[210],{"link":197,"text":211,"type":199},"Quarkus sample application","quarkus","quarkus.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fquarkus",{"title":216,"order":193,"authors":217,"resources":218,"time":109,"path":228,"id":229,"link":230},"Spring",[151,64],[219,220,224],{"link":197,"text":211,"type":199},{"link":221,"text":222,"type":223},"https:\u002F\u002Fcatalog.workshops.aws\u002Fjava-on-aws-lambda\u002Fen-US","Java on AWS Lambda","workshop",{"link":225,"text":226,"type":227},"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":232,"order":193,"authors":233,"resources":234,"time":38,"path":238,"id":239,"link":240},"GraalVM Native Image",[151,11],[235,237],{"link":197,"text":236,"type":199},"GraalVM sample application",{"link":221,"text":222,"type":223},"graalvm","graalvm.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fgraalvm",{"title":242,"collapsible":25,"isCollapsed":26,"content":243},"Testing a Java application",[244,261,270,280,289],{"title":245,"order":246,"authors":247,"callout":249,"resources":253,"time":257,"path":258,"id":259,"link":260},"Testing Serverless",8,[248],"Lorenzo Micheli",{"title":250,"description":251,"link":252},"Read the Serverless testing guide","This guide dives deeper into Serverless testing","https:\u002F\u002Fserverlessland.com\u002Ftesting",[254],{"link":255,"text":256,"type":199},"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":262,"order":246,"authors":263,"callout":264,"resources":265,"time":109,"path":267,"id":268,"link":269},"Unit Testing",[248],{"title":250,"description":251,"link":252},[266],{"link":255,"text":256,"type":199},"unit","unit.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Funit",{"title":271,"order":246,"authors":272,"callout":273,"resources":274,"time":276,"path":277,"id":278,"link":279},"Integration Testing",[248,11],{"title":250,"description":251,"link":252},[275],{"link":255,"text":256,"type":199},"5 min","integration","integration.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fintegration",{"title":281,"order":246,"authors":282,"callout":283,"resources":284,"time":257,"path":286,"id":287,"link":288},"Functional Testing",[248,11],{"title":250,"description":251,"link":252},[285],{"link":255,"text":256,"type":199},"functional","functional.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Ffunctional",{"title":290,"order":246,"authors":291,"callout":292,"resources":293,"time":38,"path":295,"id":296,"link":297},"Load Testing",[11],{"title":250,"description":251,"link":252},[294],{"link":255,"text":256,"type":199},"load","load.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fload",{"title":299,"collapsible":25,"isCollapsed":26,"content":300},"Local Development",[301,308],{"title":302,"order":303,"authors":304,"time":49,"path":305,"id":306,"link":307},"IntelliJ",10,[11],"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",[11],"vscode","vscode.md","\u002Fcontent\u002Fservice\u002Flambda\u002Fguides\u002Feffectively-running-java-on-serverless\u002Fvscode",{"title":315,"collapsible":25,"isCollapsed":26,"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,[99],"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",[99],"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",[99],[334],{"link":335,"text":336,"type":125},"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",[11],[344,347],{"link":345,"type":199,"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":105},"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":25,"isCollapsed":26,"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",[11],[362,364,366,369],{"link":363,"text":222,"type":223},"https:\u002F\u002Fcatalog.workshops.aws\u002Fjava-on-aws-lambda\u002Fen-US\u002F01-migration\u002F02-optimizations\u002Fbenchmark",{"link":197,"text":365,"type":199},"Benchmark: Micronaut, Quarkus, and SpringBoot",{"link":367,"text":368,"type":199},"https:\u002F\u002Fgithub.com\u002Faws-samples\u002Fserverless-graalvm-demo","GraalVM native image on AWS Lambda Benchmarking",{"link":370,"text":371,"type":199},"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":25,"isCollapsed":26,"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,[11],"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":221,"text":222,"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",1792578873998]