Przedstawiamy Amazon S3 Object Lambda – korzystaj ze swojego kodu do przetwarzania danych w stanie, w jakim są pobierane z S3

29 kwietnia 2021

Kiedy przechowujesz dane w Amazon Simple Storage Service (S3), możesz w łatwy sposób udostępniać je do użytku za pomocą wielu aplikacji.

Jednakże każda z tych aplikacji posiada swoje własne wymagania i może wymagać innego widoku danych. Na przykład zbiór danych utworzony przez aplikację do handlu e-commerce może zawierać dane osobowe (PII), które nie są wymagane, kiedy te same dane są przetwarzane w celach analitycznych i powinny zostać zredagowane. Z drugiej strony, jeśli ten sam zestaw danych jest używany w celach marketingowych, może być konieczne wzbogacenie danych o dodatkowe szczegóły, takie jak informacje z bazy danych programu lojalnościowego klientów.

Aby zapewnić różne widoki danych wielu aplikacjom, aktualnie posiadasz dwie opcje. Albo tworzysz, przechowujesz i utrzymujesz dodatkowe pochodne kopie danych, tak że każda z aplikacji posiada swój własny, niestandardowy zestaw danych, albo budujesz i zarządzasz infrastrukturą jako warstwą proxy przed S3 w celu wychwytywania i przetwarzania danych zgodnie z żądaniem. Obie opcje zwiększają złożoność i koszty, więc zespół S3 postanowił stworzyć lepsze rozwiązanie.

Dziś twórcy mogą z radością obwieścić dostępność S3 Object Lambda, nowej możliwości, która pozwala na dodanie Twojego własnego kodu do przetwarzania danych pobranych z S3 przed zwróceniem ich do aplikacji. S3 Object Lambda współpracuje z istniejącymi aplikacjami i wykorzystuje funkcje AWS Lambda w celu automatycznego przetwarzania i przekształcania danych podczas ich pobierania z S3. Funkcja Lambda jest wywołana w tekście ze standardowym żądaniem S3 GET, dzięki czemu nie musisz zmieniać kodu aplikacji.

Dzięki temu możesz w łatwy sposób przedstawić wiele widoków z tego samego zbioru danych, a także możesz zaktualizować funkcje Lambda, aby zweryfikować te widoki w dowolnym momencie.

funkcje Lambda

Istnieje wiele przypadków użycia, które można uprościć dzięki temu podejściu, na przykład:

  • Redagowanie informacji umożliwiających identyfikację osób w środowiskach analitycznych lub nieprodukcyjnych;
  • Konwertowanie różnych formatów danych, np. konwertowanie XML lub JSON;
  • Uzupełnianie danych o informacje z innych usług lub baz danych;
  • Kompresowanie lub dekompresowanie plików podczas ich pobierania;
  • Zmiana rozmiaru i znak wodny na bieżąco przy użyciu szczegółów specyficznych dla osoby dzwoniącej, takich jak użytkownik, który zażądał obiektu;
  • Wdrażanie niestandardowych reguł autoryzacji w celu uzyskania dostępu do danych.

Możesz zacząć korzystać z S3 Object Lambda, wykonując kilka prostych kroków:

  1. Utwórz Lambda Function, aby przekształcić dane do swojego przypadku użycia
  2. Utwórz punkt dostępu obiektu S3 z konsoli zarządzania S3
  3. Wybierz funkcję Lambda, którą utworzyłeś powyżej
  4. Zapewnij pomocniczy punkt dostępu S3, aby zapewnić dostęp S3 Object Lambda do oryginalnego obiektu
  5. Zaktualizuj konfigurację aplikacji, aby użyć nowego punktu dostępowego S3 Object Lambda do pobierania danych z S3.

Aby lepiej zrozumieć, w jaki sposób działa S3 Object Lambda, najlepiej sprawdzić to w praktyce.

Jak utworzyć funkcję Lambda dla S3 Object Lambda

Aby utworzyć funkcję, rozpoczynamy od spojrzenia na składnię zdarzenia wejściowego, które funkcja Lambda otrzymuje z S3 Object Lambda:

JSON

