Membuat aplikasi pemrosesan file tanpa server - AWS Lambda

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

Membuat aplikasi pemrosesan file tanpa server

Salah satu kasus penggunaan yang paling umum untuk Lambda adalah melakukan tugas pemrosesan file. Misalnya, Anda mungkin menggunakan fungsi Lambda untuk secara otomatis membuat PDF file dari HTML file atau gambar, atau untuk membuat thumbnail saat pengguna mengunggah gambar.

Dalam contoh ini, Anda membuat aplikasi yang secara otomatis mengenkripsi PDF file saat diunggah ke bucket Amazon Simple Storage Service (Amazon S3). Untuk mengimplementasikan aplikasi ini, Anda membuat sumber daya berikut:

  • Bucket S3 bagi pengguna untuk mengunggah PDF file

  • Fungsi Lambda dalam Python yang membaca file yang diunggah dan membuat versi terenkripsi yang dilindungi kata sandi

  • Bucket S3 kedua untuk Lambda untuk menyimpan file terenkripsi

Anda juga membuat kebijakan AWS Identity and Access Management (IAM) untuk memberikan izin fungsi Lambda Anda untuk melakukan operasi baca dan tulis pada bucket S3 Anda.

Diagram yang menunjukkan aliran data antara bucket S3, fungsi Lambda, dan bucket S3 lainnya
Tip

Jika Anda baru mengenal Lambda, kami sarankan Anda melakukan tutorial Buat fungsi Lambda pertama Anda sebelum membuat aplikasi contoh ini.

Anda dapat menerapkan aplikasi secara manual dengan membuat dan mengonfigurasi resource dengan AWS Management Console atau AWS Command Line Interface ()AWS CLI. Anda juga dapat menerapkan aplikasi dengan menggunakan AWS Serverless Application Model (AWS SAM). AWS SAM adalah alat infrastruktur sebagai kode (IAc). Dengan IAc, Anda tidak membuat sumber daya secara manual, tetapi mendefinisikannya dalam kode dan kemudian menerapkannya secara otomatis.

Jika Anda ingin mempelajari lebih lanjut tentang menggunakan Lambda dengan IAc sebelum menerapkan aplikasi contoh ini, lihat. Menggunakan Lambda dengan infrastruktur sebagai kode (IAc)

Prasyarat

Sebelum Anda dapat membuat aplikasi contoh, pastikan Anda memiliki alat baris perintah yang diperlukan diinstal.

  • AWS CLI

    Anda dapat menerapkan resource untuk aplikasi secara manual menggunakan aplikasi AWS Management Console atau file. AWS CLI Untuk menggunakanCLI, instal dengan mengikuti petunjuk instalasi di Panduan AWS Command Line Interface Pengguna.

  • AWS SAM CLI

    Jika Anda ingin menerapkan aplikasi contoh menggunakan AWS SAM, Anda perlu menginstal aplikasi AWS CLI dan aplikasi. AWS SAM CLI Untuk menginstal AWS SAM CLI, ikuti petunjuk instalasi di Panduan AWS SAM Pengguna.

  • modul pytest

    Setelah menerapkan aplikasi, Anda dapat mengujinya menggunakan skrip pengujian Python otomatis yang kami sediakan. Untuk menggunakan skrip ini, instal pytest paket di lingkungan pengembangan lokal Anda dengan menjalankan perintah berikut:

    pip install pytest

Untuk menerapkan aplikasi menggunakan AWS SAM, Docker juga harus diinstal pada mesin build Anda.

Mengunduh contoh file aplikasi

Untuk membuat dan menguji aplikasi contoh, Anda membuat file berikut di direktori project:

  • lambda_function.py- kode fungsi Python untuk fungsi Lambda yang melakukan enkripsi file

  • requirements.txt- file manifes yang mendefinisikan dependensi yang dibutuhkan kode fungsi Python Anda

  • template.yaml- AWS SAM Template yang dapat Anda gunakan untuk menyebarkan aplikasi

  • test_pdf_encrypt.py- skrip pengujian yang dapat Anda gunakan untuk menguji aplikasi Anda secara otomatis

  • pytest.ini- file konfigurasi untuk skrip pengujian

Perluas bagian berikut untuk melihat kode dan mempelajari lebih lanjut tentang peran setiap file dalam membuat dan menguji aplikasi Anda. Untuk membuat file di mesin lokal Anda, salin dan tempel kode di bawah ini, atau unduh file dari aws-lambda-developer-guide GitHub repo.

Salin dan tempel kode berikut ke dalam file bernamalambda_function.py.

from pypdf import PdfReader, PdfWriter import uuid import os from urllib.parse import unquote_plus import boto3 # Create the S3 client to download and upload objects from S3 s3_client = boto3.client('s3') def lambda_handler(event, context): # Iterate over the S3 event object and get the key for all uploaded files for record in event['Records']: bucket = record['s3']['bucket']['name'] key = unquote_plus(record['s3']['object']['key']) # Decode the S3 object key to remove any URL-encoded characters download_path = f'/tmp/{uuid.uuid4()}.pdf' # Create a path in the Lambda tmp directory to save the file to upload_path = f'/tmp/converted-{uuid.uuid4()}.pdf' # Create another path to save the encrypted file to # If the file is a PDF, encrypt it and upload it to the destination S3 bucket if key.lower().endswith('.pdf'): s3_client.download_file(bucket, key, download_path) encrypt_pdf(download_path, upload_path) encrypted_key = add_encrypted_suffix(key) s3_client.upload_file(upload_path, f'{bucket}-encrypted', encrypted_key) # Define the function to encrypt the PDF file with a password def encrypt_pdf(file_path, encrypted_file_path): reader = PdfReader(file_path) writer = PdfWriter() for page in reader.pages: writer.add_page(page) # Add a password to the new PDF writer.encrypt("my-secret-password") # Save the new PDF to a file with open(encrypted_file_path, "wb") as file: writer.write(file) # Define a function to add a suffix to the original filename after encryption def add_encrypted_suffix(original_key): filename, extension = original_key.rsplit('.', 1) return f'{filename}_encrypted.{extension}'
catatan

