Easy methods to Optimize Your Lambda Code



This code labored nicely in our checks and was permitted within the code assessment course of. It returns True when there are two information with the suitable prefixes, and it returns False when there isn’t. Easy sufficient.

That wasn’t what occurred in actual life, nonetheless. It might nonetheless work within the situation the place the suitable information are there, however it will, solely generally, return True when simply one of many information have been there. And this was irritating as a result of it was occurring in manufacturing and solely generally. Nothing is extra annoying than “generally.”

Let’s determine this out

Don’t do that at residence children, however the first concept that got here to thoughts to troubleshoot the issue was to edit the Perform code and add a “print(information)” between the 2 “for” loops. This manner I might be capable to test the information array content material earlier than looping via all its contents. Then I checked the bucket and noticed that there was only one file there, with the suitable prefix. Immediately I executed the code and in that line the code printed precisely what I hoped for, array had solely the suitable merchandise, and it returned False, as anticipated as nicely.

I used to be confused. I ran the code once more, simply because I used to be out of concepts. To my shock, the code returned True this time. I used to be twice as confused as earlier than. That print output now confirmed the suitable file there… twice! There have been 2 objects with the identical key in the identical bucket, which we all know is unimaginable. Immediately I went to test if versioning was enabled on stated bucket, perhaps that was the difficulty. But it surely wasn’t. Versioning was off. I ran the code once more, and as soon as once more, it returned False and printed the filename simply as soon as.
Feeling extra misplaced than I already was at first of all this, I ended, took a deep breath, and tried another time. First execution, False with printing the file title as soon as. Second, returned True printing the file title twice. Third, returned False, printing the filename thrice. Clearly there was one thing flawed with this information variable.

What I acquired flawed

Any newbie developer is aware of the idea of Scope, even when the title isn’t identified. For many who don’t, Scope may be outlined as a variable that’s declared is barely accessible contained in the area it’s created. If we return to our code, we will see that the variable information are declared within the world scope (within the perform root, outdoors of any perform/methodology). I moved this declaration to contained in the lambda_handler perform scope (proper earlier than the counter declaration) and it labored! An execution would methods return False and print the filename simply as soon as given my bucket content material. So, what occurred?

We are inclined to oversimplify all the things for our personal sake. In Lambda’s case, why would we overthink how the method behind operating our code works if within the basic case, “it simply works?” This was one of many instances that understanding the (fascinating) course of was useful, and it may be to you too.

The way it really works

The Lambda execution atmosphere lifecycle has three distinct phases: Init, Invoke and Shutdown, that are outlined by AWS as:

  • Init: Lambda creates or unfreezes an execution atmosphere with the configured assets, downloads the code for the perform and all layers, initializes any extensions, initializes the runtime, after which runs the perform’s initialization code (the code outdoors the primary handler.) The Init section occurs both throughout the first invocation, or prematurely of perform invocations when you’ve got enabled provisioned concurrency.
  • Invoke: Lambda invokes the perform handler. After the perform runs to completion, Lambda prepares to deal with one other perform invocation.
  • Shutdown: This section is triggered if the Lambda perform doesn’t obtain any invocations for a time frame. Within the Shutdown section, Lambda shuts down the runtime, alerts the extensions to allow them to cease cleanly, after which removes the atmosphere. Lambda sends a Shutdown occasion to every extension, which tells the extension that the atmosphere is about to be shut down.

Unsurprisingly, the documentation shoves in my face what we have been getting flawed all alongside: code within the world scope is executed as soon as within the Init course of. An execution atmosphere is barely shutdown if it doesn’t obtain invocations for a time frame. Whereas there are executions to be processed, the identical initiated execution atmosphere shall be reused throughout executions.

How one can capitalize from my mistake

On high of now figuring out you don’t need to declare variables which can be intent to be distinctive between executions globally, there may be an excellent larger method to capitalize on this story. As dangerous as it’s to declare such variables, it’s a nice apply to declare constants, or variables which can be reused amongst executions to save lots of you on each execution money and time.

As an example, let’s say you may have a code that connects to a database to question buyer knowledge. You might write it as seen under: