Jack_Old
Jack_Old

Reputation: 13

Phone book search on AWS Lambda and S3

I want to make a serverless application in AWS Lambda for phone book searches.

What I've done:

  1. Created a bucket and uploaded a CSV file to it.
  2. Created a role with full access to the bucket.
  3. Created a Lambda function
  4. Created API Gateway with GET and POST methods

The Lambda function contains the following code:

import boto3
import json

s3 = boto3.client('s3')

resp = s3.select_object_content(
    Bucket='namebbacket',
    Key='sample_data.csv',
    ExpressionType='SQL',
    Expression="SELECT * FROM s3object s where s.\"Name\" = 'Jane'",
    InputSerialization = {'CSV': {"FileHeaderInfo": "Use"}, 'CompressionType': 'NONE'},
    OutputSerialization = {'CSV': {}},
)

for event in resp['Payload']:
    if 'Records' in event:
        records = event['Records']['Payload'].decode('utf-8')
        print(records)
    elif 'Stats' in event:
        statsDetails = event['Stats']['Details']
        print("Stats details bytesScanned: ")
        print(statsDetails['BytesScanned'])
        print("Stats details bytesProcessed: ")
        print(statsDetails['BytesProcessed'])
        print("Stats details bytesReturned: ")
        print(statsDetails['BytesReturned'])

When I access the Invoke URL, I get the following error:

{errorMessage = Handler 'lambda_handler' missing on module 'lambda_function', errorType = Runtime.HandlerNotFound}

CSV structure: Name, PhoneNumber, City, Occupation

How to solve this problem?

Upvotes: 0

Views: 171

Answers (2)

Zerodf
Zerodf

Reputation: 2298

Wecome to S.O. @smac2020 links you to the right place AWS Lambda function handler in Python. In short, AWS Lambda needs to know where to find your code, hence the "handler". Though a better way to think about it might be "entry-point."

Here is a close approximation of your function, refactored for use on AWS Lambda:

import json
import boto3


def function_to_be_called(event, context):
    # TODO implement
    s3 = boto3.client('s3')
    
    resp = s3.select_object_content(
        Bucket='stack-exchange',
        Key='48836509/dogs.csv',
        ExpressionType='SQL',
        Expression="SELECT * FROM s3object s where s.\"breen_name\" = 'pug'",
        InputSerialization = {'CSV': {"FileHeaderInfo": "Use"}, 'CompressionType': 'NONE'},
        OutputSerialization = {'CSV': {}},
    )
    
    for event in resp['Payload']:
        if 'Records' in event:
            records = event['Records']['Payload'].decode('utf-8')
    
    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Lambda!'),
        'pugInfo': records
    }

This function produces the following result:

Response
{
  "statusCode": 200,
  "body": "\"Hello from Lambda!\"",
  "currentWorkdingDirectory": "/var/task",
  "currentdirlist": [
    "lambda_function.py"
  ],
  "pugInfo": "1,pug,toy\r\n"
}

The "entry point" for this function is in a Python file called lambda_function.py and the function function_to_be_called. Together these are the "handler." We can see this in the Console:

enter image description here

or using the API through Boto3

import boto3
awslambda = boto3.client('lambda')
awslambda.get_function_configuration('s3SelectFunction')

Which returns:

{'CodeSha256': 'mFVVlakisUIIsLstQsJUpeBIeww4QhJjl7wJaXqsJ+Q=',
 'CodeSize': 565,
 'Description': '',
 'FunctionArn': 'arn:aws:lambda:us-east-1:***********:function:s3SelectFunction',
 'FunctionName': 's3SelectFunction',
 'Handler': 'lambda_function.function_to_be_called',
 'LastModified': '2021-03-10T00:57:48.651+0000',
 'MemorySize': 128,
 'ResponseMetadata': ...
 'Version': '$LATEST'}

Upvotes: 0

smac2020
smac2020

Reputation: 10724

Please refer to this documentation topic to learn how to write a Lambda function in Python. You are missing the Handler. See: AWS Lambda function handler in Python

Upvotes: 1

Related Questions