Dalam contoh kode ini, kata sandi untuk file terenkripsi (my-secret-password) di-hardcode ke dalam kode fungsi. Dalam aplikasi produksi, jangan sertakan informasi sensitif seperti kata sandi dalam kode fungsi Anda. Gunakan AWS Secrets Manager untuk menyimpan parameter sensitif dengan aman.

Kode fungsi python berisi tiga fungsi - fungsi handler yang dijalankan Lambda saat fungsi Anda dipanggil, dan dua fungsi terpisah bernama add_encrypted_suffix dan encrypt_pdf yang dipanggil handler untuk melakukan enkripsi. PDF

Saat fungsi Anda dipanggil oleh Amazon S3, Lambda meneruskan argumen peristiwa JSON yang diformat ke fungsi yang berisi detail tentang peristiwa yang menyebabkan pemanggilan. Dalam hal ini, informasi termasuk nama bucket S3 dan kunci objek untuk file yang diunggah. Untuk mempelajari lebih lanjut tentang format objek acara untuk Amazon S3, lihat. Memproses pemberitahuan acara Amazon S3 dengan Lambda

Fungsi Anda kemudian menggunakan AWS SDK for Python (Boto3) untuk mengunduh PDF file yang ditentukan dalam objek acara ke direktori penyimpanan sementara lokalnya, sebelum mengenkripsi mereka menggunakan perpustakaan. pypdf

Terakhir, fungsi menggunakan Boto3 SDK untuk menyimpan file terenkripsi di bucket tujuan S3 Anda.

Salin dan tempel kode berikut ke dalam file bernamarequirements.txt.

boto3 pypdf

Untuk contoh ini, kode fungsi Anda hanya memiliki dua dependensi yang bukan bagian dari pustaka Python standar - untuk SDK Python (Boto3) dan pypdf paket yang digunakan fungsi untuk melakukan enkripsi. PDF

catatan

Versi SDK untuk Python (Boto3) disertakan sebagai bagian dari runtime Lambda, sehingga kode Anda akan berjalan tanpa menambahkan Boto3 ke paket penerapan fungsi Anda. Namun, untuk mempertahankan kontrol penuh dependensi fungsi Anda dan menghindari kemungkinan masalah dengan misalignment versi, praktik terbaik untuk Python adalah menyertakan semua dependensi fungsi dalam paket penerapan fungsi Anda. Lihat Dependensi runtime dengan Python untuk mempelajari selengkapnya.

Salin dan tempel kode berikut ke dalam file bernamatemplate.yaml.

AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Resources: EncryptPDFFunction: Type: AWS::Serverless::Function Properties: FunctionName: EncryptPDF Architectures: [x86_64] CodeUri: ./ Handler: lambda_function.lambda_handler Runtime: python3.12 Timeout: 15 MemorySize: 256 LoggingConfig: LogFormat: JSON Policies: - AmazonS3FullAccess Events: S3Event: Type: S3 Properties: Bucket: !Ref PDFSourceBucket Events: s3:ObjectCreated:* PDFSourceBucket: Type: AWS::S3::Bucket Properties: BucketName: EXAMPLE-BUCKET EncryptedPDFBucket: Type: AWS::S3::Bucket Properties: BucketName: EXAMPLE-BUCKET-encrypted

AWS SAM Template menentukan sumber daya yang Anda buat untuk aplikasi Anda. Dalam contoh ini, template mendefinisikan fungsi Lambda menggunakan AWS::Serverless::Function tipe dan dua bucket S3 menggunakan tipe. AWS::S3::Bucket Nama bucket yang ditentukan dalam template adalah placeholder. Sebelum menerapkan aplikasi AWS SAM, Anda perlu mengedit template untuk mengganti nama bucket dengan nama unik global yang memenuhi aturan penamaan bucket S3. Langkah ini dijelaskan lebih lanjut dalamMenyebarkan sumber daya menggunakan AWS SAM.

Definisi sumber daya fungsi Lambda mengonfigurasi pemicu untuk fungsi menggunakan properti event. S3Event Pemicu ini menyebabkan fungsi Anda dipanggil setiap kali objek dibuat di bucket sumber Anda.

Definisi fungsi juga menentukan kebijakan AWS Identity and Access Management (IAM) yang akan dilampirkan ke peran eksekusi fungsi. Kebijakan AWS terkelola AmazonS3FullAccess memberi fungsi Anda izin yang diperlukan untuk membaca dan menulis objek ke Amazon S3.

Salin dan tempel kode berikut ke dalam file bernamatest_pdf_encrypt.py.

import boto3 import json import pytest import time import os @pytest.fixture def lambda_client(): return boto3.client('lambda') @pytest.fixture def s3_client(): return boto3.client('s3') @pytest.fixture def logs_client(): return boto3.client('logs') @pytest.fixture(scope='session') def cleanup(): # Create a new S3 client for cleanup s3_client = boto3.client('s3') yield # Cleanup code will be executed after all tests have finished # Delete test.pdf from the source bucket source_bucket = 'EXAMPLE-BUCKET' source_file_key = 'test.pdf' s3_client.delete_object(Bucket=source_bucket, Key=source_file_key) print(f"\nDeleted {source_file_key} from {source_bucket}") # Delete test_encrypted.pdf from the destination bucket destination_bucket = 'EXAMPLE-BUCKET-encrypted' destination_file_key = 'test_encrypted.pdf' s3_client.delete_object(Bucket=destination_bucket, Key=destination_file_key) print(f"Deleted {destination_file_key} from {destination_bucket}") @pytest.mark.order(1) def test_source_bucket_available(s3_client): s3_bucket_name = 'EXAMPLE-BUCKET' file_name = 'test.pdf' file_path = os.path.join(os.path.dirname(__file__), file_name) file_uploaded = False try: s3_client.upload_file(file_path, s3_bucket_name, file_name) file_uploaded = True except: print("Error: couldn't upload file") assert file_uploaded, "Could not upload file to S3 bucket" @pytest.mark.order(2) def test_lambda_invoked(logs_client): # Wait for a few seconds to make sure the logs are available time.sleep(5) # Get the latest log stream for the specified log group log_streams = logs_client.describe_log_streams( logGroupName='/aws/lambda/EncryptPDF', orderBy='LastEventTime', descending=True, limit=1 ) latest_log_stream_name = log_streams['logStreams'][0]['logStreamName'] # Retrieve the log events from the latest log stream log_events = logs_client.get_log_events( logGroupName='/aws/lambda/EncryptPDF', logStreamName=latest_log_stream_name ) success_found = False for event in log_events['events']: message = json.loads(event['message']) status = message.get('record', {}).get('status') if status == 'success': success_found = True break assert success_found, "Lambda function execution did not report 'success' status in logs." @pytest.mark.order(3) def test_encrypted_file_in_bucket(s3_client): # Specify the destination S3 bucket and the expected converted file key destination_bucket = 'EXAMPLE-BUCKET-encrypted' converted_file_key = 'test_encrypted.pdf' try: # Attempt to retrieve the metadata of the converted file from the destination S3 bucket s3_client.head_object(Bucket=destination_bucket, Key=converted_file_key) except s3_client.exceptions.ClientError as e: # If the file is not found, the test will fail pytest.fail(f"Converted file '{converted_file_key}' not found in the destination bucket: {str(e)}") def test_cleanup(cleanup): # This test uses the cleanup fixture and will be executed last pass

Skrip pengujian otomatis menjalankan tiga fungsi pengujian untuk mengonfirmasi pengoperasian aplikasi Anda yang benar:

  • Pengujian test_source_bucket_available mengonfirmasi bahwa bucket sumber Anda telah berhasil dibuat dengan mengunggah PDF file pengujian ke bucket.

  • Pengujian test_lambda_invoked menginterogasi aliran CloudWatch log Log terbaru untuk fungsi Anda guna mengonfirmasi bahwa saat Anda mengunggah file pengujian, fungsi Lambda Anda berjalan dan melaporkan keberhasilan.

  • Pengujian test_encrypted_file_in_bucket mengonfirmasi bahwa bucket tujuan Anda berisi file terenkripsi. test_encrypted.pdf

Setelah semua pengujian ini berjalan, skrip menjalankan langkah pembersihan tambahan untuk menghapus test.pdf dan test_encrypted.pdf file dari bucket sumber dan tujuan Anda.

Seperti halnya AWS SAM template, nama bucket yang ditentukan dalam file ini adalah placeholder. Sebelum menjalankan pengujian, Anda perlu mengedit file ini dengan nama bucket asli aplikasi Anda. Langkah ini dijelaskan lebih lanjut dalam Menguji aplikasi dengan skrip otomatis

Salin dan tempel kode berikut ke dalam file bernamapytest.ini.

[pytest] markers = order: specify test execution order

Ini diperlukan untuk menentukan urutan pengujian dalam test_pdf_encrypt.py skrip berjalan.

Menerapkan aplikasi

Anda dapat membuat dan menerapkan sumber daya untuk aplikasi contoh ini baik secara manual atau dengan menggunakan AWS SAM. Dalam lingkungan produksi, kami menyarankan Anda menggunakan alat IAC AWS SAM untuk menyebarkan seluruh aplikasi tanpa server dengan cepat dan berulang tanpa menggunakan proses manual.

Untuk contoh ini, ikuti konsol atau AWS CLI instruksi untuk mempelajari cara mengonfigurasi setiap AWS sumber daya secara terpisah, atau lanjutkan Menyebarkan sumber daya menggunakan AWS SAM untuk menerapkan aplikasi dengan cepat menggunakan beberapa CLI perintah.

Menyebarkan sumber daya secara manual

Untuk menerapkan aplikasi secara manual, Anda melakukan langkah-langkah berikut:

  • Buat bucket S3 sumber dan tujuan

  • Buat fungsi Lambda yang mengenkripsi PDF file dan menyimpan versi terenkripsi ke bucket S3

  • Konfigurasikan pemicu Lambda yang memanggil fungsi Anda saat objek diunggah ke bucket sumber

Ikuti petunjuk dalam paragraf berikut untuk membuat dan mengonfigurasi sumber daya Anda.

Buat dua ember S3

Pertama buat dua ember S3. Bucket pertama adalah bucket sumber tempat Anda akan mengunggah PDF file Anda. Bucket kedua digunakan oleh Lambda untuk menyimpan file terenkripsi saat Anda menjalankan fungsi.

Console
Untuk membuat bucket S3 (konsol)
  1. Buka halaman Bucket konsol Amazon S3.

  2. Pilih Buat bucket.

  3. Pada Konfigurasi umum, lakukan hal berikut:

    1. Untuk nama Bucket, masukkan nama unik global yang memenuhi aturan penamaan Amazon S3 Bucket. Nama bucket hanya dapat berisi huruf kecil, angka, titik (.), dan tanda hubung (-).

    2. Untuk Wilayah AWS, pilih yang paling Wilayah AWSdekat dengan lokasi geografis Anda. Kemudian dalam proses penerapan, Anda harus membuat fungsi Lambda Anda dalam Wilayah AWS hal yang sama, jadi catat wilayah yang Anda pilih.

  4. Biarkan semua opsi lain disetel ke nilai defaultnya dan pilih Buat bucket.

  5. Ulangi langkah 1 hingga 4 untuk membuat bucket tujuan Anda. Untuk nama BucketSOURCEBUCKET-encrypted, masukkan, di SOURCEBUCKET mana nama bucket sumber yang baru saja Anda buat.

AWS CLI
Untuk membuat bucket S3 ()AWS CLI
  1. Jalankan CLI perintah berikut untuk membuat bucket sumber Anda. Nama yang Anda pilih untuk bucket Anda harus unik secara global dan ikuti aturan penamaan Amazon S3 Bucket. Nama hanya dapat berisi huruf kecil, angka, titik (.), dan tanda hubung (-). Untuk region danLocationConstraint, pilih yang paling Wilayah AWSdekat dengan lokasi geografis Anda.

    aws s3api create-bucket --bucket SOURCEBUCKET --region us-west-2 \ --create-bucket-configuration LocationConstraint=us-west-2

    Kemudian dalam tutorial, Anda harus membuat fungsi Lambda Anda Wilayah AWS sama dengan bucket sumber Anda, jadi catat wilayah yang Anda pilih.

  2. Jalankan perintah berikut untuk membuat bucket tujuan Anda. Untuk nama bucket, Anda harus menggunakanSOURCEBUCKET-encrypted, di SOURCEBUCKET mana nama bucket sumber yang Anda buat di langkah 1. Untuk region danLocationConstraint, pilih yang sama dengan yang Wilayah AWS Anda gunakan untuk membuat bucket sumber Anda.

    aws s3api create-bucket --bucket SOURCEBUCKET-encrypted --region us-west-2 \ --create-bucket-configuration LocationConstraint=us-west-2

Buat peran eksekusi (AWS CLI hanya)

Peran eksekusi adalah IAM peran yang memberikan izin fungsi Lambda untuk Layanan AWS mengakses dan sumber daya. Saat Anda membuat fungsi menggunakan konsol Lambda, Lambda secara otomatis membuat peran eksekusi. Anda hanya perlu membuat peran secara manual jika Anda memilih untuk menerapkan aplikasi menggunakan. AWS CLI Untuk memberikan akses baca dan tulis fungsi Anda ke Amazon S3, Anda melampirkan kebijakan AWS terkelola. AmazonS3FullAccess

Console

Langkah ini hanya diperlukan jika Anda memilih untuk menerapkan aplikasi Anda menggunakan. AWS CLI

AWS CLI
Untuk membuat peran eksekusi dan melampirkan kebijakan AmazonS3FullAccess terkelola (AWS CLI)
  1. Simpan berikut ini JSON dalam file bernamatrust-policy.json. Kebijakan kepercayaan ini memungkinkan Lambda untuk menggunakan izin peran dengan memberikan lambda.amazonaws.com izin utama layanan untuk memanggil tindakan AWS Security Token Service ()AWS STS. AssumeRole

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
  2. Dari direktori tempat Anda menyimpan dokumen kebijakan JSON kepercayaan, jalankan CLI perintah berikut untuk membuat peran eksekusi.

    aws iam create-role --role-name LambdaS3Role --assume-role-policy-document file://trust-policy.json
  3. Untuk melampirkan kebijakan AmazonS3FullAccess terkelola, jalankan CLI perintah berikut.

    aws iam attach-role-policy --role-name LambdaS3Role --policy-arn arn:aws:iam::aws:policy/AmazonS3FullAccess

Buat paket penerapan fungsi

Untuk membuat fungsi Anda, Anda membuat paket deployment yang berisi kode fungsi dan dependensinya. Untuk aplikasi ini, kode fungsi Anda menggunakan pustaka terpisah untuk PDF enkripsi.