{
    "xAmzRequestId": "1a5ed718-5f53-471d-b6fe-5cf62d88d02a",
    "getObjectContext": {
        "inputS3Url": "https://myap-123412341234.s3-accesspoint.us-east-1.amazonaws.com/s3.txt?X-Amz-Security-Token=...",
        "outputRoute": "io-iad-cell001",
        "outputToken": "..."
    },
    "configuration": {
        "accessPointArn": "arn:aws:s3-object-lambda:us-east-1:123412341234:accesspoint/myolap",
        "supportingAccessPointArn": "arn:aws:s3:us-east-1:123412341234:accesspoint/myap",
        "payload": "test"
    },
    "userRequest": {
        "url": "/s3.txt",
        "headers": {
            "Host": "myolap-123412341234.s3-object-lambda.us-east-1.amazonaws.com",
            "Accept-Encoding": "identity",
            "X-Amz-Content-SHA256": "e3b0c44297fc1c149afbf4c8995fb92427ae41e4649b934ca495991b7852b855"
        }
    },
    "userIdentity": {
        "type": "IAMUser",
        "principalId": "...",
        "arn": "arn:aws:iam::123412341234:user/myuser",
        "accountId": "123412341234",
        "accessKeyId": "..."
    },
    "protocolVersion": "1.00"
}

Właściwość getObjectContext zawiera niektóre z najbardziej użytecznych informacji dla funkcji Lambda:

  • inputS3Url stanowi presigned URL, którego funkcja może być użyta w celu pobrania oryginalnego obiektu z obsługującego Access Point. W ten sposób funkcja Lambdy nie potrzebuje uprawnień odczytu S3, aby pobrać oryginalny obiekt i może uzyskać dostęp tylko do obiektu przetwarzanego przez każde wywołanie
  • outputRoute oraz outputToken są dwoma parametrami, które są wykorzystywane do odesłania zmodyfikowanego obiektu za pomocą nowego WriteGetObjectResponse oraz interfejsu API.

Właściwość configuration zawiera Amazon Resource Name (ARN) obiektu Lambda Access Point i obsługującego Access Point.

Właściwość userRequest zawiera więcej informacji pierwotnego żądania, takich jak ścieżka URL i nagłówki HTTP.

I na koniec: sekcja userIdentity zwraca szczegółowe informacje o tym, kto złożył pierwotne żądanie i może być wykorzystana do dostosowania dostępu do danych.

Teraz, kiedy składnia zdarzenia jest znana, można utworzyć funkcję Lambda. Aby uprościć sprawę, poniżej znajduje się funkcja opisana w Pytonie, która zmienia cały tekst w oryginalnym obiekcie na wielkie litery:

PYTHON

import boto3
import requests

def lambda_handler(event, context):
    print(event)

    object_get_context = event["getObjectContext"]
    request_route = object_get_context["outputRoute"]
    request_token = object_get_context["outputToken"]
    s3_url = object_get_context["inputS3Url"]

    # Get object from S3
    response = requests.get(s3_url)
    original_object = response.content.decode('utf-8')

    # Transform object
    transformed_object = original_object.upper()

    # Write object back to S3 Object Lambda
    s3 = boto3.client('s3')
    s3.write_get_object_response(
        Body=transformed_object,
        RequestRoute=request_route,
        RequestToken=request_token)

    return {'status_code': 200}

Patrząc na kod funkcji, można zauważyć, że istnieją trzy główne sekcje:

  • Najpierw używa się właściwości inputS3Url zdarzenia wejściowego w celu pobrania oryginalnego obiektu. Odkąd wartość to presigned URL, funkcja nie potrzebuje uprawnień do odczytu S3.
  • Następnie przekształca się tekst tak, aby był napisany wielkimi literami. Aby dostosować zachowanie funkcji do swojego przypadku użycia, musisz zmienić tę część. Na przykład, aby wykrywać i redagować informacje umożliwiające identyfikację osoby (PII), można użyć Amazon Comprehend do zlokalizowania jednostek umożliwiających identyfikację za pomocą DetectPiiEntities interfejsu API i zastąpienia ich gwiazdkami lub opisem zredagowanego typu jednostki
  • Na koniec używa się nowego WriteGetObjectResponse API, aby wysłać wynik transformacji z powrotem do S3 Object Lambda. W ten sposób przekształcony obiekt może być znacznie większy niż maksymalny rozmiar odpowiedzi zwracanej przez funkcję Lambda. W przypadku większych obiektów WriteGetObjectResponse Interfejs API obsługuje fragmentaryczne kodowanie transferu w celu zaimplementowania przesyłania strumieniowego danych. Funkcja Lambda musi tylko zwrócić kod stanu (200 OK w tym przypadku), ewentualne błędy i opcjonalnie dostosować metadane zwracanego obiektu zgodnie z opisem w API S3 GetObject.

