

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
<a name="tutorial-process-files-with-lambda"></a>

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](#tutorial-lambda-thumbnail) | Gambar JPEG | Bantal (perpustakaan gambar) | Thumbnail yang diubah ukurannya | 
| [Contoh 2: Ekstrak teks dari dokumen](#tutorial-lambda-textract) | Dokumen PDF | Amazon Textract | Teks yang diekstraksi (JSON) | 
| [Contoh 3: Transcribe file audio](#tutorial-lambda-transcribe) | 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
<a name="tutorial-lambda-prerequisites"></a>

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, lihat[Membuat titik akses](fsxn-creating-access-points.md).
+ 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 invoke`Perintah 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](configuring-network-access-for-s3-access-points.md).

## Langkah 1: Unggah file sampel
<a name="tutorial-lambda-upload-samples"></a>

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.
+ **Contoh gambar:** Unduh [gambar Marmer Biru NASA](https://eoimages.gsfc.nasa.gov/images/imagerecords/73000/73909/world.topo.bathy.200412.3x5400x2700.jpg) (domain publik, 2,4 MB) dan simpan sebagai`sample-image.jpg`.
+ **Sampel audio:** Unduh [file audio sampel](https://d1.awsstatic.com/tmt/create-audio-transcript-transcribe/transcribe-sample.5fc2109bb28268d10fbc677e64b7e59256783d3c.mp3) dari [tutorial memulai Amazon Transcribe](https://docs.aws.amazon.com/hands-on/latest/create-audio-transcript-transcribe/create-audio-transcript-transcribe.html) (410 KB) dan simpan sebagai. `sample-audio.mp3`

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](https://docs.aws.amazon.com/hands-on/latest/create-audio-transcript-transcribe/create-audio-transcript-transcribe.html) (410 KB). Sampel PDF dihasilkan di[Contoh 2: Ekstrak teks dari dokumen](#tutorial-lambda-textract).

## Langkah 2: Buat peran eksekusi Lambda
<a name="tutorial-lambda-create-role"></a>

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.

### Untuk membuat peran eksekusi Lambda
<a name="tutorial-lambda-create-role-steps"></a>

Ganti `{{region}}``{{account-id}}`,, dan `{{access-point-name}}` dengan nilai-nilai Anda.

1. Simpan kebijakan kepercayaan berikut sebagai`trust-policy.json`.

   ```
   {
       "Version": "2012-10-17", 		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {"Service": "lambda.amazonaws.com"},
               "Action": "sts:AssumeRole"
           }
       ]
   }
   ```

1. 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": "*"
           }
       ]
   }
   ```

1. 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
<a name="tutorial-lambda-workflow-integration"></a>

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](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-run-lambda-schedule.html) 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](https://docs.aws.amazon.com/apigateway/latest/developerguide/getting-started-with-lambda-integration.html) 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](https://docs.aws.amazon.com/step-functions/latest/dg/connect-lambda.html) di Panduan *AWS Step Functions Pengembang*.

## Contoh 1: Hasilkan thumbnail gambar
<a name="tutorial-lambda-thumbnail"></a>

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 sebagai`lambda_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
<a name="tutorial-lambda-textract"></a>

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 sebagai`lambda_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
<a name="tutorial-lambda-transcribe"></a>

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 sebagai`lambda_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
<a name="tutorial-lambda-considerations"></a>
+ **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 (`GetObject`dengan `Range` header) atau streaming respons.
+ **Batas Textract.** `DetectDocumentText`API sinkron menerima dokumen hingga 10 MB dan 1 halaman. Untuk dokumen multi-halaman, gunakan API asinkron`StartDocumentTextDetection`.
+ **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
<a name="tutorial-lambda-clean-up"></a>

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
```