Untuk membuat paket deployment
  1. Arahkan ke direktori proyek yang berisi lambda_function.py dan requirements.txt file yang Anda buat atau unduh dari GitHub sebelumnya dan buat direktori baru bernamapackage.

  2. Instal dependensi yang ditentukan dalam requirements.txt file di package direktori Anda dengan menjalankan perintah berikut.

    pip install -r requirements.txt --target ./package/
  3. Buat file.zip yang berisi kode aplikasi Anda dan dependensinya. Di Linux atau macOS, jalankan perintah berikut dari antarmuka baris perintah Anda.

    cd package zip -r ../lambda_function.zip . cd .. zip lambda_function.zip lambda_function.py

    Di Windows, gunakan alat zip pilihan Anda untuk membuat file lambda_function.zip. Pastikan bahwa lambda_function.py file Anda dan folder yang berisi dependensi Anda semuanya berada di root file.zip.

Anda juga dapat membuat paket deployment menggunakan lingkungan virtual Python. Lihat Bekerja dengan arsip file.zip untuk fungsi Python Lambda

Buat fungsi Lambda

Anda sekarang menggunakan paket penyebaran yang Anda buat pada langkah sebelumnya untuk menyebarkan fungsi Lambda Anda.

Console
Untuk membuat fungsi (konsol)

Untuk membuat fungsi Lambda Anda menggunakan konsol, pertama-tama Anda membuat fungsi dasar yang berisi beberapa kode 'Hello world'. Anda kemudian mengganti kode ini dengan kode fungsi Anda sendiri dengan mengunggah file the.zip yang Anda buat pada langkah sebelumnya.

Untuk memastikan bahwa fungsi Anda tidak habis saat mengenkripsi PDF file besar, Anda mengonfigurasi pengaturan memori dan batas waktu fungsi. Anda juga mengatur format log fungsi keJSON. Mengkonfigurasi log JSON yang diformat diperlukan saat menggunakan skrip pengujian yang disediakan sehingga dapat membaca status pemanggilan fungsi dari CloudWatch Log untuk mengonfirmasi pemanggilan yang berhasil.

  1. Buka halaman Fungsi di konsol Lambda.

  2. Pastikan Anda bekerja di tempat yang sama saat Wilayah AWS Anda membuat bucket S3. Anda dapat mengubah wilayah Anda menggunakan daftar drop-down di bagian atas layar.

    Gambar yang menunjukkan menu wilayah drop-down di konsol Lambda
  3. Pilih Buat fungsi.

  4. Pilih Penulis dari scratch.

  5. Di bagian Informasi dasar, lakukan hal berikut:

    1. Untuk Nama fungsi, masukkan EncryptPDF.

    2. Untuk Runtime pilih Python 3.12.

    3. Untuk Arsitektur, pilih x86_64.

  6. Pilih Buat fungsi.

Untuk mengunggah kode fungsi (konsol)
  1. Di panel Sumber kode, pilih Unggah dari.

  2. Pilih file.zip.

  3. Pilih Unggah.

  4. Di pemilih file, pilih file.zip Anda dan pilih Buka.

  5. Pilih Simpan.

Untuk mengkonfigurasi memori fungsi dan batas waktu (konsol)
  1. Pilih tab Konfigurasi untuk fungsi Anda.

  2. Di panel konfigurasi Umum, pilih Edit.

  3. Atur Memori ke 256 MB dan Timeout menjadi 15 detik.

  4. Pilih Simpan.

Untuk mengkonfigurasi format log (konsol)
  1. Pilih tab Konfigurasi untuk fungsi Anda.

  2. Pilih Alat pemantauan dan operasi.

  3. Di panel konfigurasi Logging, pilih Edit.

  4. Untuk konfigurasi Logging, pilih JSON.

  5. Pilih Simpan.

AWS CLI
Untuk membuat fungsi (AWS CLI)
  • Jalankan perintah berikut dari direktori yang berisi lambda_function.zip file Anda.Untuk region parameternya, ganti us-west-2 dengan wilayah tempat Anda membuat bucket S3.

    aws lambda create-function --function-name EncryptPDF \ --zip-file fileb://lambda_function.zip --handler lambda_function.lambda_handler \ --runtime python3.12 --timeout 15 --memory-size 256 \ --role arn:aws:iam::123456789012:role/LambdaS3Role --region us-west-2 \ --logging-config LogFormat=JSON

Konfigurasikan pemicu Amazon S3 untuk menjalankan fungsi

Agar fungsi Lambda dapat berjalan saat mengunggah file ke bucket sumber, Anda perlu mengonfigurasi pemicu untuk fungsi Anda. Anda dapat mengonfigurasi pemicu Amazon S3 menggunakan konsol atau. AWS CLI

penting

Prosedur ini mengonfigurasi bucket S3 untuk memanggil fungsi Anda setiap kali objek dibuat di bucket. Pastikan untuk mengonfigurasi ini hanya di bucket sumber. Jika fungsi Lambda Anda membuat objek dalam bucket yang sama yang memanggilnya, fungsi Anda dapat dipanggil terus menerus dalam satu loop. Hal ini dapat mengakibatkan biaya yang tidak diharapkan ditagih ke Anda Akun AWS.

