Writing Lambda function

In this step, we will update the code for the book_create created function in post 1:

  1. Open AWS Lambda console

LambdaConsole

  1. Click book_create function

LambdaCreateFunction

  1. Copy the below code block into lambda_function.py
import boto3
import json
import base64
import io
import cgi
import os

s3 = boto3.client('s3')
client = boto3.resource('dynamodb')
runtime_region = os.environ['AWS_REGION']

def get_data_from_request_body(content_type, body):
    fp = io.BytesIO(base64.b64decode(body)) # decode
    environ = {"REQUEST_METHOD": "POST"}
    headers = {
        "content-type": content_type,
        "content-length": len(body),
    }

    fs = cgi.FieldStorage(fp=fp, environ=environ, headers=headers) 
    return [fs, None]
    
def lambda_handler(event, context):
    content_type = event['headers'].get('Content-Type', '') or event['headers'].get('content-type', '')
    
    if content_type == 'application/json':
        book_item = json.loads(event["body"])
    else:
        book_data, book_data_error = get_data_from_request_body(
            content_type=content_type, body=event["body"]
        )
    
        name = book_data['image'].filename
        image = book_data['image'].value
        s3.put_object(Bucket='book-image-store', Key=name, Body=image)
        image_path = "https://{}.s3.{}.amazonaws.com/{}".format("book-image-resize-store", runtime_region, name)
        
        book_item = {
            "id": book_data['id'].value,
            "rv_id": 0,
            "name": book_data['name'].value,
            "author": book_data['author'].value,
            "price" : book_data['price'].value,
            "category": book_data['category'].value,
            "description": book_data['description'].value,
            "image": image_path
        }
    
    table = client.Table('Books')
    table.put_item(Item = book_item)
    
    response = {
        'statusCode': 200,
        'body': 'successfully created item!',
        'headers': {
            'Content-Type': 'application/json',
            "Access-Control-Allow-Headers": "Access-Control-Allow-Headers, Origin, Accept, X-Requested-With, Content-Type, Access-Control-Request-Method,X-Access-Token, XKey, Authorization",
            "Access-Control-Allow-Origin": "*",
            "Access-Control-Allow-Methods": "GET,PUT,POST,DELETE,OPTIONS"
        },
    }
  
    return response
  • Then, click Deploy

The new code handles the images that the user wants to upload and is saved in the S3 bucket

If you create S3 buckets with names different from the lab, replace them in lines 35 and 36 of code

LambdaCreateFunction

  1. Give the Lambda function permission to write a file to the S3 bucket.
  • Click Configuration tab
  • Select Permissions pattern on the left menu
  • Click on the role the function is executing

LambdaCreateFunction

  • Click on the existing policy that starts with AWSLambdaExecutionRole-

LambdaCreateFunction

  • Click Edit policy

LambdaCreateFunction

  • Click JSON tab and add the blow json block:
,
        {
            "Effect": "Allow",
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::book-image-store/*"
        }
  • Click Review policy

LambdaCreateFunction

  • Review the settings and click Save changes

LambdaCreateFunction