In rough order of effort-to-payoff:
- Shrink the bundle. Cold start scales with how much code has to be loaded and parsed. Bundle with esbuild, tree-shake, and stop importing the entire AWS SDK when you need one client.
- Move work out of the handler. Anything at module scope runs once per container, not once per invocation — put client construction there.
- Do not open a VPC connection you don't need. VPC-attached Lambdas used to be the worst offender; it is much better now, but still non-zero.
- Provisioned concurrency, only after the above. It works, and you pay for it whether or not traffic arrives.
Rewriting in Go is real but it is the largest change for a gain you may not need once the bundle is 2MB instead of 40MB.