Console
Untuk mengonfigurasi pemicu Amazon S3 (konsol)
  1. Buka halaman Fungsi konsol Lambda dan pilih fungsi Anda ()EncryptPDF.

  2. Pilih Tambahkan pemicu.

  3. Pilih S3.

  4. Di bawah Bucket, pilih bucket sumber Anda.

  5. Di bawah Jenis acara, pilih Semua objek membuat acara.

  6. Di bawah Pemanggilan rekursif, pilih kotak centang untuk mengetahui bahwa tidak disarankan menggunakan bucket S3 yang sama untuk input dan output. Anda dapat mempelajari lebih lanjut tentang pola pemanggilan rekursif di Lambda dengan membaca pola rekursif yang menyebabkan fungsi Lambda yang tidak terkendali di Tanah Tanpa Server.

  7. Pilih Tambahkan.

    Saat Anda membuat pemicu menggunakan konsol Lambda, Lambda secara otomatis membuat kebijakan berbasis sumber daya untuk memberikan layanan yang Anda pilih izin untuk menjalankan fungsi Anda.

AWS CLI
Untuk mengonfigurasi pemicu Amazon S3 ()AWS CLI
  1. Agar bucket sumber Amazon S3 menjalankan fungsi saat menambahkan file, pertama-tama Anda harus mengonfigurasi izin untuk fungsi menggunakan kebijakan berbasis sumber daya. Pernyataan kebijakan berbasis sumber daya memberikan Layanan AWS izin lain untuk menjalankan fungsi Anda. Untuk memberikan izin Amazon S3 untuk menjalankan fungsi Anda, jalankan perintah berikut. CLI Pastikan untuk mengganti source-account parameter dengan Akun AWS ID Anda sendiri dan menggunakan nama bucket sumber Anda sendiri.

    aws lambda add-permission --function-name EncryptPDF \ --principal s3.amazonaws.com --statement-id s3invoke --action "lambda:InvokeFunction" \ --source-arn arn:aws:s3:::SOURCEBUCKET \ --source-account 123456789012

    Kebijakan yang Anda tetapkan dengan perintah ini memungkinkan Amazon S3 untuk menjalankan fungsi Anda hanya ketika tindakan dilakukan di bucket sumber Anda.

    catatan

    Meskipun nama bucket S3 unik secara global, saat menggunakan kebijakan berbasis sumber daya, praktik terbaik adalah menentukan bahwa bucket harus milik akun Anda. Ini karena jika Anda menghapus bucket, Anda dapat membuat bucket dengan Amazon Resource Name (ARN) yang sama. Akun AWS

  2. Simpan berikut ini JSON dalam file bernamanotification.json. Saat diterapkan ke bucket sumber Anda, ini akan JSON mengonfigurasi bucket untuk mengirim notifikasi ke fungsi Lambda Anda setiap kali objek baru ditambahkan. Ganti Akun AWS nomor dan Wilayah AWS dalam fungsi Lambda ARN dengan nomor akun dan wilayah Anda sendiri.

    { "LambdaFunctionConfigurations": [ { "Id": "EncryptPDFEventConfiguration", "LambdaFunctionArn": "arn:aws:lambda:us-west-2:123456789012:function:EncryptPDF", "Events": [ "s3:ObjectCreated:Put" ] } ] }
  3. Jalankan CLI perintah berikut untuk menerapkan pengaturan notifikasi dalam JSON file yang Anda buat ke bucket sumber Anda. Ganti SOURCEBUCKET dengan nama bucket sumber Anda sendiri.

    aws s3api put-bucket-notification-configuration --bucket SOURCEBUCKET \ --notification-configuration file://notification.json

    Untuk mempelajari lebih lanjut tentang put-bucket-notification-configuration perintah dan notification-configuration opsi, lihat put-bucket-notification-configurationdi Referensi AWS CLI Perintah.

Menyebarkan sumber daya menggunakan AWS SAM

Untuk menerapkan aplikasi contoh menggunakan AWS SAM CLI, lakukan langkah-langkah berikut.

Pastikan Anda telah menginstal versi terbaru CLI dan Docker diinstal pada mesin build Anda.

  1. Edit template.yaml file untuk menentukan nama bucket S3 Anda. Bucket S3 harus memiliki nama unik secara global yang memenuhi aturan penamaan bucket S3.

    Ganti nama bucket EXAMPLE-BUCKET dengan nama pilihan Anda yang terdiri dari huruf kecil, angka, titik (.), dan tanda hubung (-). Untuk bucket tujuan, ganti EXAMPLE-BUCKET-encrypted dengan<source-bucket-name>-encrypted, di <source-bucket> mana nama yang Anda pilih untuk bucket sumber Anda.

  2. Jalankan perintah berikut dari direktori tempat Anda menyimpantemplate.yaml,lambda_function.py, dan requirements.txt file Anda.

    sam build --use-container

    Perintah ini mengumpulkan artefak build untuk aplikasi Anda dan menempatkannya dalam format dan lokasi yang tepat untuk menerapkannya. Menentukan --use-container opsi membangun fungsi Anda di dalam wadah Docker seperti Lambda. Kami menggunakannya di sini sehingga Anda tidak perlu menginstal Python 3.12 di mesin lokal Anda agar build berfungsi.

    Selama proses build, AWS SAM cari kode fungsi Lambda di lokasi yang Anda tentukan dengan CodeUri properti di template. Dalam hal ini, kami menentukan direktori saat ini sebagai location (./).

    Jika ada requirements.txt file, AWS SAM gunakan untuk mengumpulkan dependensi yang ditentukan. Secara default, AWS SAM buat paket deployment .zip dengan kode fungsi dan dependensi Anda. Anda juga dapat memilih untuk menerapkan fungsi Anda sebagai gambar kontainer menggunakan PackageTypeproperti.

  3. Untuk menerapkan aplikasi Anda dan membuat sumber daya Lambda dan Amazon S3 yang ditentukan dalam template AWS SAM Anda, jalankan perintah berikut.

    sam deploy --guided

    Menggunakan --guided tanda berarti itu AWS SAM akan menunjukkan kepada Anda petunjuk untuk memandu Anda melalui proses penerapan. Untuk penerapan ini, terima opsi default dengan menekan Enter.

