Memanggil fungsi AWS Lambda - Amazon Simple Storage Service

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

Memanggil fungsi AWS Lambda

Anda dapat menggunakan Operasi Batch Amazon S3 untuk melakukan operasi batch skala besar pada objek Amazon S3. Operasi Operasi Batch AWS Lambda fungsi Invoke memulai AWS Lambda fungsi untuk melakukan tindakan kustom pada objek yang terdaftar dalam manifes. Bagian ini menjelaskan cara membuat fungsi Lambda yang akan digunakan dengan Operasi Batch S3 dan cara membuat tugas untuk menginvokasi fungsi tersebut. Tugas Operasi Batch S3 menggunakan operasi LambdaInvoke untuk menjalankan fungsi Lambda di setiap objek yang tercantum dalam manifes.

Anda dapat bekerja dengan Operasi Batch S3 dengan menggunakan konsol Amazon S3 AWS Command Line Interface ,AWS CLI() AWS SDKs, atau Amazon S3. REST API Untuk informasi selengkapnya tentang menggunakan Lambda, lihat Memulai AWS Lambda di AWS Lambda Panduan Developer.

Bagian berikut menjelaskan cara mulai menggunakan Operasi Batch S3 dengan Lambda.

Menggunakan Lambda dengan Operasi Batch

Saat menggunakan Operasi Batch S3 dengan AWS Lambda, Anda harus membuat fungsi Lambda baru khusus untuk digunakan dengan Operasi Batch S3. Anda tidak dapat menggunakan kembali fungsi berbasis peristiwa Amazon S3 yang ada dengan Operasi Batch S3. Fungsi peristiwa hanya dapat menerima pesan; fungsi tersebut tidak dapat mengembalikan pesan. Fungsi Lambda yang digunakan dengan Operasi Batch S3 harus menerima dan mengembalikan pesan. Untuk informasi selengkapnya tentang penggunaan Lambda dengan peristiwa Amazon S3, lihat Menggunakan dengan AWS Lambda Amazon S3 di Panduan Pengembang.AWS Lambda

Buat tugas Operasi Batch S3 yang menginvokasi fungsi Lambda. Tugas ini menjalankan fungsi Lambda yang sama pada semua objek yang tercantum dalam manifes Anda. Anda dapat mengontrol versi fungsi Lambda yang akan digunakan saat memproses objek dalam manifes Anda. Operasi Batch S3 mendukung Nama Sumber Daya Amazon (ARNs), alias, dan versi tertentu yang tidak memenuhi syarat. Untuk informasi selengkapnya, lihat Pengantar AWS Lambda Versi di Panduan AWS Lambda Pengembang.

Jika Anda memberikan tugas Operasi Batch S3 dengan fungsi ARN yang menggunakan alias atau $LATEST qualifier, dan Anda memperbarui versi yang ditunjuk oleh salah satu dari itu, Operasi Batch S3 mulai memanggil versi baru fungsi Lambda Anda. Tindakan ini sangat berguna apabila Anda ingin memperbarui fungsionalitas di tengah-tengah pekerjaan yang besar. Jika Anda tidak ingin Operasi Batch S3 mengubah versi yang digunakan, berikan versi tertentu dalam FunctionARN parameter saat Anda membuat pekerjaan.

Menggunakan Operasi Lambda dan Batch dengan bucket direktori

Bucket direktori adalah jenis bucket Amazon S3 yang dirancang untuk beban kerja atau aplikasi kritis kinerja yang memerlukan latensi milidetik satu digit yang konsisten. Untuk informasi selengkapnya, lihat Bucket direktori.

Ada persyaratan khusus untuk menggunakan Operasi Batch untuk menginvokasi fungsi Lambda yang bertindak pada bucket direktori. Misalnya, Anda harus menyusun permintaan Lambda Anda menggunakan JSON skema yang diperbarui, dan tentukan InvocationSchemaVersion2.0 (bukan 1.0) saat Anda membuat pekerjaan. Skema yang diperbarui ini memungkinkan Anda untuk menentukan pasangan kunci-nilai opsional untuk UserArguments, yang dapat Anda gunakan untuk memodifikasi parameter tertentu dari fungsi Lambda yang ada. Untuk informasi selengkapnya, lihat Mengotomatiskan pemrosesan objek di bucket direktori Amazon S3 dengan Operasi Batch S3 AWS Lambda dan di Blog Penyimpanan. AWS

Kode respons dan hasil

Operasi Batch S3 memanggil fungsi Lambda dengan satu atau lebih tombol, yang masing-masing memiliki yang TaskID terkait dengannya. Operasi Batch S3 mengharapkan kode hasil per kunci dari fungsi Lambda. Setiap tugas yang IDs dikirim dalam permintaan yang tidak dikembalikan dengan kode hasil per-kunci akan diberikan kode hasil dari bidang. treatMissingKeysAs treatMissingKeysAsadalah bidang permintaan opsional dan default ke. TemporaryFailure Tabel berikut berisi kode hasil dan nilai lain yang mungkin untuk treatMissingKeysAs bidang tersebut.

Kode respons Deskripsi
Succeeded Tugas diselesaikan secara normal. Jika Anda meminta laporan penyelesaian tugas, string hasil tugas disertakan dalam laporan.
TemporaryFailure Tugas mengalami kegagalan sementara dan akan diarahkan ulang sebelum pekerjaan selesai. String hasil diabaikan. Jika ini adalah pengarahan ulang terakhir, pesan kesalahan akan disertakan dalam laporan akhir.
PermanentFailure Tugas tersebut mengalami kegagalan permanen. Jika Anda meminta laporan penyelesaian tugas, tugas tersebut akan ditandai sebagai Failed dan menyertakan string pesan kesalahan. String hasil dari tugas yang gagal diabaikan.

Membuat fungsi Lambda untuk digunakan dengan Operasi Batch S3

Bagian ini memberikan izin contoh AWS Identity and Access Management (IAM) yang harus Anda gunakan dengan fungsi Lambda Anda. Bagian juga berisi contoh fungsi Lambda untuk digunakan dengan Operasi Batch S3. Jika Anda belum pernah membuat fungsi Lambda sebelumnya, lihat Tutorial: Menggunakan AWS Lambda dengan Amazon S3 di AWS Lambda Panduan Pengembang.

Anda harus membuat fungsi Lambda khusus yang akan digunakan dengan Operasi Batch S3. Anda tidak dapat menggunakan kembali fungsi Lambda berbasis peristiwa Amazon S3 yang ada karena fungsi Lambda yang digunakan untuk Operasi Batch S3 harus menerima dan mengembalikan bidang data khusus.

penting

AWS Lambda fungsi yang ditulis dalam Java juga menerima RequestHandler atau RequestStreamHandlerantarmuka handler. Namun, untuk mendukung permintaan dan format respons Operasi Batch S3, AWS Lambda diperlukan RequestStreamHandler antarmuka untuk serialisasi kustom dan deserialisasi permintaan dan respons. Antarmuka ini memungkinkan Lambda untuk meneruskan InputStream dan OutputStream ke metode JavahandleRequest.

Pastikan untuk menggunakan antarmuka RequestStreamHandler saat menggunakan fungsi Lambda dengan Operasi Batch S3. Jika Anda menggunakan RequestHandler antarmuka, pekerjaan batch akan gagal dengan “Tidak valid JSON dikembalikan dalam muatan Lambda” dalam laporan penyelesaian.

Untuk informasi selengkapnya, lihat Antarmuka pengelola di AWS Lambda Panduan Pengguna.

Contoh IAM izin

Berikut ini adalah contoh IAM izin yang diperlukan untuk menggunakan fungsi Lambda dengan Operasi Batch S3.

contoh — Kebijakan kepercayaan Operasi Batch S3

Berikut ini adalah contoh kebijakan kepercayaan yang dapat Anda gunakan untuk IAM peran Operasi Batch. IAMPeran ini ditentukan saat Anda membuat pekerjaan dan memberikan izin Operasi Batch untuk mengambil IAM peran tersebut.

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "batchoperations.s3.amazonaws.com" }, "Action": "sts:AssumeRole" } ] }
contoh — Kebijakan Lambda IAM

Berikut ini adalah contoh IAM kebijakan yang memberikan izin Operasi Batch S3 untuk menjalankan fungsi Lambda dan membaca manifes masukan.

{ "Version": "2012-10-17", "Statement": [ { "Sid": "BatchOperationsLambdaPolicy", "Effect": "Allow", "Action": [ "s3:GetObject", "s3:GetObjectVersion", "s3:PutObject", "lambda:InvokeFunction" ], "Resource": "*" } ] }

Contoh permintaan dan respons

Bagian ini memberikan contoh permintaan dan respons untuk fungsi Lambda.

contoh Permintaan

Berikut ini adalah JSON contoh permintaan untuk fungsi Lambda.

{ "invocationSchemaVersion": "1.0", "invocationId": "YXNkbGZqYWRmaiBhc2RmdW9hZHNmZGpmaGFzbGtkaGZza2RmaAo", "job": { "id": "f3cc4f60-61f6-4a2b-8a21-d07600c373ce" }, "tasks": [ { "taskId": "dGFza2lkZ29lc2hlcmUK", "s3Key": "customerImage1.jpg", "s3VersionId": "1", "s3BucketArn": "arn:aws:s3:us-east-1:0123456788:amzn-s3-demo-bucket1" } ] }
contoh Respons

Berikut ini adalah JSON contoh respons untuk fungsi Lambda.

{ "invocationSchemaVersion": "1.0", "treatMissingKeysAs" : "PermanentFailure", "invocationId" : "YXNkbGZqYWRmaiBhc2RmdW9hZHNmZGpmaGFzbGtkaGZza2RmaAo", "results": [ { "taskId": "dGFza2lkZ29lc2hlcmUK", "resultCode": "Succeeded", "resultString": "[\"Mary Major", \"John Stiles\"]" } ] }

Contoh fungsi Lambda untuk Operasi Batch S3

Contoh Python Lambda berikut menghilangkan hapus penanda dari objek berversi.

Seperti yang ditunjukkan contoh, kunci dari Operasi Batch S3 URL dikodekan. Untuk menggunakan Amazon S3 dengan AWS layanan lain, penting bagi Anda untuk URL memecahkan kode kunci yang diteruskan dari Operasi Batch S3.

import logging from urllib import parse import boto3 from botocore.exceptions import ClientError logger = logging.getLogger(__name__) logger.setLevel("INFO") s3 = boto3.client("s3") def lambda_handler(event, context): """ Removes a delete marker from the specified versioned object. :param event: The S3 batch event that contains the ID of the delete marker to remove. :param context: Context about the event. :return: A result structure that Amazon S3 uses to interpret the result of the operation. When the result code is TemporaryFailure, S3 retries the operation. """ # Parse job parameters from Amazon S3 batch operations invocation_id = event["invocationId"] invocation_schema_version = event["invocationSchemaVersion"] results = [] result_code = None result_string = None task = event["tasks"][0] task_id = task["taskId"] try: obj_key = parse.unquote(task["s3Key"], encoding="utf-8") obj_version_id = task["s3VersionId"] bucket_name = task["s3BucketArn"].split(":")[-1] logger.info( "Got task: remove delete marker %s from object %s.", obj_version_id, obj_key ) try: # If this call does not raise an error, the object version is not a delete # marker and should not be deleted. response = s3.head_object( Bucket=bucket_name, Key=obj_key, VersionId=obj_version_id ) result_code = "PermanentFailure" result_string = ( f"Object {obj_key}, ID {obj_version_id} is not " f"a delete marker." ) logger.debug(response) logger.warning(result_string) except ClientError as error: delete_marker = error.response["ResponseMetadata"]["HTTPHeaders"].get( "x-amz-delete-marker", "false" ) if delete_marker == "true": logger.info( "Object %s, version %s is a delete marker.", obj_key, obj_version_id ) try: s3.delete_object( Bucket=bucket_name, Key=obj_key, VersionId=obj_version_id ) result_code = "Succeeded" result_string = ( f"Successfully removed delete marker " f"{obj_version_id} from object {obj_key}." ) logger.info(result_string) except ClientError as error: # Mark request timeout as a temporary failure so it will be retried. if error.response["Error"]["Code"] == "RequestTimeout": result_code = "TemporaryFailure" result_string = ( f"Attempt to remove delete marker from " f"object {obj_key} timed out." ) logger.info(result_string) else: raise else: raise ValueError( f"The x-amz-delete-marker header is either not " f"present or is not 'true'." ) except Exception as error: # Mark all other exceptions as permanent failures. result_code = "PermanentFailure" result_string = str(error) logger.exception(error) finally: results.append( { "taskId": task_id, "resultCode": result_code, "resultString": result_string, } ) return { "invocationSchemaVersion": invocation_schema_version, "treatMissingKeysAs": "PermanentFailure", "invocationId": invocation_id, "results": results, }

