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-attachmentsAWS CLI version 1 ou version 2 installée et configurée. Les
aws lambda invokecommandes 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. Remplacez-le par l'alias de votre point d'accès tout au long de ce didacticiel.my-ap-alias-ext-s3alias
Exemple d'image : Téléchargez l'image Blue Marble de la NASA
(domaine public, 2,4 Mo) et enregistrez-la sous sample-image.jpg.Exemple audio : téléchargez le fichier audio extrait
du didacticiel de démarrage d'Amazon Transcribe (410 Ko) et enregistrez-le sous. sample-audio.mp3
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 region, et account-id par vos valeurs.access-point-name
Enregistrez la politique de confiance suivante sous
trust-policy.json.{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole" } ] }Enregistrez la politique d'autorisation intégrée suivante sous
permissions-policy.jsonle 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": "*" } ] }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-namefsxn-lambda-file-processor\ --assume-role-policy-document file://trust-policy.json aws iam attach-role-policy \ --role-namefsxn-lambda-file-processor\ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole aws iam put-role-policy \ --role-namefsxn-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-namefsxn-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-namefsxn-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-namefsxn-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-namefsxn-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-namefsxn-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-namefsxn-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 (
GetObjectavecRangeen-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
MediaFileUriparamètre ()s3://. La fonction Lambda n'a pas besoin de télécharger et de retélécharger le fichier audio.ap-alias/keyAutorisations 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-namefsxn-thumbnail-generatoraws lambda delete-function --function-namefsxn-text-extractoraws lambda delete-function --function-namefsxn-audio-transcriber# Delete the IAM role and policies aws iam delete-role-policy \ --role-namefsxn-lambda-file-processor\ --policy-name fsxn-access-point-policy aws iam detach-role-policy \ --role-namefsxn-lambda-file-processor\ --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole aws iam delete-role --role-namefsxn-lambda-file-processor# Delete sample files from your FSx volume aws s3 rm s3://my-ap-alias-ext-s3alias/samples/ --recursive