Następnie należy spakować tę funkcję i jej zależności, w tym zaktualizowaną wersję AWS SDK for Python (boto3) implementującą nową metodę write_get_object_response i należy wgrać ją do funkcji Lambda. Zauważ, że maksymalny czas trwania funkcji Lambda używanej przez S3 Object Lambda wynosi 60 sekund i że funkcja Lambda wymaga uprawnień AWS Identity and Access Management (IAM), aby wywołać WriteGetObjectResponse API.

Jak utworzyć punkt dostępu S3 Object Lambda z konsoli

W konsoli S3 należy utworzyć punkt dostępu S3 w jednym z zasobników S3:

Tworzenie punktu dostępu S3

Następnie tworzy się punkt dostępu S3 Object Lambda, korzystając przy tym z pomocniczego Punku Dostępu, który został właśnie utworzony. Funkcja Lambda będzie używać obsługującego Access Point do pobierania oryginalnych obiektów.

Tworzenie punktu dostępu S3 Object Lambda

Podczas konfiguracji punktu dostępu S3 Object Lambda Access Point, tak jak przedstawiono poniżej, należy wybrać najnowszą wersję funkcji Lambda, która została utworzona powyżej. Ewentualnie można włączyć obsługę żądań korzystających z zakresu bajtów lub numerów części. Na razie należy zostawić je wyłączone. Aby zrozumieć, w jaki sposób używać zakresu bajtów i numerów części z S3 Object Lambda, zapoznaj się z dokumentacją.

lambda funkcje

W trakcie konfigurowania S3 Object Lambda Access Point można ustawić łańcuch jako payload, który jest przekazywany do funkcji Lambda we wszystkich wywołaniach pochodzących z tego Punktu Dostępu, co możesz zauważyć w konfiguracji właściwości przykładowego zdarzenia, które zostało opisane wcześniej. W ten sposób można skonfigurować tę samą funkcję Lambda dla wielu punktów dostępowych S3 Object Lambda i użyć wartości payload, aby dostosować zachowanie dla każdego z nich.

payload s3 object lambda access point

Na koniec można ustalić zasady podobne do tego, co można zrobić z normalnymi S3 Access Points aby zapewnić dostęp do obiektów dostępnych za pośrednictwem tego punktu dostępowego Object Lambda. Na razie politykę należy zostawić pustą. Potem zostawić domyślną opcję blokowania publicznego dostępu i tworzenia Object Lambda Access Point.

Teraz, kiedy S3 Object Lambda Access Point jest gotowy, zobacz, w jaki sposób możesz go wykorzystać.

Jak używać S3 Object Lambda Access Point

W konsoli S3 wybierz nowo utworzony Object Lambda Access Point. We właściwościach skopiuj AWS, aby był dostępny później.

Object Lambda Access Point właściwości

Za pomocą interfejsu wiersza poleceń AWS Command Line Interface (CLI) prześlij plik tekstowy zawierający kilka zdań do zasobnika S3 za S3 Object Lambda Access Point:

aws cp s3.txt s3://danilop-data/

Korzystanie z S3 Object Lambda z istniejącymi aplikacjami jest bardzo proste. Musisz jedynie zamienić zasobnik S3 na ARN punktu dostępowego S3 Object Lambda i zaktualizować AWS SDK, aby zaakceptować nową składnię przy użyciu S3 Object Lambda ARN.

Na przykład jest to skrypt Pytona, który pobiera plik tekstowy, który właśnie załadowałeś: najpierw prosto z zasobnika S3, potem z S3 Object Lambda Access Point. Jedyną różnicą pomiędzy tymi dwoma pobieraniami jest wartość parametru Bucket.

PYTHON

import boto3

s3 = boto3.client('s3')

print('Original object from the S3 bucket:')
original = s3.get_object(
  Bucket='danilop-data',
  Key='s3.txt')
print(original['Body'].read().decode('utf-8'))

print('Object processed by S3 Object Lambda:')
transformed = s3.get_object(
  Bucket='arn:aws:s3-object-lambda:us-east-1:123412341234:accesspoint/myolap',
  Key='s3.txt')
print(transformed['Body'].read().decode('utf-8'))

Uruchom skrypt na laptopie:

python3 read_original_and_transformed_object.py

A to wynik, który otrzymujesz

Original object on S3:
Amazon Simple Storage Service (Amazon S3) is an object storage service that offers industry-leading scalability, data availability, security, and performance. This means customers of all sizes and industries can use it to store and protect any amount of data for a range of use cases, such as data lakes, websites, mobile applications, backup and restore, archive, enterprise applications, IoT devices, and big data analytics.

