View a markdown version of this page

Memproses file tanpa server menggunakan Lambda - fsX untuk ONTAP

Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.

Memproses file tanpa server menggunakan Lambda

Alur kerja pemrosesan file sering dimulai dengan file yang tiba di berbagi file NFS atau SMB — dokumen yang dipindai dari kantor cabang, gambar yang diunggah oleh tim lapangan, audio yang diambil dari pusat kontak, atau file data yang dikirim oleh mitra.

Dengan jalur akses Amazon S3 yang dilampirkan ke FSx untuk volume ONTAP, AWS Lambda fungsi membaca dan menulis file secara langsung menggunakan Amazon S3 API. File-level operasi dapat diproses tanpa server terhadap data yang sama yang diakses pengguna dan aplikasi Anda melalui NFS dan SMB.

Tutorial ini menunjukkan tiga pola pemrosesan file yang umum. Setiap contoh membaca file dari volume melalui titik akses, memprosesnya dengan AWS layanan atau perpustakaan, dan menulis hasilnya kembali ke volume.

Contoh Input Pemrosesan Output
Contoh 1: Hasilkan thumbnail gambar Gambar JPEG Bantal (perpustakaan gambar) Thumbnail yang diubah ukurannya
Contoh 2: Ekstrak teks dari dokumen Dokumen PDF Amazon Textract Teks yang diekstraksi (JSON)
Contoh 3: Transcribe file audio Audio MP3 Amazon Transcribe Transkrip (JSON)
catatan

Tutorial ini membutuhkan waktu sekitar 40 hingga 60 menit untuk menyelesaikannya. Yang Layanan AWS digunakan dikenakan biaya untuk sumber daya yang Anda buat. Jika Anda menyelesaikan semua langkah, termasuk bagian Pembersihan segera, biaya yang diharapkan kurang dari $1 di AS Timur (Virginia Utara). Wilayah AWS Perkiraan ini tidak termasuk biaya berkelanjutan untuk FSx untuk volume ONTAP itu sendiri.

Prasyarat

Sebelum Anda mulai, pastikan Anda memiliki yang berikut:

  • FSx untuk volume ONTAP dengan titik akses Amazon S3 terpasang. Untuk petunjuk tentang cara membuat titik akses, lihatMembuat titik akses.

  • Alias titik akses untuk titik akses Anda. Anda dapat menemukannya di konsol Amazon FSx atau dengan menjalankannya. aws fsx describe-s3-access-point-attachments

  • AWS CLI versi 1 atau versi 2 diinstal dan dikonfigurasi. aws lambda invokePerintah dalam tutorial ini mencakup --cli-binary-format raw-in-base64-out opsi, yang diperlukan dalam AWS CLI versi 2 sehingga muatan JSON mentah tidak ditafsirkan sebagai base64. Jika Anda menggunakan AWS CLI versi 1, hilangkan opsi itu.

  • Izin IAM untuk pemanggil (pengguna atau peran yang menjalankan tutorial ini) untuk memanggil fungsi Lambda (lambda:CreateFunction,), lambda:InvokeFunction mengakses jalur akses Amazon S3 (,s3:GetObject)s3:PutObject, dan meneruskan peran eksekusi Lambda (). iam:PassRole

catatan

Tutorial ini menggunakan konfigurasi Lambda default, di mana fungsi berjalan di jaringan terkelola di luar VPC Anda. Dalam hal ini, titik akses harus memiliki asal jaringan internet sehingga fungsinya dapat mencapainya. Jika Anda melampirkan fungsi Lambda ke VPC, Anda dapat menggunakan asal jaringan VPC pada titik akses; VPC harus memiliki Gateway Amazon S3 atau titik akhir Antarmuka. Untuk informasi selengkapnya, lihat Mengkonfigurasi akses jaringan untuk jalur akses Amazon S3.

Langkah 1: Unggah file sampel

Unduh file sampel berikut dan unggah ke FSx Anda untuk volume ONTAP melalui titik akses. Ganti my-ap-alias-ext-s3alias dengan alias access point Anda di seluruh tutorial ini.

Unggah file sampel ke FSx Anda untuk volume ONTAP melalui titik akses.

$ 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
catatan

Gambar sampel adalah foto Marmer Biru NASA (domain publik, 2,4 MB). Audio sampel berasal dari tutorial memulai Amazon Transcribe (410 KB). Sampel PDF dihasilkan diContoh 2: Ekstrak teks dari dokumen.

Langkah 2: Buat peran eksekusi Lambda

Fungsi Lambda mengasumsikan peran eksekusi untuk berinteraksi dengan yang lain. Layanan AWS Untuk tutorial ini, lampirkan AWSLambdaBasicExecutionRole kebijakan AWS-managed untuk logging CloudWatch Log, lalu tambahkan kebijakan inline yang memberikan akses ke jalur akses Amazon S3 dan ke Textract dan Transcribe API yang digunakan contoh.

