Fading Coder

One Final Commit for the Last Sprint

Home > Tech > Content

Automated Image Resizing Pipeline Using AWS S3 Event Triggers and Lambda Functions

Tech May 19 1

Infrastructure Initialization

Provision four distinct S3 buckets to serve as storage layers: one for raw uploads and three dedicated to resized variants. Example naming conventions include raw-images-bucket, images-50x50, images-100x100, and images-200x200. Ensure versioning is disabled unless audit retention is required, and configure standard storage class defaults.

Environment Configuration

Deploy the AWS Command Line Interface following official distribution guidelines. Establish authentication credentials via the interactive configuration wizard. For runtime execution, install Node.js v14.x to align with legacy Lambda container compatibility matrices. Alternative deployment targets support newer runtimes, though binary dependencies may require recompilation. Use system package managers or version managers depending on the host operating system.

Dependency Management

Introduce the sharp image processing library. On Linux-based systems, native compilation integrates seamlessly with the Amazon Linux runtime. For macOS development environments, specify cross-compilation flags to match the target architecture:

npm install --arch=x64 --platform=linux --target=14.18.0 sharp

This directive ensures native bindings remain compatible during local iteration before cloud deployment.

Lambda Implementation

Construct the event handler script. Replace repetitive boilerplaet with a dynamic configuration array that defines resize dimensions and output bucket suffixes. Implement concurrent buffer generation using native Promise resolution, reducing overall invocation latency. The handler extracts metadata from the incoming event payload, retrieves the source asset, applies scaling operations, and queues parallel upload tasks.

const AWS = require('aws-sdk');
const sharp = require('sharp');

const s3Client = new AWS.S3();

const RESIZE_TARGETS = [
  { width: 50, suffix: '50x50' },
  { width: 100, suffix: '100x100' },
  { width: 200, suffix: '200x200' }
];

exports.handler = async (event) => {
  const record = event.Records[0];
  const sourceBucket = record.s3.bucket.name;
  const sourceKey = decodeURIComponent(record.s3.object.key.replace(/\+/g, ' '));
  
  console.log(`Processing object: ${sourceKey} from ${sourceBucket}`);

  try {
    // Fetch original image from source bucket
    const objectResponse = await s3Client.getObject({ Bucket: sourceBucket, Key: sourceKey }).promise();
    
    // Generate resized variations concurrently
    const uploadTasks = RESIZE_TARGETS.map(async ({ width, suffix }) => {
      const resizedBuffer = await sharp(objectResponse.Body).resize(width, width).toBuffer();
      
      const targetBucket = `${sourceBucket}-${suffix}`;
      return s3Client.putObject({
        Bucket: targetBucket,
        Key: sourceKey,
        Body: resizedBuffer,
        ContentType: objectResponse.ContentType || 'image/jpeg',
        ContentLength: resizedBuffer.length
      }).promise();
    });

    await Promise.all(uploadTasks);
    console.log('Scaled assets committed to destination buckets.');
  } catch (error) {
    console.error('Pipeline execution failed:', error.stack);
    throw error;
  }
};

Packaging & Deployment

Archive the handler script alongside resolved dependencies using recursive compression. Execute the following command from the root directory:

zip -r deployment-package.zip .

Upload this archive through the serverless function management console or CLI toolchain. Select the appropriate Node.js runtime version during resource creation. Verify memory allocation settings accommodate the image processing workload without triggering timeout exceptions.

Access Control Strategy

Define an IAM policy enforcing strict least-privilege boundaries. Grant read access exclusively to the ingestion bucket and write permissions only to designated output prefixes. Attach the generated policy to the execution role provisioned during function initialization.

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "CloudWatchLogsAccess",
      "Effect": "Allow",
      "Action": ["logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents"],
      "Resource": "arn:aws:logs:*:*:*"
    },
    {
      "Sid": "CrossBucketImageOperations",
      "Effect": "Allow",
      "Action": ["s3:GetObject", "s3:PutObject"],
      "Resource": [
        "arn:aws:s3:::your-raw-bucket-name/*",
        "arn:aws:s3:::your-raw-bucket-name-50x50/*",
        "arn:aws:s3:::your-raw-bucket-name-100x100/*",
        "arn:aws:s3:::your-raw-bucket-name-200x200/*"
      ]
    }
  ]
}

Validate role attachment in the identity management dashboard before proceeding to trigger mapping.

Event Trigger Configuration

Map the storage layer to initiate serverless computation automatically. Navigate to the raw bucket properties interface, locate the Events section, and define a new notification rule. Specify universal object creation events as the activation condition. Assign the newly provisioned Lambda function as the destination endpoint. Commit the configuration changes.

Validation & Monitoring

Upload a test asset exceeding standard dimensions to the primary bucket. Inspect CloudWatch Logs streams for execution traces, memory utilization metrics, and duration statistics. Verify scaled file presence across secondary buckets with matching filenames. Adjust concurrency limits or timeout parameters within the function configuration if iterative processing reveals performance constraints.

Tags: AWS

Related Articles

Comprehensive Guide to SSTI Explained with Payload Bypass Techniques

Introduction Server-Side Template Injection (SSTI) is a vulnerability in web applications where user input is improper handled within the template engine and executed on the server. This exploit can r...

Implement Image Upload Functionality for Django Integrated TinyMCE Editor

Django’s Admin panel is highly user-friendly, and pairing it with TinyMCE, an effective rich text editor, simplifies content management significantly. Combining the two is particular useful for bloggi...

SBUS Signal Analysis and Communication Implementation Using STM32 with Fus Remote Controller

Overview In a recent project, I utilized the SBUS protocol with the Fus remote controller to control a vehicle's basic operations, including movement, lights, and mode switching. This article is aimed...

Leave a Comment

Anonymous

◎Feel free to join the discussion and share your thoughts.