Obsah

  • Řešení a zjednodušený diagram architektury
  • AWS CDK skript (TypeScript)
  • Lambda funkce (Python)

Řešení

Tato pipeline demonstruje, jak generovat náhledy pro obrázky nahrané do S3 bucketu pomocí AWS Lambda a Amazon S3. Systém využívá S3 event notifikaci k spuštění Lambda funkce, která generuje náhledy a ukládá je zpět do S3 bucketu. Použitím AWS Lambda a Amazon S3 dohromady mohou vývojáři vytvořit bezproblémové, serverless řešení pro dynamické generování náhledů, zlepšující uživatelskou zkušenost s rychlejším načítáním obrázků a optimalizovaným úložištěm. Tento přístup demonstruje sílu a flexibilitu AWS služeb při budování škálovatelných, automatizovaných workflow.

Popis případu užití

V tomto scénáři, kdykoli je obrázek nahrán do určeného S3 bucketu, je odeslána event notifikace do AWS Lambda. Tato událost spustí Lambda funkci, která obsahuje kód specificky napsaný pro změnu velikosti obrázků. Pomocí AWS SDK Lambda funkce načte nově nahraný obrázek z S3 bucketu.

Funkce pak zpracuje obrázek, generuje náhled se zmenšenými rozměry. Tato změna velikosti nejen šetří úložný prostor, ale také zlepšuje dobu načítání, když jsou náhledy zobrazeny na webových stránkách nebo v aplikacích. Jakmile je náhled vytvořen, je nahrán zpět do určené složky ve stejném S3 bucketu nebo do jiného bucketu, v závislosti na konfiguraci.

Tento automatizovaný systém generování náhledů je navržen tak, aby byl škálovatelný, schopný zpracovat velký objem obrázků využitím auto-škálování AWS Lambda. Eliminuje potřebu manuálního zpracování obrázků, čímž snižuje provozní režii.

Průmyslové domény

Toto řešení je aplikovatelné v různých průmyslových odvětvích, včetně e-commerce, médií, sociálních sítí a systémů pro správu obsahu. Jakákoli aplikace, která zahrnuje nahrávání obrázků a vyžaduje generování náhledů, může těžit z této pipeline. Příklady zahrnují online tržiště, platformy pro sdílení fotografií a systémy pro správu digitálních aktiv.

Zjednodušený diagram architektury

S3 Thumbnail Diagram

Architektura se skládá z:

  1. Amazon S3 Bucket: Ukládá původní obrázky a generované náhledy.
  2. AWS Lambda funkce: Zpracovává nahrané obrázky a generuje náhledy.
  3. Amazon S3 Event notifikace: Spouští Lambda funkci při nahrání obrázku.
  4. IAM Role: Uděluje nezbytná oprávnění Lambda funkci pro přístup k S3.

AWS CDK skript (TypeScript)

import * as cdk from 'aws-cdk-lib';
import { Construct } from 'constructs';
import * as s3 from 'aws-cdk-lib/aws-s3';
import * as lambda from 'aws-cdk-lib/aws-lambda';
import * as s3n from 'aws-cdk-lib/aws-s3-notifications';
import * as iam from 'aws-cdk-lib/aws-iam';

export class ThumbnailGeneratorStack extends cdk.Stack {
  constructor(scope: Construct, id: string, props?: cdk.StackProps) {
    super(scope, id, props);

    const bucket = new s3.Bucket(this, 'ImageBucket', {
      removalPolicy: cdk.RemovalPolicy.DESTROY,
    });

    const thumbnailFunction = new lambda.Function(this, 'ThumbnailFunction', {
      runtime: lambda.Runtime.PYTHON_3_9,
      handler: 'index.handler',
      code: lambda.Code.fromAsset('lambda'),
      environment: {
        BUCKET_NAME: bucket.bucketName,
      },
    });

    bucket.grantReadWrite(thumbnailFunction);

    bucket.addEventNotification(s3.EventType.OBJECT_CREATED, new s3n.LambdaDestination(thumbnailFunction));

  }
}

Lambda funkce (Python)

import os
import boto3
from PIL import Image
from io import BytesIO

s3_client = boto3.client('s3')

def handler(event, context):
    bucket_name = os.environ['BUCKET_NAME']
    for record in event['Records']:
        key = record['s3']['object']['key']
        if key.endswith(('jpg', 'jpeg', 'png')):
            image_object = s3_client.get_object(Bucket=bucket_name, Key=key)
            image_content = image_object['Body'].read()
            image = Image.open(BytesIO(image_content))
            thumbnail = image.copy()
            thumbnail.thumbnail((128, 128))
            thumb_io = BytesIO()
            thumbnail.save(thumb_io, format=image.format)
            thumb_key = f"thumbnails/{key}"
            s3_client.put_object(Bucket=bucket_name, Key=thumb_key, Body=thumb_io.getvalue())
    return {
        'statusCode': 200,
        'body': 'Náhled byl úspěšně vygenerován!'
    }

Copyright © 2024. All rights reserved.