View a markdown version of this page

Traitez des fichiers sans serveur à l'aide de Lambda - FSx pour ONTAP

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Traitez des fichiers sans serveur à l'aide de Lambda

Les flux de travail de traitement de fichiers commencent souvent par des fichiers qui arrivent sur un partage de fichiers NFS ou SMB : documents numérisés depuis les succursales, images téléchargées par les équipes de terrain, fichiers audio capturés par des centres d'appels ou fichiers de données fournis par des partenaires.

Avec un point d'accès Amazon S3 connecté au volume FSx for ONTAP, les AWS Lambda fonctions lisent et écrivent les fichiers directement à l'aide de l'API Amazon S3. File-level les opérations peuvent être traitées sans serveur sur les mêmes données auxquelles vos utilisateurs et applications accèdent via NFS et SMB.

Ce didacticiel présente trois modèles courants de traitement de fichiers. Chaque exemple lit un fichier depuis le volume via le point d'accès, le traite avec un AWS service ou une bibliothèque et réécrit le résultat sur le volume.

Exemple Input Traitement Output
Exemple 1 : générer des miniatures d'images Image JPEG Coussin (bibliothèque d'images) Miniature redimensionnée
Exemple 2 : Extraire du texte à partir de documents Document PDF Amazon Textract Texte extrait (JSON)
Exemple 3 : Transcrire des fichiers audio Audio MP3 Amazon Transcribe Transcription (JSON)
Note

Ce didacticiel prend environ 40 à 60 minutes. Les ressources que vous Services AWS utilisez sont facturées pour les ressources que vous créez. Si vous effectuez rapidement toutes les étapes, y compris la section Nettoyage, le coût prévu est inférieur à 1$ dans l'est des États-Unis (Virginie du Nord) Région AWS. Cette estimation n'inclut pas les frais permanents pour le volume FSx for ONTAP lui-même.

Conditions préalables

Avant de commencer, assurez-vous de disposer des éléments suivants :

  • Un volume FSx for ONTAP associé à un point d'accès Amazon S3. Pour obtenir des instructions sur la création d'un point d'accès, consultezCréation d’un point d’accès.

  • Alias de point d'accès pour votre point d'accès. Vous pouvez le trouver dans la console Amazon FSx ou en exécutant. aws fsx describe-s3-access-point-attachments

  • AWS CLI version 1 ou version 2 installée et configurée. Les aws lambda invoke commandes de ce didacticiel incluent l'--cli-binary-format raw-in-base64-outoption, requise dans la AWS CLI version 2 pour que les charges utiles JSON brutes ne soient pas interprétées en base64. Si vous utilisez AWS CLI la version 1, omettez cette option.

  • Autorisations IAM permettant à l'appelant (l'utilisateur ou le rôle exécutant ce didacticiel) d'invoquer des fonctions Lambda (lambda:CreateFunction,lambda:InvokeFunction), d'accéder au point d'accès Amazon S3 (s3:GetObject,s3:PutObject) et de transmettre le rôle d'exécution Lambda (). iam:PassRole

Note

Ce didacticiel utilise la configuration Lambda par défaut, dans laquelle les fonctions s'exécutent dans un réseau géré en dehors de votre VPC. Dans ce cas, le point d'accès doit avoir une origine de réseau Internet pour que la fonction puisse y accéder. Si vous attachez votre fonction Lambda à un VPC, vous pouvez utiliser à la place une origine réseau VPC sur le point d'accès ; le VPC doit disposer d'un point de terminaison Amazon S3 Gateway ou Interface. Pour de plus amples informations, veuillez consulter Configuration de l'accès réseau pour les points d'accès Amazon S3.

Étape 1 : Téléchargez des exemples de fichiers

Téléchargez les exemples de fichiers suivants et chargez-les sur votre volume FSx for ONTAP via le point d'accès. my-ap-alias-ext-s3aliasRemplacez-le par l'alias de votre point d'accès tout au long de ce didacticiel.

