DEV Community

Cover image for "Building a Serverless Image Processing Pipeline with AWS Lambda, S3, and API Gateway"
Gerlie Ann Katherine Daga-as
Gerlie Ann Katherine Daga-as

Posted on

"Building a Serverless Image Processing Pipeline with AWS Lambda, S3, and API Gateway"

In this blog, we’ll explore how to build a serverless image processing pipeline using AWS Lambda, Amazon S3, and API Gateway. We will walk you through the technical details, provide relevant code snippets, and include architectural diagrams to make the explanation clear and easy to follow.

By the end of this blog, you'll understand how these AWS services work together to process images uploaded to an S3 bucket, resize the images, and make them available via a RESTful API powered by API Gateway.

Prerequisites
Before diving into the setup, make sure you have:

  • An AWS account (if you don’t, you can sign up for the free tier)

  • Basic understanding of AWS Lambda, API Gateway, and Amazon S3

  • Familiarity with AWS IAM (Identity and Access Management) roles and policies

  • An editor for writing Python or Node.js code (we’ll use Python in this example)

Image description

1._ Frontend (Client):_ A client (such as a web app or mobile app) sends an HTTP request to the API Gateway endpoint, which will trigger an AWS Lambda function.

  1. API Gateway: API Gateway serves as a frontend interface to handle the HTTP requests from the client and forwards them to the Lambda function.

  2. AWS Lambda: The Lambda function receives the image from the client, processes it (resizing, compressing), and stores it back to an S3 bucket.

  3. Amazon S3: The resized image is stored in an S3 bucket.

  4. CloudWatch Logs: CloudWatch is used to log events, such as successful image processing or errors.

Step-by-Step Implementation

  1. Setting Up an S3 Bucket for Image Uploads
    First, we need to create an S3 bucket where images will be uploaded.

    1. Log into the AWS Management Console and go to the S3 service.

Image description

Image description
2.Click Create Bucket, and give it a name like serverless-bucket-uploaded-images

Image description

Image description
3.In the Bucket Settings, ensure versioning is enabled (this helps with version control of uploaded images).
4.Set permissions for the bucket (for security, it’s recommended to restrict public access unless necessary).

Once the bucket is created, it will be used to store the original images and the resized ones.

  1. Creating an AWS Lambda Function to Process Images
    Next, let’s create the Lambda function that will process the images uploaded to the S3 bucket.

    1. Go to AWS Lambda and click Create Function.
    2. Select Author from Scratch, name your function (e.g., ImageResizeFunction), and choose Python latest version as the runtime. 3.For the execution role, select an existing role or create a new one with the following policies:
      • AmazonS3FullAccess (to access S3 objects)
      • AWSLambdaBasicExecutionRole (to enable CloudWatch logging) Now, let's write the code to resize the uploaded image using Python. We'll use the Pillow library for image processing, so the first step is to add the library to the Lambda deployment package.
pip install pillow -t ./lambda-package
Enter fullscreen mode Exit fullscreen mode
import boto3
from PIL import Image
from io import BytesIO

def lambda_handler(event, context):
    # Extract bucket and object key from the event
    bucket_name = event['Records'][0]['s3']['bucket']['name']
    object_key = event['Records'][0]['s3']['object']['key']

    s3 = boto3.client('s3')

    # Get the original image from S3
    original_image = s3.get_object(Bucket=bucket_name, Key=object_key)
    image_data = original_image['Body'].read()

    # Process the image (resize)
    image = Image.open(BytesIO(image_data))
    image = image.resize((200, 200))  # Resize to 200x200 pixels

    # Save the resized image to a new S3 object
    output_key = f"resized/{object_key}"
    buffer = BytesIO()
    image.save(buffer, 'PNG')
    buffer.seek(0)

    s3.put_object(Bucket=bucket_name, Key=output_key, Body=buffer)

    return {
        'statusCode': 200,
        'body': f"Image {object_key} resized and saved as {output_key}"
    }

Enter fullscreen mode Exit fullscreen mode

Explanation of the Lambda function:

  • The function triggers whenever an image is uploaded to the S3 bucket (as part of an event notification).
  • It fetches the image from S3, resizes it using the Pillow library, and then stores the resized image back into a separate resized/ folder in the S3 bucket.

3. Setting Up API Gateway to Trigger Lambda
Now, let's set up an API Gateway to receive HTTP requests from the frontend (e.g., a web or mobile app) to trigger the image upload.

  1. Go to API Gateway in the AWS Console and create a new REST API.
  2. Create a new resource (e.g., /upload-image) under the API.
  3. Under this resource, create a POST method
  4. In the Integration type, select Lambda Function and choose the ImageResizeFunction Lambda function you just created.
  5. _Enable CORS _if you want to allow requests from web browsers.
  6. Deploy the API to a new or existing stage. Once the API is deployed, you’ll receive an API endpoint URL that the frontend can use to trigger image uploads.

4. Testing the Entire Flow

1.Upload an image to the S3 bucket through your frontend, which sends a POST request to the API Gateway endpoint.
2. The API Gateway triggers the Lambda function.
3. Lambda resizes the image and saves it back to S3 under the resized/ folder.
4. You can check the resized image in the S3 bucket and monitor the Lambda function’s logs in CloudWatch.
Enter fullscreen mode Exit fullscreen mode

Best Practices and Considerations

  • Error Handling: Implement proper error handling in the Lambda function (e.g., try/except blocks) to log and handle potential failures.
  • Lambda Timeout: Set an appropriate timeout for your Lambda function (e.g., 3–5 seconds for resizing).
  • Security: Use fine-grained IAM roles for Lambda functions and S3 buckets to limit access only to necessary resources.
  • Scalability: Lambda automatically scales to handle multiple requests, but ensure the S3 bucket is correctly configured to handle large traffic loads.

AWS Lambda offers a powerful and efficient way to run code in response to events without the need to manage servers. By combining Lambda with other AWS services like S3 and API Gateway, you can build scalable, event-driven applications with minimal overhead. Whether you’re processing images, handling webhooks, or automating tasks, Lambda simplifies infrastructure management and reduces operational complexity.

As serverless technologies continue to evolve, AWS Lambda remains a key tool for modern cloud applications. Start small with a simple use case, and explore how you can scale and optimize your serverless architecture as your needs grow.

Additional Resources

If something is missing or you have any suggestions, feel free to let me know in the comments section below!

Top comments (0)