Selama proses penerapan, AWS SAM buat sumber daya berikut di: Akun AWS

  • Sebuah AWS CloudFormation tumpukan bernama sam-app

  • Fungsi Lambda dengan nama EncryptPDF

  • Dua ember S3 dengan nama yang Anda pilih saat Anda mengedit file template template.yaml AWS SAM

  • Peran IAM eksekusi untuk fungsi Anda dengan format nama sam-app-EncryptPDFFunctionRole-2qGaapHFWOQ8

Ketika AWS SAM selesai membuat sumber daya Anda, Anda akan melihat pesan berikut:

Successfully created/updated stack - sam-app in us-west-2

Menguji aplikasi

Untuk menguji aplikasi, Anda mengunggah PDF file ke bucket sumber, dan mengonfirmasi bahwa Lambda membuat versi file terenkripsi di bucket tujuan. Dalam contoh ini, Anda dapat menguji ini secara manual menggunakan konsol atau AWS CLI, atau dengan menggunakan skrip pengujian yang disediakan.

Untuk aplikasi produksi, Anda dapat menggunakan metode dan teknik pengujian tradisional, seperti pengujian unit, untuk mengonfirmasi berfungsinya kode fungsi Lambda Anda dengan benar. Praktik terbaik juga melakukan pengujian seperti yang ada di skrip pengujian yang disediakan yang melakukan pengujian integrasi dengan sumber daya berbasis cloud yang nyata. Pengujian integrasi di cloud mengonfirmasi bahwa infrastruktur Anda telah digunakan dengan benar dan bahwa peristiwa mengalir di antara berbagai layanan seperti yang diharapkan. Untuk mempelajari selengkapnya, lihat Cara menguji fungsi dan aplikasi tanpa server.

Menguji aplikasi secara manual

Anda dapat menguji fungsi Anda secara manual dengan menambahkan PDF file ke bucket sumber Amazon S3 Anda. Saat Anda menambahkan file ke bucket sumber, fungsi Lambda Anda akan dipanggil secara otomatis dan harus menyimpan versi file terenkripsi di bucket target Anda.

Console
Untuk menguji aplikasi Anda dengan mengunggah file (konsol)
  1. Untuk mengunggah PDF file ke bucket S3 Anda, lakukan hal berikut:

    1. Buka halaman Bucket di konsol Amazon S3 dan pilih bucket sumber Anda.

    2. Pilih Unggah.

    3. Pilih Tambahkan file dan gunakan pemilih file untuk memilih PDF file yang ingin Anda unggah.

    4. Pilih Buka, lalu pilih Unggah.

  2. Verifikasi bahwa Lambda telah menyimpan versi terenkripsi PDF file Anda di bucket target Anda dengan melakukan hal berikut:

    1. Arahkan kembali ke halaman Bucket di konsol Amazon S3 dan pilih bucket tujuan Anda.

    2. Di panel Objects, Anda sekarang akan melihat file dengan format nama filename_encrypted.pdf (di mana filename.pdf nama file yang Anda unggah ke bucket sumber Anda). Untuk mengunduh file terenkripsi AndaPDF, pilih file, lalu pilih Unduh.

    3. Konfirmasikan bahwa Anda dapat membuka file yang diunduh dengan kata sandi fungsi Lambda Anda melindunginya dengan ()my-secret-password.

AWS CLI
Untuk menguji aplikasi Anda dengan mengunggah file ()AWS CLI
  1. Dari direktori yang berisi PDF file yang ingin Anda unggah, jalankan CLI perintah berikut. Ganti --bucket parameter dengan nama bucket sumber Anda. Untuk --body parameter --key dan, gunakan nama file file pengujian Anda.

    aws s3api put-object --bucket SOURCEBUCKET --key test.pdf --body ./test.pdf
  2. Verifikasi bahwa fungsi Anda telah membuat versi terenkripsi dari file Anda dan menyimpannya ke bucket S3 target Anda. Jalankan CLI perintah berikut, ganti SOURCEBUCKET-encrypted dengan nama bucket tujuan Anda sendiri.

    aws s3api list-objects-v2 --bucket SOURCEBUCKET-encrypted

    Jika fungsi Anda berjalan dengan sukses, Anda akan melihat output yang mirip dengan berikut ini. Bucket target Anda harus berisi file dengan format nama<your_test_file>_encrypted.pdf, di <your_test_file> mana nama file yang Anda unggah.

    { "Contents": [ { "Key": "test_encrypted.pdf", "LastModified": "2023-06-07T00:15:50+00:00", "ETag": "\"7781a43e765a8301713f533d70968a1e\"", "Size": 2763, "StorageClass": "STANDARD" } ] }
  3. Untuk mengunduh file yang disimpan Lambda di bucket tujuan Anda, jalankan perintah berikutCLI. Ganti --bucket parameter dengan nama bucket tujuan Anda. Untuk --key parameternya, gunakan nama file<your_test_file>_encrypted.pdf, di <your_test_file> mana nama file pengujian yang Anda unggah.

    aws s3api get-object --bucket SOURCEBUCKET-encrypted --key test_encrypted.pdf my_encrypted_file.pdf

    Perintah ini mengunduh file ke direktori Anda saat ini dan menyimpannya sebagaimy_encrypted_file.pdf.

  4. Konfirmasikan bahwa Anda dapat membuka file yang diunduh dengan kata sandi fungsi Lambda Anda melindunginya dengan ()my-secret-password.