Object processed by S3 Object Lambda:
AMAZON SIMPLE STORAGE SERVICE (AMAZON S3) IS AN OBJECT STORAGE SERVICE THAT OFFERS INDUSTRY-LEADING SCALABILITY, DATA AVAILABILITY, SECURITY, AND PERFORMANCE. THIS MEANS CUSTOMERS OF ALL SIZES AND INDUSTRIES CAN USE IT TO STORE AND PROTECT ANY AMOUNT OF DATA FOR A RANGE OF USE CASES, SUCH AS DATA LAKES, WEBSITES, MOBILE APPLICATIONS, BACKUP AND RESTORE, ARCHIVE, ENTERPRISE APPLICATIONS, IOT DEVICES, AND BIG DATA ANALYTICS.

Pierwsze dane wyjściowe pobierane są bezpośrednio z zasobnika źródłowego i możesz zobaczyć oryginalną zawartość zgodnie z oczekiwaniami. Za drugim razem obiekt jest przetwarzany przez funkcję Lambda w trakcie pobierania i w rezultacie cały tekst został napisany wielkimi literami!

Więcej sposobów użycia dla S3 Object Lambda

Podczas pobierania obiektu, wykorzystując S3 Object Lambda, nie ma potrzeby, aby obiekt o tej samej nazwie istniał w zasobniku S3. Funkcja Lambdy może wykorzystywać informacje zawarte w nazwie pliku lub w nagłówkach HTTP do wygenerowania niestandardowego obiektu.

Na przykład, jeśli poprosisz o użycie S3 Object Lambda Access Point dla obrazu o nazwie sunset_600x400.jpg, funkcja Lambda może wyszukać obraz o nazwie sunset.jpg i zmienić jego rozmiar tak, aby dopasować go do maksymalnej szerokości i wysokości zgodnie z opisem w nazwie pliku. W tym przypadku funkcja Lambda wymagałaby uprawnień dostępu do odczytu oryginalnego obrazu, ponieważ klucz dostępu różni się od tego, który został użyty we wstępnie wyznaczonym adresie URL.

Innym interesującym przypadkiem użycia byłoby pobieranie dokumentów JSON lub CSV, jak order.json lub items.csv, które są generowane na bieżąco na podstawie zawartości bazy danych. Metadane w nagłówkach HTTP żądania mogą służyć do przekazania orderId do użycia. Jak zwykle twórcy liczą na to, że kreatywność klientów znacznie wykracza poza opisane tutaj przypadku użycia.

Poniżej znajduje się krótkie video opisujące, jak działa S3 Object Lambda i w jaki sposób możesz go użyć:

Dostępność i koszty

S3 Object Lambda jest dostępny od dzisiaj we wszystkich Regionach AWS, z wyjątkiem Azji (Osaka), wschodniej i zachodniej części AWS GovCloud (USA), Chin (Beijing). Możesz używać S3 Object Lambda wraz z AWS Management Console, AWS Command Line Interface (CLI) i AWS SDK. Obecnie polecenia S3 wysokiego poziomu interfejsu AWS CLI, takie jak aws s3 cp, nie obsługują obiektów pochodzących z S3 Object Lambda Access Points, ale możesz użyć poleceń niskopoziomowego interfejsu API S3, jak aws s3api get-object.

Wraz z S3 Object Lambda płacisz za obliczenia AWS Lambda i żądasz opłat wymaganych do przetwarzania danych, a za dane S3 Object Lambda wraca do Twojej aplikacji. Płacisz także za żądania S3, które są wywoływane przez funkcję Lambda. Więcej informacji o cenach znajdziesz na stronie cennika Amazon S3.

Ta nowa funkcja znacznie ułatwia udostępnianie i konwertowanie danych w wielu aplikacjach. Zacznij korzystać z S3 Object Lambda, aby uprościć architekturę pamięci masowej.

źródło: AWS

Case Studies
Referencje

Z przyjemnością polecamy firmę Hostersi, z którą mieliśmy przyjemność współpracować przy okazji wdrożenia skalowalnej infrastruktury w Amazon Web Services, opartej o technologię Kubernetes i metodykę DevOps.  Hostersi okazali się niezwykle proaktywnym partnerem, który nie tylko wdrażał wskazane rozwiązania, ale proponował optymalne narzędzia i technologie, które sprawiły, że efekt wdrożenia jest dla nas w pełni satysfakcjonujący. Polecamy!

Grzegorz Lentzy
IT Director LINK Mobility
W skrócie o nas
Specjalizujemy się w dostarczaniu rozwiązań IT w obszarach projektowania infrastruktury serwerowej, wdrażania chmury obliczeniowej, opieki administracyjnej i bezpieczeństwa danych.