Ganti regionaccount-id,, dan access-point-name dengan nilai-nilai Anda.

  1. Simpan kebijakan kepercayaan berikut sebagaitrust-policy.json.

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": {"Service": "lambda.amazonaws.com"}, "Action": "sts:AssumeRole" } ] }
  2. Simpan kebijakan izin sebaris berikut sebagai. permissions-policy.json Ini memberikan akses ke titik akses dan ke layanan tambahan yang digunakan contoh.

    { "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. Buat peran, lampirkan kebijakan logging terkelola, dan lampirkan kebijakan inline.

    $ 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

Mengintegrasikan ke dalam alur kerja Anda

Contoh dalam tutorial ini menggunakan pemanggilan manual dengan acara pengujian. Dalam produksi, Anda dapat memicu fungsi-fungsi ini secara otomatis menggunakan pendekatan berikut:

  • EventBridge Jadwal Amazon. Jalankan fungsi pada jadwal berulang (misalnya, setiap jam atau setiap hari) untuk memproses file baru. Fungsi ini dapat membuat daftar file melalui titik akses dan memproses apa pun yang belum diproses. Untuk informasi selengkapnya, lihat Menjadwalkan fungsi Lambda yang digunakan EventBridge di EventBridgePanduan Pengguna Amazon.

  • Amazon API Gateway. Ekspos fungsi sebagai API HTTP sehingga pengguna atau aplikasi dapat meminta pemrosesan file tertentu sesuai permintaan. Untuk informasi selengkapnya, lihat Membangun API REST API Gateway API dengan integrasi Lambda di Panduan Pengembang Amazon API Gateway.

  • Step Functions. Mengatur pipeline pemrosesan file multi-langkah yang menggabungkan beberapa fungsi Lambda. Misalnya, alur kerja yang mengekstrak teks dari dokumen, menerjemahkannya, dan menulis hasilnya kembali ke volume. Untuk informasi selengkapnya, lihat Memanggil Lambda dengan Step Functions di Panduan AWS Step Functions Pengembang.

Contoh 1: Hasilkan thumbnail gambar

Contoh ini membaca gambar JPEG dari FSx Anda untuk volume ONTAP, mengubah ukurannya menjadi thumbnail 200 piksel menggunakan pustaka gambar Pillow, dan menulis thumbnail kembali ke volume.

Kode fungsi Lambda

Simpan kode berikut sebagailambda_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 }

Buat dan panggil fungsi

Fungsi ini membutuhkan perpustakaan Bantal. Buat paket penyebaran yang menyertakan Pillow yang dibuat untuk 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

Verifikasi hasilnya

$ 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

Gambar 2,4 MB asli (5400 × 2700 piksel) diubah ukurannya menjadi thumbnail 7 KB (200 × 100 piksel).

Contoh 2: Ekstrak teks dari dokumen

Contoh ini membaca dokumen PDF dari FSx Anda untuk volume ONTAP, mengirimkannya ke Amazon Textract untuk mengekstrak teks, dan menulis teks yang diekstraksi sebagai file JSON kembali ke volume.

Buat dan unggah contoh PDF

Untuk contoh ini, Anda memerlukan dokumen PDF di FSx Anda untuk volume ONTAP. Skrip Python berikut menghasilkan PDF faktur sederhana dan mengunggahnya melalui titik akses. Jalankan skrip ini di mesin lokal Anda (bukan di 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

Kode fungsi Lambda

Simpan kode berikut sebagailambda_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 }

Buat dan panggil fungsi

$ 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

Contoh output:

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

Contoh 3: Transcribe file audio

Contoh ini memulai pekerjaan Amazon Transcribe untuk file audio yang disimpan di FSx Anda untuk volume ONTAP. Amazon Transcribe membaca file audio langsung dari titik akses menggunakan alias titik akses di URI file media. Ketika pekerjaan selesai, fungsi menulis transkrip kembali ke volume.

Kode fungsi Lambda

Simpan kode berikut sebagailambda_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 }

Buat dan panggil fungsi

$ 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
catatan

Pekerjaan Transcribe biasanya membutuhkan waktu 15 hingga 45 detik untuk menyelesaikannya. Batas waktu fungsi diatur ke 120 detik untuk memungkinkan ini.

Pertimbangan-pertimbangan

  • Asal internet diperlukan untuk konfigurasi default. Secara default, Lambda mengakses Amazon S3 dari infrastruktur terkelola di luar VPC Anda, yang memerlukan jalur akses asal internet. Jika Anda melampirkan fungsi Lambda Anda ke VPC, Anda dapat menggunakan titik akses sebagai VPC-origin gantinya. Lihat prasyarat untuk detailnya.

  • Batas ukuran file. Fungsi Lambda memiliki memori maksimum 10 GB dan waktu eksekusi maksimum 15 menit. Untuk file besar, pertimbangkan untuk menggunakan pembacaan rentang (GetObjectdengan Range header) atau streaming respons.

  • Batas Textract. DetectDocumentTextAPI sinkron menerima dokumen hingga 10 MB dan 1 halaman. Untuk dokumen multi-halaman, gunakan API asinkronStartDocumentTextDetection.

  • Transcribe membaca langsung dari titik akses. Amazon Transcribe menerima alias access point di parameter (). MediaFileUri s3://ap-alias/key Fungsi Lambda tidak perlu mengunduh dan mengunggah ulang file audio.

  • Izin pengguna sistem file. Pengguna sistem file yang terkait dengan titik akses harus memiliki izin membaca pada file input dan menulis izin pada direktori output.

Bersihkan

Untuk menghindari biaya yang sedang berlangsung, hapus sumber daya yang Anda buat dalam tutorial ini.

$ # 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