Menguji aplikasi dengan skrip otomatis

Untuk menguji aplikasi Anda menggunakan skrip pengujian yang disediakan, pertama-tama pastikan bahwa pytest modul diinstal di lingkungan lokal Anda. Anda dapat menginstal pytest dengan menjalankan perintah berikut:

pip install pytest

Anda juga perlu mengedit kode dalam test_pdf_encrypt.py file untuk mengganti nama bucket placeholder dengan nama bucket sumber dan tujuan Amazon S3 Anda. Buat perubahan berikut ketest_pdf_encrypt.py:

  • Dalam test_source_bucket_available fungsinya, ganti EXAMPLE-BUCKET dengan nama bucket sumber Anda.

  • Dalam test_encrypted_file_in_bucket fungsinya, ganti EXAMPLE-BUCKET-encrypted dengan<source-bucket>-encrypted, di <source-bucket> mana nama bucket sumber Anda.

  • Dalam cleanup fungsi, ganti EXAMPLE-BUCKET dengan nama bucket sumber Anda, dan ganti EXAMPLE-BUCKET-encrypted dengan≪source-bucket>-encrypted, di <source-bucket> mana nama bucket sumber Anda.

Untuk menjalankan tes lakukan hal berikut:

  • Simpan PDF file bernama test.pdf dalam direktori yang berisi pytest.ini file test_pdf_encrypt.py dan.

  • Buka terminal atau program shell dan jalankan perintah berikut dari direktori yang berisi file uji.

    pytest -s -v

Ketika tes selesai, Anda akan melihat output seperti berikut:

============================================================== test session starts ========================================================= platform linux -- Python 3.12.2, pytest-7.2.2, pluggy-1.0.0 -- /usr/bin/python3 cachedir: .pytest_cache hypothesis profile 'default' -> database=DirectoryBasedExampleDatabase('/home/pdf_encrypt_app/.hypothesis/examples') Test order randomisation NOT enabled. Enable with --random-order or --random-order-bucket=<bucket_type> rootdir: /home/pdf_encrypt_app, configfile: pytest.ini plugins: anyio-3.7.1, hypothesis-6.70.0, localserver-0.7.1, random-order-1.1.0 collected 4 items test_pdf_encrypt.py::test_source_bucket_available PASSED test_pdf_encrypt.py::test_lambda_invoked PASSED test_pdf_encrypt.py::test_encrypted_file_in_bucket PASSED test_pdf_encrypt.py::test_cleanup PASSED Deleted test.pdf from EXAMPLE-BUCKET Deleted test_encrypted.pdf from EXAMPLE-BUCKET-encrypted =============================================================== 4 passed in 7.32s ==========================================================

Langkah selanjutnya

Sekarang Anda telah membuat aplikasi contoh ini, Anda dapat menggunakan kode yang disediakan sebagai dasar untuk membuat jenis aplikasi pemrosesan file lainnya. Ubah kode dalam lambda_function.py file untuk mengimplementasikan logika pemrosesan file untuk kasus penggunaan Anda.

Banyak kasus penggunaan pemrosesan file yang khas melibatkan pemrosesan gambar. Saat menggunakan Python, perpustakaan pemrosesan gambar yang paling populer seperti bantal biasanya berisi komponen C atau C ++. Untuk memastikan bahwa paket penerapan fungsi Anda kompatibel dengan lingkungan eksekusi Lambda, penting untuk menggunakan biner distribusi sumber yang benar.

Saat menerapkan sumber daya Anda AWS SAM, Anda perlu mengambil beberapa langkah ekstra untuk menyertakan distribusi sumber yang tepat dalam paket penerapan Anda. Karena AWS SAM tidak akan menginstal dependensi untuk platform yang berbeda dari mesin build Anda, menentukan distribusi sumber (.whlfile) yang benar dalam requirements.txt file Anda tidak akan berfungsi jika mesin build Anda menggunakan sistem operasi atau arsitektur yang berbeda dari lingkungan eksekusi Lambda. Sebagai gantinya, Anda harus melakukan salah satu hal berikut:

  • Gunakan --use-container opsi saat menjalankansam build. Saat Anda menentukan opsi ini, AWS SAM unduh gambar dasar kontainer yang kompatibel dengan lingkungan eksekusi Lambda dan buat paket penerapan fungsi Anda dalam wadah Docker menggunakan gambar itu. Untuk mempelajari lebih lanjut, lihat Membangun fungsi Lambda di dalam wadah yang disediakan.

  • Buat sendiri paket.zip deployment fungsi Anda menggunakan biner distribusi sumber yang benar dan simpan file.zip di direktori yang Anda tentukan seperti CodeUri di template. AWS SAM Untuk mempelajari lebih lanjut tentang membangun paket deployment .zip untuk Python menggunakan distribusi biner, lihat dan. Membuat paket penerapan.zip dengan dependensi Membuat paket penerapan.zip dengan pustaka asli