Membuat tugas Operasi Batch S3 yang menginvokasi fungsi Lambda

Saat membuat tugas Operasi Batch S3 untuk menginvokasi fungsi Lambda, Anda harus menyediakan hal berikut:

  • Fungsi Lambda Anda (yang mungkin termasuk alias fungsi atau nomor versi tertentu) ARN

  • IAMPeran dengan izin untuk memanggil fungsi

  • Parameter tindakan LambdaInvokeFunction

Untuk informasi selengkapnya tentang cara membuat pekerjaan Operasi Batch S3, lihat Membuat pekerjaan Operasi Batch S3 dan Operasi yang didukung oleh Operasi Batch S3.

Contoh berikut membuat pekerjaan Operasi Batch S3 yang memanggil fungsi Lambda dengan menggunakan. AWS CLI Untuk menggunakan contoh ini, ganti placeholder masukan pengguna dengan informasi Anda sendiri.

aws s3control create-job --account-id account-id --operation '{"LambdaInvoke": { "FunctionArn": "arn:aws:lambda:region:account-id:function:LambdaFunctionName" } }' --manifest '{"Spec":{"Format":"S3BatchOperations_CSV_20180820","Fields":["Bucket","Key"]},"Location":{"ObjectArn":"arn:aws:s3:::amzn-s3-demo-manifest-bucket","ETag":"ManifestETag"}}' --report '{"Bucket":"arn:aws:s3:::amzn-s3-demo-bucket","Format":"Report_CSV_20180820","Enabled":true,"Prefix":"ReportPrefix","ReportScope":"AllTasks"}' --priority 2 --role-arn arn:aws:iam::account-id:role/BatchOperationsRole --region region --description "Lambda Function"

Memberikan informasi tingkat tugas dalam manifest Lambda

Saat Anda menggunakan AWS Lambda fungsi dengan Operasi Batch S3, Anda mungkin ingin data tambahan menyertai setiap tugas atau kunci yang dioperasikan. Misalnya, Anda mungkin ingin memiliki kunci objek sumber dan kunci objek baru yang disediakan. Fungsi Lambda Anda kemudian dapat menyalin kunci sumber ke bucket S3 baru dengan nama baru. Secara default, Operasi Batch memungkinkan Anda hanya menentukan bucket tujuan dan daftar kunci sumber dalam manifes masukan untuk pekerjaan Anda. Contoh berikut menjelaskan bagaimana Anda dapat menyertakan data tambahan dalam manifes Anda sehingga Anda dapat menjalankan fungsi Lambda yang lebih kompleks.

Untuk menentukan parameter per-kunci dalam manifes Operasi Batch S3 yang akan digunakan dalam kode fungsi Lambda, gunakan format -encoded berikut. URL JSON Bidang key diteruskan ke fungsi Lambda Anda seakan-akan itu adalah kunci objek Amazon S3. Tetapi dapat ditafsirkan oleh fungsi Lambda untuk berisi nilai-nilai lain atau beberapa kunci, seperti yang ditunjukkan pada contoh berikut.

catatan

Jumlah karakter maksimum untuk bidang key pada manifes adalah 1.024.

contoh — Manifest menggantikan “kunci Amazon S3” dengan string JSON

Versi URL -encoded harus disediakan untuk Operasi Batch S3.

amzn-s3-demo-bucket,{"origKey": "object1key", "newKey": "newObject1Key"} amzn-s3-demo-bucket,{"origKey": "object2key", "newKey": "newObject2Key"} amzn-s3-demo-bucket,{"origKey": "object3key", "newKey": "newObject3Key"}
contoh — Manifest URL -dikodekan

