0
votes

I am trying to output an event called sheetID in a AWS Lambda Python function, but can't seem to get the syntax right.

Here is a code snippet:


def lambda_handler(event, context):
    scraper = Scraper()
    scraper.run()
    return { "Message": "Scrape function ran correctly!" }

class Scraper():
    def __init__(self):
        log.debug("Starting scraper...")
        scope = ['https://spreadsheets.google.com/feeds', 'https://www.googleapis.com/auth/drive']
        credentials = sac.from_json_keyfile_name('src/h9d7246486f2.json', scope)

        log.debug("Authorizing gspread...")
        self.gc = gspread.authorize(credentials)
        self.spreadsheet = self.gc.open_by_key(event['sheetID'])
...

This is the line with the issue:

self.spreadsheet = self.gc.open_by_key(event['sheetID'])

which previously had a static Google Sheet name

self.spreadsheet = self.gc.open("CorStats")

A test Lambda function works fine with event data, but not sure whether the format part can or should be used in the function above.

def my_handler(event, context):
    message = 'Hello {} {}!'.format(event['key1'], 
                                    event['key3'])  
    return { 
        'message' : message
    }  

Here is the error log:

{
  "errorMessage": "name 'event' is not defined",
  "errorType": "NameError",
  "stackTrace": [
    [
      "/var/task/src/scrape_lambda.py",
      18,
      "lambda_handler",
      "scraper = Scraper()"
    ],
    [
      "/var/task/src/scrape_lambda.py",
      30,
      "__init__",
      "self.spreadsheet = self.gc.open_by_key(event['sheetID'])"
    ]
  ]
}
1
can you share the error message you're receiving?maafk
@maafk Error log added. Thankssigur7

1 Answers

1
votes

You need include event in the __init__ method, e.g. def __init__(self, event):, then instantiate it with scraper = Scraper(event).

It might be cleaner to do def __init__(self, sheet_id), then do scraper = Scraper(event['sheetID')) and self.spreadsheet = self.gc.open_by_key(sheet_id). This way, you have uncoupled the Scraper class from the lambda event and can test it separately.