Agence web » Actualités du digital » Comment utiliser AWS Object Lambda pour transformer des objets S3 à la demande –

Comment utiliser AWS Object Lambda pour transformer des objets S3 à la demande –

Object Lambda vous permet de placer une fonction Lambda devant les objets S3, leur permettant d’être transformés à la demande par votre propre code personnalisé. Comme il s’exécute automatiquement sur Lambda, vous n’avez pas à vous soucier de l’exécution de votre propre couche proxy.

Qu’est-ce que Object Lambda?

Object Lambda remplace essentiellement une API devant S3. Auparavant, vous deviez configurer une couche proxy sur votre propre infrastructure pour gérer la transformation des objets à la demande. Cela ajoute de la complexité, donc AWS a ajouté une meilleure solution.

Au lieu d’accéder directement aux objets, vous le ferez via un point d’accès Object Lambda. Lorsque vous effectuez une demande GET pour un fichier dans un compartiment S3, la fonction Lambda pour ce point d’accès est automatiquement appelée, autorisée à accéder à l’objet d’origine et à renvoyer un objet transformé à l’application.

Les utilisations pour cela peuvent être basiques, comme la rédaction d’informations ou la conversion de JSON en XML, mais comme il s’agit de votre propre code, vous pouvez faire ce que vous voulez. Vous pouvez, par exemple, exécuter une recherche dans la base de données et renvoyer un objet transformé avec de nouvelles données, ou adresser des requêtes à des API externes.

Vous pouvez avoir plusieurs points d’accès par compartiment, qui peuvent chacun représenter plusieurs «vues» des données sous-jacentes. Pour utiliser différents points d’accès, vous n’avez pas besoin de mettre à jour le code client. Remplacez simplement le nom du compartiment par l’ARN du point d’accès Object Lambda.

s3.get_object( 
    Bucket='arn:aws:s3-object-lambda:us-east-1:123412341234:accesspoint/myolap', 
    Key='s3.txt' )

Vous n’avez pas non plus besoin d’accéder à l’objet d’origine par le nom exact. Par exemple, votre application pourrait demander picture_1920x1080.jpg, qui trouverait picture.jpg et le redimensionner aux dimensions données. Dans ce cas, la fonction Lambda aurait besoin d’autorisations supplémentaires pour accéder au contenu du compartiment.

Bien sûr, vous devrez payer pour tout le temps passé à exécuter les fonctions Lambda. Si vous exécutez de nombreuses fonctions via un point d’accès orienté utilisateur, cela peut commencer à s’additionner. Si vos transformations sont statiques, vous pouvez envisager de mettre en cache les objets dans un compartiment S3 distinct. Par exemple, si vous disposez d’une fonction qui applique des filtres / compression à une image, vous souhaiterez peut-être mettre en cache les résultats au lieu de les reconstruire à chaque demande. Pour les choses qui dépendent de l’état externe, cependant, cela ne sera pas possible.

Utiliser Object Lambda

Rendez-vous sur la console de gestion S3 pour commencer. Chaque point d’accès Object Lambda a besoin d’un point d’accès régulier derrière lui. Vous devrez le créer à partir de Points d’accès> Créer dans la barre latérale.

Chaque point d'accès Object Lambda a besoin d'un point d'accès régulier derrière lui.  Vous devrez le créer à partir de Points d'accès> Créer dans la barre latérale. » width= »700″ height= »316″ src= »/pagespeed_static/1.JiBnMqyl6S.gif » onload= »pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this); » onerror= »this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this); »/></p>
<p>Saisissez un nom et sélectionnez un bucket, puis assurez-vous de sélectionner « Internet », sauf si ce bucket est limité à un seul VPC.  Une fois créé, copiez l’ARN du point d’accès.</p>
</p>
<p>Créez un point d’accès Lambda objet:</p>
</p>
<p>Donnez-lui un nom et collez-le dans l’ARN du point d’accès, et la console devrait afficher le nom du compartiment sous-jacent.</p>
<p>À ce stade, vous devrez sélectionner une fonction Lambda.  Si vous en avez un préparé, vous pouvez entrer l’ARN ou le sélectionner dans la liste.  Sinon, vous devrez vous diriger vers la console de gestion Lambda pour en créer une.</p>
</p>
<p>À ce stade, le code dépend de vous, bien qu’AWS fournisse l’exemple suivant, qui prend l’objet d’origine et le transforme en majuscules.  Quelle que soit la langue que vous utilisez, vous devrez saisir le contexte de l’événement, faire une demande à S3 à l’aide de l’URL, transformer l’objet, puis écrire la réponse à l’aide de la nouvelle API WriteGetObjectResponse, en renvoyant un code d’état HTTP par la suite.</p>
<pre><span class=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"] response = requests.get(s3_url) original_object = response.content.decode('utf-8') transformed_object = original_object.upper() s3 = boto3.client('s3') s3.write_get_object_response( Body=transformed_object, RequestRoute=request_route, RequestToken=request_token) return {'status_code': 200}

L’objet événement que Lambda reçoit ressemblera à ceci:

{
    "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"
}

Il y a deux informations importantes ici: le userRequest section, qui contient des informations sur la requête initiale, comme les en-têtes URL et HTTP, et le userIdentity section, qui peut être utilisée pour personnaliser la réponse en fonction de l’utilisateur IAM.

★★★★★