Dynamiczne tłumaczenie treści przy użyciu Amazon S3 Object Lambda

2 sierpnia 2021

Niedawne uruchomienie usługi Amazon S3 Object Lambda stwarza wiele możliwości dynamicznego przekształcania danych w segmentach S3. S3 Object Lambda może być używana wraz z innymi bezserwerowymi usługami AWS do przekształcania treści przechowywanych w S3 na wiele kreatywnych sposobów. Jednym z przykładów jest użycie S3 Object Lambda z Amazon Translate do tłumaczenia i udostępniania treści z zasobników S3 na żądanie.

Amazon Translate jest bezserwerową usługą tłumaczenia maszynowego, która zapewnia szybkie i konfigurowalne tłumaczenie danego języka. Dzięki Amazon Translate możesz z łatwością zlokalizować treści, takie jak strony internetowe i aplikacje, aby służyć zróżnicowanej grupie użytkowników.

Korzystając z S3 Object Lambda z Amazon Translate, nie musisz tłumaczyć treści z wyprzedzeniem dla wszystkich możliwych permutacji języka źródłowego na język docelowy. Zamiast tego możesz przekształcać zawartość w czasie zbliżonym do rzeczywistego, korzystając z modelu opartego na danych. Może jednocześnie obsługiwać wiele aplikacji specyficznych dla języka.

S3 Object Lambda umożliwia przetwarzanie i przekształcanie danych za pomocą funkcji Lambda, podczas gdy obiekty są pobierane przez aplikację klienta z S3. S3 GET wywołują funkcję Lambda, dzięki czemu możesz ją dostosować w celu przekształcenia treści, aby spełnić określone wymagania.

Na przykład, jeśli obsługujesz stronę internetową lub aplikację mobilną, którą odwiedzają goście z całego świata, musisz zapewnić tłumaczenia w wielu językach. Artefakty takie jak formularze, zastrzeżenia lub opisy produktów mogą zostać przetłumaczone, aby służyły zróżnicowanej globalnej publiczności przy użyciu jednego podejścia.

Architektura rozwiązania

Poniżej znajduje się diagram architektury wysokiego poziomu dla przykładowej aplikacji, która tłumaczy dynamiczną zawartość na żądanie:

Amazon S3 Object Lambda

W przypadku tego przykładu możesz stworzyć S3 Object Lambda, która przechwytuje żądania S3 GET dla danego obiektu. Następnie tłumaczy plik na język docelowy, przekazywany jako dokument dołączony do klucza obiektu S3. Na wysokim poziomie kroki można podsumować w następujący sposób:

  1. Utwórz funkcję Lambda do tłumaczenia danych z języka źródłowego na język docelowy za pomocą Tłumacza Amazon.
  2. Utwórz S3 Object Lambda Access Point z konsoli S3.
  3. Wybierz funkcję Lambda utworzoną w kroku 1.
  4. Zapewnij wspierający punkt dostępu S3, aby dać S3 Object Lambda dostęp do oryginalnego obiektu.
  5. Pobierz plik z S3, wywołując interfejs API S3 GetObject, i przekaż ARN punktu dostępu Object Lambda jako nazwę zasobnika zamiast rzeczywistej nazwy zasobnika S3.

Tworzenie funkcji Lambda

W pierwszym kroku tworzysz funkcję Lambda DynamicFileTranslation. Ta funkcja Lambda jest wywoływana przez żądanie S3 GET Object API i tłumaczy żądany obiekt. Język docelowy jest przekazywany jako argument dołączony do klucza obiektu S3, odpowiadający pobieranemu obiektowi.

Na przykład dla klucza obiektu przekazanego w wywołaniu interfejsu API GetObject S3 jest dostosowany tak, aby wyglądał podobnie do “ContactUs/contact-us.txt#fr”; znaki po „krzyżyku” reprezentują kod języka docelowego. W tym przypadku „fr” oznacza francuski. Pełną listę obsługiwanych języków i kodów można znaleźć tutaj.

Ta funkcja Lambda w sposób dynamiczny tłumaczy zawartość obiektu w S3 na język docelowy:

import json

import boto3

from urllib.parse import urlparse, unquote

from pathlib import Path

