Przejdź do treści

Zmiana rozmiaru obrazów i dodawanie znaków wodnych za pomocą AWS Lambda

Resizing Images and Adding Watermarks with AWS Lambda 2024

W tym artykule przyjrzymy się, jak utworzyć funkcję AWS Lambda, która automatycznie zmienia rozmiar obrazów, dodaje znak wodny i konwertuje obrazy do określonego formatu. Ta funkcjonalność może być szczególnie przydatna w przypadku tworzenia wpisów na blogu, albo w social mediach, miniatur filmów, galeri zdjęć i wszelkich innych zadań automatycznego przetwarzania obrazów.

Obejrzyj wideo

Aby zobaczyć ten proces w akcji, obejrzyj film na moim kanale YouTube, gdzie wyjaśniam, jak działa ta funkcja Lambda w praktyce.

Resizing Images and Adding Watermarks with AWS Lambda

Wymagania wstępne

Zanim przejdziemy do konkretów, upewnij się, że masz i ogarniasz następujące rzeczy:

  • Oczywiście konto w AWS
  • Podstawowa wiedza na temat AWS Lambda, S3 i IAM
  • EC2 z Amazon Linux 2023 w celu zbudowania warstwy Pillow — opcjonalnie
  • S3 do przesyłania obrazów
  • Rola IAM z niezbędnymi uprawnieniami do funkcji Lambda

Główne Kroki

Aby utworzyć funkcję AWS Lambda, która automatycznie zmienia rozmiar obrazów, dodaje znak wodny i konwertuje obrazy do określonego formatu, należy wykonać następujące główne kroki:

  • Zbuduj warstwę Lambda z biblioteką Pillow, która umożliwia manipulowanie obrazami – opcjonalnie
  • Dodaj kod, aby zmienić rozmiar obrazów, dodać znak wodny i przekonwertować
  • Skonfiguruj funkcję, aby była wyzwalana na zdarzeniach S3, wtedy gdy nowe obrazy są przesyłane.

1. Tworzenie warstwy Lambda z Pillow

Pillow nie jest domyślnie dołączony do AWS Lambda, więc musimy utworzyć dla niego warstwę. Poniżej opiszę dwa sposoby, jak to zrobić:

  • Opcja 1 – Użyj istniejącego ARN dla warstwy Pillow, jeśli jest dostępny.
  • Opcja 2 – Utwórz własną warstwę, wykonując poniższe kroki.

Kroki tworzenia warstwy Pillow

Zaloguj się do EC2 z systemem Amazon Linux 2023 i wykonaj następujące polecenia:

# 1. Install essential build dependencies for compiling Python
sudo dnf install -y gcc openssl-devel bzip2-devel libffi-devel make zlib-devel

# 2. Download Python 3.12 source code
wget https://www.python.org/ftp/python/3.12.0/Python-3.12.0.tgz

# 3. Extract the downloaded Python tarball
tar xzf Python-3.12.0.tgz
cd Python-3.12.0

# 4. Configure and compile Python with zlib support enabled for AWS Lambda compatibility
./configure --enable-optimizations --with-zlib
make
sudo make altinstall

# 5. Download `get-pip.py` to manually install `pip` for Python 3.12
cd ~
curl -O https://bootstrap.pypa.io/get-pip.py

# 6. Install `pip` for Python 3.12
sudo /usr/local/bin/python3.12 get-pip.py

# Verify `pip` installation
/usr/local/bin/python3.12 -m pip --version

# 7. Create a virtual environment with Python 3.12
/usr/local/bin/python3.12 -m venv pillow-layer-env

# 8. Activate the virtual environment
source pillow-layer-env/bin/activate

# 9. Install Pillow in the virtual environment
pip install Pillow

# 10. Create the folder structure for AWS Lambda layer
mkdir -p python/lib/python3.12/site-packages

# 11. Copy the installed packages to the Lambda layer structure
cp -r pillow-layer-env/lib/python3.12/site-packages/* python/lib/python3.12/site-packages/

# 12. Compress the `python` folder into a ZIP file for Lambda layer deployment
zip -r pillow-layer.zip python

# You can now upload `pillow-layer.zip` to AWS Lambda as a layer

Przesyłanie warstwy Pillow do AWS Lambda

Teraz, gdy mamy już plik pillow-layer.zip, możemy go przesłać do AWS Lambda:

  1. Przejdź do konsoli AWS Lambda.
  2. Kliknij Layers w menu po lewej stronie.
  3. Kliknij Create Layer.
  4. Prześlij plik pillow-layer.zip.
  5. Wybierz wersję Pythona, która pasuje do Twojej funkcji Lambda.

Opcja 1: Dodawanie warstwy za pomocą konsoli AWS Lambda

  1. Przejdź do konsoli AWS Lambda.
  2. Wybierz funkcję Lambda, do której chcesz dodać warstwę.
  3. Przewiń w dół do sekcji Layers i kliknij Add a layer.
  4. Wybierz Custom layers
  5. Z listy rozwijanej Layer name wybierz utworzoną pillow-layer
  6. Upewnij się, że wybrałeś poprawną wersję warstwy i wersję Pythona, która pasuje do Twojej funkcji Lambda.
  7. Kliknij Add , aby zastosować warstwę do swojej funkcji Lambda.

Opcja 2: Dodawanie warstwy za pomocą ARN

  1. Przejdź do konsoli AWS Lambda.
  2. Wybierz funkcję Lambda, do której chcesz dodać warstwę.
  3. Przewiń w dół do sekcji Layers i kliknij Add a layer.
  4. Wybierz Specify an ARN.
  5. Wklej ARN swojej warstwy w polu tekstowym. Format ARN zazwyczaj wygląda następująco:
    codearn:aws:lambda:<region>:<account-id>:layer:<layer-name>:<version>
  6. Kliknij Add , aby dodać warstwę do swojej funkcji Lambda.

2. Przykładowy kod dla funkcji Lambda

Poniżej znajduje się kod, który możesz użyć, aby utworzyć funkcję Lambda, która zmienia rozmiar obrazów, dodaje znak wodny i zapisuje dane wyjściowe w określonym formacie. Możesz zmodyfikować ten kod zgodnie ze swoimi potrzebami.

import boto3
from PIL import Image, ImageDraw, ImageFont
import io
import os

s3 = boto3.client('s3')

def lambda_handler(event, context):
# Define output format (e.g., 'WEBP', 'JPEG', 'PNG'...)
output_format = 'WEBP'

bucket_name = event['Records'][0]['s3']['bucket']['name']
object_key = event['Records'][0]['s3']['object']['key']
print(bucket_name)
print(object_key)


if object_key.startswith('input/'):
s3_response = s3.get_object(Bucket=bucket_name, Key=object_key)
image_content = s3_response['Body'].read()

img = Image.open(io.BytesIO(image_content))

# Set watermark text
watermark_text = "https://lepczynski.it"

file_extension = os.path.splitext(object_key)[1].lower()
if file_extension != f'.{output_format.lower()}':
img = img.convert('RGB')

# Resize image to HD resolution (1280x720)
img = img.resize((1280, 720))

draw = ImageDraw.Draw(img)
font = ImageFont.load_default()

text_bbox = draw.textbbox((0, 0), watermark_text, font=font)
text_width = text_bbox[2] - text_bbox[0]
text_height = text_bbox[3] - text_bbox[1]

watermark_position = (img.width - text_width - 10, img.height - text_height - 10)

draw.text(watermark_position, watermark_text, font=font, fill=(255, 255, 255, 128)) # White with transparency

buffer = io.BytesIO()
img.save(buffer, output_format)
buffer.seek(0)

output_key = object_key.replace('input/', 'output/').rsplit('.', 1)[0] + f'.{output_format.lower()}'

s3.put_object(Bucket=bucket_name, Key=output_key, Body=buffer, ContentType=f'image/{output_format.lower()}')

return {
'statusCode': 200,
'body': f'Image successfully processed and saved as {output_key}'
}
else:
return {
'statusCode': 400,
'body': 'File not in the input folder.'
}

3. Dodawanie Triggera dla funkcji Lambda

Aby Twoja funkcja Lambda automatycznie przetwarzała obrazy zaraz po ich przesłaniu do S3, musisz skonfigurować trigger. Ten wyzwalacz wywoła Twoją funkcję Lambda za każdym razem, gdy w określonym folderze w S3 zostanie utworzony nowy obiekt. Oto, jak to zrobić:

  1. Na karcie Configuration znajdź sekcję Triggers i kliknij Add Trigger.
  2. Na liście rozwijanej Trigger configuration wybierz S3.
  3. Wybierz S3 bucket, który chcesz monitorować.
  4. Jako Event type, wybierz PUT. Spowoduje to wyzwolenie funkcji Lambda tylko wtedy, gdy nowy obiekt zostanie utworzony (przesłany) do S3, unikając niepotrzebnych wywołań w przypadku usuwania obiektów lub innych zdarzeń.
  5. Jeśli chcesz filtrować pliki wyzwalające funkcję Lambda, możesz określić prefiks, np. input/ jak ja, lub sufiks, np. .jpg lub .png. W ten sposób tylko pliki spełniające kryteria wywołają funkcję.
  6. Konsola automatycznie doda niezbędne uprawnienia dla S3, aby wywołać funkcję Lambda. Upewnij się, że rola IAM powiązana z funkcją Lambda ma uprawnienia do odczytu z S3.
  7. Na koniec kliknij przycisk Add, aby utworzyć wyzwalacz.

Jeśli jesteś zainteresowany dodawaniem wyzwalaczy do funkcji lambda, możesz sprawdzić moje inne artykuły, w których bardziej skupiam się na tym temacie. Przeczytaj na przykład ten artykuł Jak automatycznie kopiować dane z AWS S3 – Lambda events

Testowanie

Po skonfigurowaniu wyzwalacza S3 możesz go przetestować, przesyłając obraz do określonego folderu w S3. Po przesłaniu obrazu funkcja Lambda powinna zostać automatycznie wywołana, przetwarzając obraz zgodnie z napisanym kodem.

Monitorowanie i logi

Możesz monitorować wykonywanie swojej funkcji Lambda, sprawdzając kartę Monitor w konsoli Lambda. Ponadto możesz przeglądać logi w Amazon CloudWatch, aby rozwiązywać problemy, które pojawiają się podczas wykonywania funkcji.

you can view logs in Amazon CloudWatch to troubleshoot any issues

Pamiętaj, aby dostosować uprawnienia funkcji Lambda, aby mogła ona odczytywać i zapisywać dane do Twojego S3. Używanie tylko minimalnych uprawnień może być czasem męczące ale na pewno jest bezpieczne. Możesz również zmodyfikować tekst, rozmiar i położenie znaku wodnego, aby dopasować je do swoich potrzeb.

Podsumowanie

Teraz masz potężną funkcję AWS Lambda, która automatycznie zmienia rozmiar obrazów, dodaje znak wodny i konwertuje je do pożądanego formatu. Ta konfiguracja może znacznie usprawnić Twój przepływ pracy, szczególnie podczas tworzenia miniatur dla filmów YouTube lub przetwarzania obrazów na potrzeby bloga, mediów społecznościowych sklepu lub czegokolwiek innego.

Jeśli artykuł był dla Ciebie pomocny, będę bardzo szczęśliwy, jeśli zostawisz komentarz pod tym artykułem lub filmem na YouTube. Pamiętaj, że możesz również zasubskrybować mój kanał na YouTube, aby być na bieżąco z treściami, które tworzę.

Jak automatycznie kopiować dane z AWS S3 – Lambda events
CDN i 2 sposoby na ‘Statyczną Stronę WWW’ w AWS

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *