If you run several lamdbas in parallel thee context is not reused. So you need to download the file in all lambdas. For storing files use /tmp/. It has a limit of 512MB.
However, if you run a lamdba after another one, the context probably will be reused and therefore the file will exist. Keep in mind cold boot.
Extracted from AWS Lamdba DOC.
After a Lambda function is executed, AWS Lambda maintains the
execution context for some time in anticipation of another Lambda
function invocation. In effect, the service freezes the execution
context after a Lambda function completes, and thaws the context for
reuse, if AWS Lambda chooses to reuse the context when the Lambda
function is invoked again. This execution context reuse approach has
the following implications:
- Objects declared outside of the function's handler method remain initialized, providing additional optimization when the function is
invoked again. For example, if your Lambda function establishes a
database connection, instead of reestablishing the connection, the
original connection is used in subsequent invocations. We suggest
adding logic in your code to check if a connection exists before
creating one.
Each execution context provides 512 MB of additional disk space in the /tmp directory. The directory content remains when the
execution context is frozen, providing transient cache that can be
used for multiple invocations. You can add extra code to check if
the cache has the data that you stored. For information on
deployment limits, see AWS Lambda Limits.
Background processes or callbacks initiated by your Lambda function that did not complete when the function ended resume if
AWS Lambda chooses to reuse the execution context. You should make
sure any background processes or callbacks in your code are
complete before the code exits.
Example code for downloading an obejct from S3:
AmazonS3 s3client = AmazonS3ClientBuilder
.standard()
.withRegion(Regions.EU_WEST_1)
.build();
//S3 download file
GetObjectRequest getObjectRequest = new GetObjectRequest(System.getenv("bucket"), "key");
s3client.getObject(getObjectRequest, new File("/tmp/example.png"));
EDIT 1:
Lambdas and Serverless in general is not recommended for apps that need to maintain the state between different invocations.