def lambda_handler(event, context):

    print(event)

 

   # Extract the outputRoute and outputToken from the object context

    object_context = event["getObjectContext"]

    request_route = object_context["outputRoute"]

    request_token = object_context["outputToken"]

 

   # Extract the user requested URL and the supporting access point arn

    user_request_url = event["userRequest"]["url"]

    supporting_access_point_arn = event["configuration"]["supportingAccessPointArn"]

 

    print("USER REQUEST URL: ", user_request_url)

  

   # The S3 object key is after the Host name in the user request URL.

   # The user request URL looks something like this,

   # https:///ContactUs/contact-us.txt#fr.

   # The target language code in the S3 GET request is after the "#"

   

    user_request_url = unquote(user_request_url)

    result = user_request_url.split("#")

    user_request_url = result[0]

    targetLang = result[1]

   

   # Extract the S3 Object Key from the user requested URL

    s3Key = str(Path(urlparse(user_request_url).path).relative_to('/'))

      

   # Get the original object from S3

    s3 = boto3.resource('s3')

   

   # To get the original object from S3,use the supporting_access_point_arn

    s3Obj = s3.Object(supporting_access_point_arn, s3Key).get()

    srcText = s3Obj['Body'].read()

    srcText = srcText.decode('utf-8')

 

   # Translate original text

    translateClient = boto3.client('translate')

    response = translateClient.translate_text(

                                                Text = srcText,

                                                SourceLanguageCode='en',

                                                TargetLanguageCode=targetLang)

   

  # Write object back to S3 Object Lambda

    s3client = boto3.client('s3')

    s3client.write_get_object_response(

                                        Body=response['TranslatedText'],

                                        RequestRoute=request_route,

                                        RequestToken=request_token )

   

    return { 'statusCode': 200 }

Kod w funkcji Lambda:

  1. Wyodrębnia outputRoute i outputToken z kontekstu obiektu. Definiuje to, gdzie dostarczane jest żądanie WriteGetObjectResponse.
  2. Wyodrębnia żądany adres URL z obiektu zdarzenia.
  3. Analizuje klucz obiektu S3 i język docelowy dołączony do klucza obiektu S3.
  4. Wywołuje S3 GetObject w celu pobrania nieprzetworzonego tekstu obiektu źródłowego.
  5. Wywołuje Amazon Translate z wyodrębnionym nieprzetworzonym tekstem.
  6. Umieszcza przetłumaczone dane wyjściowe z powrotem do S3 przy użyciu interfejsu API WriteGetObjectResponse.

Konfiguracja roli Lambda IAM

Funkcja Lambda potrzebuje uprawnień do wywołania zwrotnego do punktu dostępu S3 Object Lambda wraz z WriteGetObjectResponse. Potrzebuje również uprawnień do wywoływania S3 GetObject i Amazon Translate. Dodaj następujące uprawnienia do roli wykonawczej Lambda:

{

    "Version": "2012-10-17",

    "Statement": [

        {

            "Sid": "S3ObjectLambdaAccess",

            "Effect": "Allow",

            "Action": [

                "s3:GetObject",

                "s3-object-lambda:WriteGetObjectResponse"

            ],

            "Resource": [

                "”,

                ""

            ]

        },

        {

            "Sid": "AmazonTranslateAccess",

            "Effect": "Allow",

            "Action": "translate:TranslateText",

            "Resource": "*"

        }

    ]

}

Wdrażanie Lambda przy użyciu szablonu AWS SAM

Alternatywnie możesz wdrożyć funkcję Lambda wraz z rolą IAM przy użyciu szablonu AWS SAM. Kod funkcji Lambda oraz szablon SAM są dostępne do pobrania z GitHub.

Tworzenie punktu dostępowego S3

  1. Przejdź do konsoli S3 i utwórz zasobnik o unikalnej nazwie.
  2. W konsoli S3 wybierz „Punkty dostępu”, a później „Utwórz punkt dostępu”. Wprowadź nazwę punktu dostępu.
  3. W polu Nazwa zasobnika wpisz nazwę zasobnika S3 wprowadzoną w kroku 1.

Amazon S3 Object Lambda_

Ten punkt dostępu stanowi pomocniczy punkt dostępu dla S3 Object Lambda Access Point, który utworzysz w następnym kroku. Zachowaj wszystkie inne ustawienia na tej stronie jako domyślne.

Po utworzeniu punktu dostępu S3 utwórz punkt dostępowy S3 Object Lambda Access Point, wykorzystując pomocniczy punkt dostępowy. Utworzona wcześniej funkcja Lambda wykorzystuje wspierający punkt dostępowy do pobrania oryginalnych nieprzekształconych obiektów z S3.

Utwórz obiektowy punkt dostępu Lambda

W konsoli S3, przejdź do konfiguracji Object Lambda AccessPoint i utwórz Object Lambda Access Point. Wprowadź imię.

Amazon S3 Object Lambda_3