Versi URL -encode ini harus disediakan untuk Operasi Batch S3. non-URL-encodedVersi tidak berfungsi.

amzn-s3-demo-bucket,%7B%22origKey%22%3A%20%22object1key%22%2C%20%22newKey%22%3A%20%22newObject1Key%22%7D amzn-s3-demo-bucket,%7B%22origKey%22%3A%20%22object2key%22%2C%20%22newKey%22%3A%20%22newObject2Key%22%7D amzn-s3-demo-bucket,%7B%22origKey%22%3A%20%22object3key%22%2C%20%22newKey%22%3A%20%22newObject3Key%22%7D
contoh — fungsi Lambda dengan hasil penulisan format manifes ke laporan tugas

Contoh manifes URL -encoded ini berisi kunci objek yang dibatasi pipa untuk fungsi Lambda berikut untuk diuraikan.

amzn-s3-demo-bucket,object1key%7Clower amzn-s3-demo-bucket,object2key%7Cupper amzn-s3-demo-bucket,object3key%7Creverse amzn-s3-demo-bucket,object4key%7Cdelete

Fungsi Lambda ini menunjukkan cara mengurai tugas yang dibatasi pipa yang dikodekan ke dalam manifes Operasi Batch S3. Tugas tersebut menunjukkan operasi revisi yang diterapkan ke objek tertentu.

import logging from urllib import parse import boto3 from botocore.exceptions import ClientError logger = logging.getLogger(__name__) logger.setLevel("INFO") s3 = boto3.resource("s3") def lambda_handler(event, context): """ Applies the specified revision to the specified object. :param event: The Amazon S3 batch event that contains the ID of the object to revise and the revision type to apply. :param context: Context about the event. :return: A result structure that Amazon S3 uses to interpret the result of the operation. """ # Parse job parameters from Amazon S3 batch operations invocation_id = event["invocationId"] invocation_schema_version = event["invocationSchemaVersion"] results = [] result_code = None result_string = None task = event["tasks"][0] task_id = task["taskId"] # The revision type is packed with the object key as a pipe-delimited string. obj_key, revision = parse.unquote(task["s3Key"], encoding="utf-8").split("|") bucket_name = task["s3BucketArn"].split(":")[-1] logger.info("Got task: apply revision %s to %s.", revision, obj_key) try: stanza_obj = s3.Bucket(bucket_name).Object(obj_key) stanza = stanza_obj.get()["Body"].read().decode("utf-8") if revision == "lower": stanza = stanza.lower() elif revision == "upper": stanza = stanza.upper() elif revision == "reverse": stanza = stanza[::-1] elif revision == "delete": pass else: raise TypeError(f"Can't handle revision type '{revision}'.") if revision == "delete": stanza_obj.delete() result_string = f"Deleted stanza {stanza_obj.key}." else: stanza_obj.put(Body=bytes(stanza, "utf-8")) result_string = ( f"Applied revision type '{revision}' to " f"stanza {stanza_obj.key}." ) logger.info(result_string) result_code = "Succeeded" except ClientError as error: if error.response["Error"]["Code"] == "NoSuchKey": result_code = "Succeeded" result_string = ( f"Stanza {obj_key} not found, assuming it was deleted " f"in an earlier revision." ) logger.info(result_string) else: result_code = "PermanentFailure" result_string = ( f"Got exception when applying revision type '{revision}' " f"to {obj_key}: {error}." ) logger.exception(result_string) finally: results.append( { "taskId": task_id, "resultCode": result_code, "resultString": result_string, } ) return { "invocationSchemaVersion": invocation_schema_version, "treatMissingKeysAs": "PermanentFailure", "invocationId": invocation_id, "results": results, }

Tutorial Operasi Batch S3

Tutorial berikut menyajikan end-to-end prosedur lengkap untuk beberapa tugas Operasi Batch dengan Lambda. Dalam tutorial ini, Anda mempelajari cara mengatur Operasi Batch untuk menjalankan fungsi Lambda untuk transcoding batch video yang disimpan dalam bucket sumber S3. Fungsi Lambda memanggil AWS Elemental MediaConvert untuk mentranskode video.