Téléchargez les fichiers d'exemple sur votre volume FSx for ONTAP via le point d'accès.

$ aws s3 cp sample-image.jpg s3://my-ap-alias-ext-s3alias/samples/images/sample-image.jpg aws s3 cp sample-audio.mp3 s3://my-ap-alias-ext-s3alias/samples/audio/sample-audio.mp3
Note

L'image d'exemple est une photographie Blue Marble de la NASA (domaine public, 2,4 Mo). L'extrait audio provient du didacticiel de démarrage d'Amazon Transcribe (410 Ko). L'exemple de PDF est généré dansExemple 2 : Extraire du texte à partir de documents.

Étape 2 : Création du rôle d'exécution Lambda

Les fonctions Lambda jouent un rôle d'exécution pour interagir avec d'autres fonctions. Services AWS Pour ce didacticiel, joignez la AWSLambdaBasicExecutionRole politique AWS gérée pour la journalisation CloudWatch des journaux, puis ajoutez une politique en ligne qui accorde l'accès au point d'accès Amazon S3 et aux API Textract et Transcribe utilisées dans les exemples.

Remplacez regionaccount-id, et access-point-name par vos valeurs.

  1. Enregistrez la politique de confiance suivante soustrust-policy.json.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole" } ] }
  2. Enregistrez la politique d'autorisation intégrée suivante sous permissions-policy.json le nom. Il donne accès au point d'accès et aux services supplémentaires utilisés par les exemples.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": ["s3:GetObject", "s3:PutObject", "s3:ListBucket"], "Resource": [ "arn:aws:s3:region:account-id:accesspoint/access-point-name", "arn:aws:s3:region:account-id:accesspoint/access-point-name/object/*" ] }, { "Effect": "Allow", "Action": ["textract:DetectDocumentText"], "Resource": "*" }, { "Effect": "Allow", "Action": [ "transcribe:StartTranscriptionJob", "transcribe:GetTranscriptionJob" ], "Resource": "*" } ] }
  3. Créez le rôle, associez la politique de journalisation gérée et attachez la politique intégrée.

    $ aws iam create-role \ --role-name fsxn-lambda-file-processor \ --assume-role-policy-document file://trust-policy.json aws iam attach-role-policy \ --role-name fsxn-lambda-file-processor \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole aws iam put-role-policy \ --role-name fsxn-lambda-file-processor \ --policy-name fsxn-access-point-policy \ --policy-document file://permissions-policy.json

Intégration à votre flux de travail

Les exemples de ce didacticiel utilisent l'invocation manuelle avec un événement de test. En production, vous pouvez déclencher ces fonctions automatiquement en utilisant les approches suivantes :

  • EventBridge Calendrier Amazon. Exécutez la fonction selon un calendrier récurrent (par exemple, toutes les heures ou tous les jours) pour traiter les nouveaux fichiers. La fonction peut répertorier les fichiers via le point d'accès et traiter ceux qui n'ont pas encore été traités. Pour plus d'informations, consultez la section Planifier les fonctions Lambda EventBridge à l'aide du guide de EventBridgel'utilisateur Amazon.

  • Amazon API Gateway. Exposez la fonction sous forme d'API HTTP afin que les utilisateurs ou les applications puissent demander le traitement d'un fichier spécifique à la demande. Pour plus d'informations, consultez Créer une API REST API Gateway avec intégration Lambda dans le guide du développeur Amazon API Gateway.

  • Step Functions. Orchestrez des pipelines de traitement de fichiers en plusieurs étapes qui combinent plusieurs fonctions Lambda. Par exemple, un flux de travail qui extrait du texte d'un document, le traduit et réécrit le résultat dans le volume. Pour plus d'informations, consultez Call Lambda with Step Functions dans le manuel du AWS Step Functions développeur.

Exemple 1 : générer des miniatures d'images

Cet exemple lit une image JPEG depuis votre volume FSx for ONTAP, la redimensionne en miniature de 200 pixels à l'aide de la bibliothèque d'images Pillow, puis réécrit la miniature sur le volume.

Code de la fonction Lambda

Enregistrez le code suivant souslambda_function.py.

import boto3 from io import BytesIO from PIL import Image s3 = boto3.client('s3') def lambda_handler(event, context): bucket = event['access_point_alias'] key = event['key'] # Read the image from FSx through the access point response = s3.get_object(Bucket=bucket, Key=key) image_data = response['Body'].read() # Resize to thumbnail img = Image.open(BytesIO(image_data)) img.thumbnail((200, 200)) # Write the thumbnail back to FSx buffer = BytesIO() img.save(buffer, format='JPEG', quality=85) buffer.seek(0) thumbnail_key = key.rsplit('.', 1)[0] + '_thumbnail.jpg' s3.put_object( Bucket=bucket, Key=thumbnail_key, Body=buffer.getvalue(), ContentType='image/jpeg' ) return { 'original_size': len(image_data), 'thumbnail_size': len(buffer.getvalue()), 'thumbnail_key': thumbnail_key }

Création et appel de la fonction

Cette fonction nécessite la bibliothèque Pillow. Créez un package de déploiement qui inclut Pillow conçu pour le runtime Lambda Linux.

$ # Create a deployment package with Pillow for Lambda (Linux) mkdir package && pip install Pillow -t package/ \ --platform manylinux2014_x86_64 --only-binary=:all: cd package && zip -r ../thumbnail-function.zip . cd .. && zip thumbnail-function.zip lambda_function.py # Create the function aws lambda create-function \ --function-name fsxn-thumbnail-generator \ --runtime python3.12 \ --handler lambda_function.lambda_handler \ --role arn:aws:iam::account-id:role/fsxn-lambda-file-processor \ --zip-file fileb://thumbnail-function.zip \ --timeout 30 \ --memory-size 256 # Invoke with a test event aws lambda invoke \ --function-name fsxn-thumbnail-generator \ --cli-binary-format raw-in-base64-out \ --payload '{"access_point_alias": "my-ap-alias-ext-s3alias", "key": "samples/images/sample-image.jpg"}' \ response.json cat response.json

Vérifiez le résultat

$ aws s3 ls s3://my-ap-alias-ext-s3alias/samples/images/ 2024-01-23 12:19:32 2566770 sample-image.jpg 2024-01-23 12:25:49 7065 sample-image_thumbnail.jpg

L'image originale de 2,4 Mo (5400 × 2700 pixels) a été redimensionnée en miniature de 7 Ko (200 × 100 pixels).

Exemple 2 : Extraire du texte à partir de documents

Cet exemple lit un document PDF depuis votre volume FSx for ONTAP, l'envoie à Amazon Textract pour en extraire le texte, puis réécrit le texte extrait sous forme de fichier JSON sur le volume.

Création et téléchargement d'un exemple de PDF

Pour cet exemple, vous avez besoin d'un document PDF sur votre volume FSx for ONTAP. Le script Python suivant génère une facture PDF simple et la télécharge via le point d'accès. Exécutez ce script sur votre machine locale (pas dans Lambda).

$ pip install fpdf2 boto3
# create_invoice.py — run locally to generate and upload a sample PDF from fpdf import FPDF import boto3 pdf = FPDF() pdf.add_page() pdf.set_font("Helvetica", "B", 24) pdf.cell(0, 15, "INVOICE", new_x="LMARGIN", new_y="NEXT", align="C") pdf.set_font("Helvetica", "", 12) pdf.cell(0, 8, "Invoice Number: INV-2024-00142", new_x="LMARGIN", new_y="NEXT") pdf.cell(0, 8, "Date: January 15, 2024", new_x="LMARGIN", new_y="NEXT") pdf.cell(0, 8, "Customer: Example Corp", new_x="LMARGIN", new_y="NEXT") pdf.ln(5) pdf.set_font("Helvetica", "B", 12) pdf.cell(80, 8, "Description", border=1) pdf.cell(30, 8, "Qty", border=1, align="C") pdf.cell(40, 8, "Unit Price", border=1, align="R") pdf.cell(40, 8, "Amount", border=1, align="R") pdf.ln() pdf.set_font("Helvetica", "", 12) for desc, qty, price, amt in [ ("Cloud Storage Service", "1", "$2,400.00", "$2,400.00"), ("Data Transfer (TB)", "5", "$90.00", "$450.00"), ("Technical Support", "1", "$500.00", "$500.00"), ]: pdf.cell(80, 8, desc, border=1) pdf.cell(30, 8, qty, border=1, align="C") pdf.cell(40, 8, price, border=1, align="R") pdf.cell(40, 8, amt, border=1, align="R") pdf.ln() s3 = boto3.client('s3') s3.put_object( Bucket='my-ap-alias-ext-s3alias', Key='samples/documents/invoice.pdf', Body=pdf.output(), ContentType='application/pdf' ) print("Uploaded invoice.pdf")
$ python3 create_invoice.py

Code de la fonction Lambda

Enregistrez le code suivant souslambda_function.py.

import boto3 import json s3 = boto3.client('s3') textract = boto3.client('textract') def lambda_handler(event, context): bucket = event['access_point_alias'] key = event['key'] # Read the PDF from FSx through the access point response = s3.get_object(Bucket=bucket, Key=key) document_bytes = response['Body'].read() # Extract text with Textract textract_response = textract.detect_document_text( Document={'Bytes': document_bytes} ) lines = [ block['Text'] for block in textract_response['Blocks'] if block['BlockType'] == 'LINE' ] # Write extracted text as JSON back to FSx result = { 'source_file': key, 'total_lines': len(lines), 'extracted_text': lines } output_key = key.rsplit('.', 1)[0] + '_extracted.json' s3.put_object( Bucket=bucket, Key=output_key, Body=json.dumps(result, indent=2), ContentType='application/json' ) return { 'lines_extracted': len(lines), 'output_key': output_key }

Création et appel de la fonction

$ zip textract-function.zip lambda_function.py aws lambda create-function \ --function-name fsxn-text-extractor \ --runtime python3.12 \ --handler lambda_function.lambda_handler \ --role arn:aws:iam::account-id:role/fsxn-lambda-file-processor \ --zip-file fileb://textract-function.zip \ --timeout 30 \ --memory-size 256 aws lambda invoke \ --function-name fsxn-text-extractor \ --cli-binary-format raw-in-base64-out \ --payload '{"access_point_alias": "my-ap-alias-ext-s3alias", "key": "samples/documents/invoice.pdf"}' \ response.json cat response.json

Exemple de sortie :

{"lines_extracted": 22, "output_key": "samples/documents/invoice_extracted.json"}

Exemple 3 : Transcrire des fichiers audio

Cet exemple démarre une tâche Amazon Transcribe pour un fichier audio stocké sur votre volume FSx for ONTAP. Amazon Transcribe lit le fichier audio directement depuis le point d'accès en utilisant l'alias du point d'accès indiqué dans l'URI du fichier multimédia. Lorsque le travail est terminé, la fonction réécrit la transcription sur le volume.

Code de la fonction Lambda

Enregistrez le code suivant souslambda_function.py.

import boto3 import json import time import urllib.request s3 = boto3.client('s3') transcribe = boto3.client('transcribe') def lambda_handler(event, context): bucket = event['access_point_alias'] key = event['key'] media_format = key.rsplit('.', 1)[-1] # mp3, wav, etc. # Start a Transcribe job pointing to the file on FSx job_name = f"fsxn-{int(time.time())}" transcribe.start_transcription_job( TranscriptionJobName=job_name, Media={'MediaFileUri': f's3://{bucket}/{key}'}, MediaFormat=media_format, LanguageCode='en-US' ) # Wait for the job to complete while True: status = transcribe.get_transcription_job( TranscriptionJobName=job_name ) state = status['TranscriptionJob']['TranscriptionJobStatus'] if state in ('COMPLETED', 'FAILED'): break time.sleep(5) if state == 'FAILED': raise Exception( status['TranscriptionJob'].get('FailureReason', 'Unknown error') ) # Download the transcript transcript_uri = status['TranscriptionJob']['Transcript']['TranscriptFileUri'] with urllib.request.urlopen(transcript_uri) as resp: transcript_data = json.loads(resp.read()) transcript_text = transcript_data['results']['transcripts'][0]['transcript'] # Write the transcript back to FSx result = { 'source_file': key, 'job_name': job_name, 'transcript': transcript_text } output_key = key.rsplit('.', 1)[0] + '_transcript.json' s3.put_object( Bucket=bucket, Key=output_key, Body=json.dumps(result, indent=2), ContentType='application/json' ) return { 'transcript_length': len(transcript_text), 'output_key': output_key }

Création et appel de la fonction

$ zip transcribe-function.zip lambda_function.py aws lambda create-function \ --function-name fsxn-audio-transcriber \ --runtime python3.12 \ --handler lambda_function.lambda_handler \ --role arn:aws:iam::account-id:role/fsxn-lambda-file-processor \ --zip-file fileb://transcribe-function.zip \ --timeout 120 aws lambda invoke \ --function-name fsxn-audio-transcriber \ --cli-binary-format raw-in-base64-out \ --payload '{"access_point_alias": "my-ap-alias-ext-s3alias", "key": "samples/audio/sample-audio.mp3"}' \ --cli-read-timeout 180 \ response.json cat response.json
Note

La tâche Transcribe prend généralement de 15 à 45 secondes. Le délai d'expiration de la fonction est fixé à 120 secondes pour permettre cela.

Considérations

  • L'origine Internet est requise pour la configuration par défaut. Par défaut, Lambda accède à Amazon S3 depuis une infrastructure gérée extérieure à votre VPC, qui nécessite un point d'accès d'origine Internet. Si vous attachez votre fonction Lambda à un VPC, vous pouvez utiliser un VPC-origin point d'accès à la place. Consultez les prérequis pour plus de détails.

  • Limites de taille de fichier. Les fonctions Lambda ont une mémoire maximale de 10 Go et une durée d'exécution maximale de 15 minutes. Pour les fichiers volumineux, envisagez d'utiliser des lectures par plage (GetObjectavec Range en-tête) ou de diffuser la réponse en continu.

  • Limites d'extraction. L'DetectDocumentTextAPI synchrone accepte les documents d'une taille maximale de 10 Mo et 1 page. Pour les documents de plusieurs pages, utilisez l'API asynchroneStartDocumentTextDetection.

  • Transcrivez les lectures directement depuis le point d'accès. Amazon Transcribe accepte l'alias du point d'accès dans le MediaFileUri paramètre ()s3://ap-alias/key. La fonction Lambda n'a pas besoin de télécharger et de retélécharger le fichier audio.

  • Autorisations utilisateur du système de fichiers. L'utilisateur du système de fichiers associé au point d'accès doit disposer d'une autorisation de lecture sur les fichiers d'entrée et d'écriture sur les répertoires de sortie.

Nettoyage

Pour éviter des frais permanents, supprimez les ressources que vous avez créées dans ce didacticiel.

$ # Delete Lambda functions aws lambda delete-function --function-name fsxn-thumbnail-generator aws lambda delete-function --function-name fsxn-text-extractor aws lambda delete-function --function-name fsxn-audio-transcriber # Delete the IAM role and policies aws iam delete-role-policy \ --role-name fsxn-lambda-file-processor \ --policy-name fsxn-access-point-policy aws iam detach-role-policy \ --role-name fsxn-lambda-file-processor \ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole aws iam delete-role --role-name fsxn-lambda-file-processor # Delete sample files from your FSx volume aws s3 rm s3://my-ap-alias-ext-s3alias/samples/ --recursive