W przypadku konfiguracji Lambda, skojarz to z funkcją Lambda, którą utworzyłeś wcześniej. Wybierz najnowszą wersję funkcji Lambda i zachowaj wszystkie pozostałe ustawienia jako domyślne.

Amazon S3 Object Lambda_4

Aby zrozumieć, w jaki sposób korzystać z innych ustawień konfiguracji S3 Object Lambda, zapoznaj się z dokumentacją produktu.

Testowanie dynamicznego tłumaczenia treści

W tej części, tworzysz skrypt w języku Python i wywołujesz interfejs API S3 GetObject dwukrotnie. Najpierw w zasobniku S3, a następnie na Object Lambda Access Point. Następnie możesz porównać dane wyjściowe, aby zobaczyć, w jaki sposób treść jest przekształcana za pomocą Object Lambda:

  1. Prześlij plik tekstowy do zasobnika S3 za pomocą skonfigurowanego punktu dostępu Object Lambda. Na przykład prześlij przykładowy plik „Skontaktuj się z nami” w języku angielskim do S3.
  2. Aby użyć obiektu Lambda Access Point, zlokalizuj jego ARN z zakładki Properties w Object Lambda Access Point.

Amazon S3 Object Lambda_5

3.Utwórz plik lokalny o nazwie s3ol_client.py, który zawiera następujący skrypt Python

import json

import boto3

import sys, getopt

 

def main(argv):

     

  try:

    targetLang = sys.argv[1]

    print("TargetLang = ", targetLang)

   

    s3 = boto3.client('s3')

    s3Bucket = "my-s3ol-bucket"

    s3Key = "ContactUs/contact-us.txt"

 

    # Call get_object using the S3 bucket name

    response = s3.get_object(Bucket=s3Bucket,Key=s3Key)

    print("Original Content......\n")

    print(response['Body'].read().decode('utf-8'))

 

    print("\n")

 

    # Call get_object using the S3 Object Lambda access point ARN

    s3Bucket = "arn:aws:s3-object-lambda:us-west-2:123456789012:accesspoint/my-s3ol-access-point"

    s3Key = "ContactUs/contact-us.txt#" + targetLang

    response = s3.get_object(Bucket=s3Bucket,Key=s3Key)

    print("Transformed Content......\n")

    print(response['Body'].read().decode('utf-8'))

 

    return {'Success':200}            

  except:

    print("\n\nUsage: s3ol_client.py ")

 

#********** Program Entry Point ***********

if __name__ == '__main__':

    main(sys.argv[1: ])

4.Uruchom program klienta z wiersza poleceń, przekazując kod języka docelowego jako argument. Pełną listę obsługiwanych języków i kodów w Tłumaczu Amazon można znaleźć tutaj python s3ol_client.py "fr"

Wynik przedstawia się następująco:

Amazon S3 Object Lambda_6

Pierwsze dane wyjściowe to oryginalna zawartość, która została pobrana w momencie wywoływania GetObject z nazwą zasobnika S3. Drugie dane wyjściowe to przekształcona zawartość podczas wywoływania GetObject względem punktu dostępu Object Lambda. Treść jest przekształcana przez funkcję Lambda podczas pobierania i tłumaczona na język francuski w czasie zbliżonym do rzeczywistego.

Wnioski

Powyższy artykuł przedstawia, w jaki sposób możesz korzystać z obiektów S3 Lambda wraz z Amazon Translate, aby ułatwić dynamiczne tłumaczenie treści przy użyciu podejścia opartego na danych. Używając danych dostarczonych przez użytkownika jako argumentów, możesz dynamicznie przekształcać zawartość w S3 i generować nowy obiekt.

Nie jest konieczne, aby tworzyć kopię nowego obiektu S3 przed zwróceniem go do klienta. Zauważyliśmy również, że nie jest konieczne, aby obiekt o tej samej nazwie istniał w zasobniku S3, gdy używamy S3 Object Lambda. Ten wzorzec może być użyty do rozwiązania kilku rzeczywistych przypadków użycia, które mogą skorzystać z możliwości przekształcenia i generowania obiektów S3 w locie.

Case Studies
Referencje

Firma Hostersi pozwoliła nam osadzić ogólne zagadnienia programu Well Architected Framework w kontekście naszej firmy. Oszczędziło nam to wiele czasu i pozwoliło znaleźć lepiej dopasowane rozwiązania do specyfiki naszego biznesu. WAF był świetnym katalizatorem do wprowadzenie szeregu zmian w obszarze niezawodności, szybkości i bezpieczeństwa edrone. 

Piotr Stachowicz
CTO
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.