0 votes
1 view
in AWS by (19.2k points)

I have the following lambda function code for simply printing out the Author and metadata of an uploaded event of an S3 bucket: 

from __future__ import print_function

import json

import urllib

import boto3

 

print('Loading function')

 

s3 = boto3.client('s3')

 

 

def lambda_handler(event, context):

 

    #print("Received event: " + json.dumps(event, indent=2))

    # bucket = event['Records'][0]['s3']['bucket']['name']

 

    for record in event['Records']:

        bucket = record[0]['s3']['bucket']['name']

        key = record[0]['s3']['object']['key']

        response = s3.head_object(Bucket=bucket, Key=key)

 

        logger.info('Response: {}'.format(response))

 

        print("Author : " + response['Metadata']['author'])

        print("Description : " + response['Metadata']['description'])

However, I am getting the following error while testing:

{

  "stackTrace": [

    [

      "/var/task/lambda_function.py",

      17,

      "lambda_handler",

      "for record in event['Records']:"

    ]

  ],

  "errorType": "KeyError",

  "errorMessage": "'Records'"

}

Am I doing anything wrong while accessing the bucket name and key name of the S3 object? If not, then what am I doing wrong here? 

1 Answer

0 votes
by (44.5k points)

Inside the AWS API, we have to configure the Integration Request. This can be done by clicking on Body Mapping Templates, Then set the content type to application/json. A generated mapping template appears, and edit it like this:

{

  "body" : $input.json('$'),

  "headers": {

    #foreach($header in $input.params().header.keySet())

    "$header": "$util.escapeJavaScript($input.params().header.get($header))" #if($foreach.hasNext),#end

 

    #end

  },

  "method": "$context.httpMethod",

  "params": {

    #foreach($param in $input.params().path.keySet())

    "$param": "$util.escapeJavaScript($input.params().path.get($param))" #if($foreach.hasNext),#end

 

    #end

  },

  "query": {

    #foreach($queryParam in $input.params().querystring.keySet())

    "$queryParam": "$util.escapeJavaScript($input.params().querystring.get($queryParam))" #if($foreach.hasNext),#end

 

    #end

  }  

}

Also, edit this part in the lambda function.

replace:

for record in event['Records']:

with:

for record in event['query']['Records']

Welcome to Intellipaat Community. Get your technical queries answered by top developers !


Categories

...