AWS Lambda read contents of file in zip uploaded as source code

Question:

I have two files:

MyLambdaFunction.py

config.json

I zip those two together to create MyLambdaFunction.zip. I then upload that through the AWS console to my lambda function.

The contents of config.json are various environmental variables. I need a way to read the contents of the file each time the lambda function runs, and then use the data inside to set run time variables.

How do I get my Python Lambda function to read the contents of a file, config.json, that was uploaded in the zip file with the source code?

Asked By: Scott Decker

||

Answers:

Try this. The file you uploaded can be accessed like:

import os

os.environ['LAMBDA_TASK_ROOT']/config.json
Answered By: helloV

Figured it out with the push in the right direction from @helloV.

At the top of the python file put import os

Inside your function handler put the following:

configPath = os.environ['LAMBDA_TASK_ROOT'] + "/config.json"
print("Looking for config.json at " + configPath)
configContents = open(configPath).read()
configJson = json.loads(configContents)
environment = configJson['environment']
print("Environment: " + environment)

That bit right there, line by line, does the following:

  • Get the path where the config.json file is stored
  • Print that path for viewing in CloudWatch logs
  • Open the file stored at that path, read the contents
  • Load the contents to a json object for easy navigating
  • Grab the value of one of the variables stored in the json
  • Print that for viewing in the CloudWatch logs

Here is what the config.json looks like:

{
    "environment":"dev"
}

EDIT
AWS lambda now supports use of environmental variables directly in the console UI. So if your use case is the same as mine (i.e. for a config file) you no longer need a config file.

Answered By: Scott Decker

Actually, I’d rather prefer judging the context of the running lambda to determine the config it should use, instead of uploading different zip files, which is difficult to maintain.

lambda_configs = {
    "function_name_1":{
    },
    "function_name_2":
   {
   }
}

config = lambda_configs[context.function_name]
Answered By: Menglong Li

Just done it in python3.8 lambda with simple:

with open('./dir/file.whatever') as f:

And it works just fine.

Answered By: wtdmn
import os


os.environ['LAMBDA_TASK_ROOT'] + '/config.json'

or you can use formatting

f"{os.environ['LAMBDA_TASK_ROOT']}/config.json"
Answered By: Ashok