Scott Decker
Scott Decker

Reputation: 4307

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

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?

Upvotes: 20

Views: 22858

Answers (5)

Ashok
Ashok

Reputation: 49

import os


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

or you can use formatting

f"{os.environ['LAMBDA_TASK_ROOT']}/config.json"

Upvotes: 0

wtdmn
wtdmn

Reputation: 128

Just done it in python3.8 lambda with simple:

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

And it works just fine.

Upvotes: 1

Scott Decker
Scott Decker

Reputation: 4307

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.

Upvotes: 24

Menglong Li
Menglong Li

Reputation: 2255

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]

Upvotes: 1

helloV
helloV

Reputation: 52443

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

import os

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

Upvotes: 3

Related Questions