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

Fungsi Invoke memulai AWS Lambda 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 untuk Lambda menggunakan AWS Management Console AWS Command Line Interface ,AWS CLI(), SDK AWS , atau 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 Amazon S3

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 Amazon Resource Name (ARN), alias, dan versi tertentu yang tidak memenuhi syarat. Untuk informasi selengkapnya, lihat Pengenalan AWS Lambda Penentuan Versi di AWS Lambda Panduan Developer.

Jika Anda menyediakan tugas Operasi Batch S3 dengan fungsi ARN yang menggunakan alias atau pengkualifikasi $LATEST, dan Anda memperbarui versi yang ditunjuk oleh salah satu dari keduanya, Operasi Batch S3 akan mulai memanggil versi baru fungsi Lambda. 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, sediakan versi khusus di parameter FunctionARN saat Anda membuat tugas.

Menggunakan Lambda dan operasi batch Amazon S3 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 Amazon S3 untuk menginvokasi fungsi Lambda yang bekerja pada bucket direktori. Misalnya, Anda harus menyusun permintaan Lambda menggunakan skema JSON yang diperbarui, dan menentukan InvocationSchemaVersion 2.0 kapan Anda membuat tugas. Skema yang diperbarui ini memungkinkan Anda menentukan pasangan nilai kunci 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 ID tugas yang 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 contoh izin 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 sudah ada. Ini dikarenakan fungsi Lambda yang digunakan untuk Operasi Batch S3 harus menerima dan mengembalikan kolom data khusus.

penting

AWS Lambda fungsi yang ditulis dalam Java menerima salah satu RequestHandleratau antarmuka RequestStreamHandlerhandler. 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 antarmuka RequestHandler, tugas batch akan gagal dengan pesan “JSON yang tidak valid dikembalikan di payload Lambda” dalam laporan penyelesaian.

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

Contoh izin IAM

Berikut ini adalah contoh izin IAM 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 peran IAM Batch Operations. Peran IAM ini ditentukan saat Anda membuat pekerjaan dan memberikan izin Operasi Batch untuk menjalankan peran IAM.

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

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

{ "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 contoh JSON dari 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:awsexamplebucket1" } ] }
contoh Respons

Berikut ini adalah contoh JSON dari 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 tersebut, kunci dari Operasi Batch S3 dikodekan oleh URL. Untuk menggunakan Amazon S3 dengan AWS layanan lain, penting bagi Anda untuk mendekode URL 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:

  • ARN fungsi Lambda Anda (yang mencakup alias fungsi atau nomor versi tertentu)

  • Peran IAM dengan izin untuk menginvokasi 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 menunjukkan cara membuat tugas Operasi Batch S3 yang menginvokasi fungsi Lambda menggunakan AWS CLI.

aws s3control create-job --account-id <AccountID> --operation '{"LambdaInvoke": { "FunctionArn": "arn:aws:lambda:Region:AccountID:function:LambdaFunctionName" } }' --manifest '{"Spec":{"Format":"S3BatchOperations_CSV_20180820","Fields":["Bucket","Key"]},"Location":{"ObjectArn":"arn:aws:s3:::ManifestLocation","ETag":"ManifestETag"}}' --report '{"Bucket":"arn:aws:s3:::awsexamplebucket1","Format":"Report_CSV_20180820","Enabled":true,"Prefix":"ReportPrefix","ReportScope":"AllTasks"}' --priority 2 --role-arn arn:aws:iam::AccountID: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/kunci yang dioperasikan. Misalnya, Anda 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 Amazon S3 memungkinkan Anda untuk hanya menentukan bucket tujuan dan daftar kunci sumber di manifes input ke tugas Anda. Berikut ini menjelaskan cara memasukkan data tambahan ke dalam manifes 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 JSON yang dienkode dengan URL berikut ini. Bidang key diteruskan ke fungsi Lambda Anda seakan-akan itu adalah kunci objek Amazon S3. Tetapi bidang tersebut dapat ditafsirkan oleh fungsi Lambda agar berisi nilai lain atau beberapa kunci, seperti yang ditunjukkan berikut ini.

catatan

Jumlah karakter maksimum untuk bidang key pada manifes adalah 1.024.

contoh — manifes yang menggantikan "kunci Amazon S3" dengan string JSON

Versi yang dienkode URL harus disediakan untuk Operasi Batch S3.

my-bucket,{"origKey": "object1key", "newKey": "newObject1Key"} my-bucket,{"origKey": "object2key", "newKey": "newObject2Key"} my-bucket,{"origKey": "object3key", "newKey": "newObject3Key"}
contoh — manifes yang dienkode URL

Versi yang dienkode URL ini harus disediakan untuk Operasi Batch S3. Versi yang tidak dienkode URL tidak dapat digunakan.

my-bucket,%7B%22origKey%22%3A%20%22object1key%22%2C%20%22newKey%22%3A%20%22newObject1Key%22%7D my-bucket,%7B%22origKey%22%3A%20%22object2key%22%2C%20%22newKey%22%3A%20%22newObject2Key%22%7D my-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 yang dikodekan URL ini berisi kunci objek yang dibatasi pipa untuk fungsi Lambda berikut untuk diuraikan.

my-bucket,object1key%7Clower my-bucket,object2key%7Cupper my-bucket,object3key%7Creverse my-bucket,object4key%7Cdelete

Fungsi Lambda ini menunjukkan cara mengurai tugas yang dibatasi pipa yang dienkode 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, }

Belajar dari tutorial Operasi Batch S3

Tutorial berikut menyajikan end-to-end prosedur lengkap untuk beberapa tugas Operasi Batch dengan Lambda.