Terjemahan disediakan oleh mesin penerjemah. Jika konten terjemahan yang diberikan bertentangan dengan versi bahasa Inggris aslinya, utamakan versi bahasa Inggris.
Bekerja dengan header Range dan partNumber
catatan
Amazon S3 Object Lambda tidak akan lagi terbuka untuk pelanggan baru mulai 7 November 2025. Jika Anda ingin menggunakan layanan ini, silakan mendaftar sebelum 7 November 2025. Untuk kemampuan yang mirip dengan S3 Object Lambda, pelajari lebih lanjut di sini - Perubahan ketersediaan Objek Amazon S3 Lambda.
Saat bekerja dengan objek besar di Lambda Objek Amazon S3, Anda dapat menggunakan header HTTP Range untuk mengunduh rentang byte tertentu dari sebuah objek. Untuk mengambil rentang byte berbeda dari dalam objek yang sama, Anda dapat menggunakan koneksi bersamaan ke Amazon S3. Anda juga dapat menentukan parameter partNumber (integer antara 1 dan 10.000), yang melakukan permintaan berkisar untuk bagian objek tertentu.
Karena ada beberapa cara yang mungkin Anda inginkan untuk menangani permintaan yang menyertakan parameter Range atau partNumber, S3 Lambda Objek tidak menerapkan parameter ini ke objek yang ditransformasi. Sebagai gantinya, AWS Lambda fungsi Anda harus mengimplementasikan fungsi ini sesuai kebutuhan untuk aplikasi Anda.
Untuk menggunakan parameter Range dan partNumber dengan S3 Lambda Objek, Anda melakukan hal berikut ini:
-
Aktifkan parameter ini di konfigurasi Titik Akses Lambda Objek.
-
Tulis fungsi Lambda yang dapat menangani permintaan yang menyertakan parameter ini.
Langkah-langkah berikut menjelaskan cara untuk mencapai hal ini.
Langkah 1: Mengonfigurasi Titik Akses Lambda Objek Anda
Secara default, Titik Akses Objek Lambda merespons dengan kesalahan kode status HTTP 501 (Tidak Diimplementasikan) terhadap permintaan GetObject atau HeadObject yang berisi parameter Range atau partNumber, baik di header atau parameter kueri.
Untuk mengaktifkan Titik Akses Lambda Objek untuk menerima permintaan tersebut, Anda harus menyertakan GetObject-Range, GetObject-PartNumber, HeadObject-Range, atau HeadObject-PartNumber dalam bagian AllowedFeatures konfigurasi Titik Akses Lambda Objek Anda. Untuk informasi selengkapnya tentang memperbarui konfigurasi Titik Akses Lambda Objek, lihat Membuat Titik Akses Objek Lambda.
Langkah 2: Menerapkan penanganan Range atau partNumber di dalam fungsi Lambda Anda
Saat Titik Akses Lambda Object Anda menginvokasi fungsi Lambda Anda dengan rentang permintaan GetObject atau HeadObject, parameter Range atau partNumber disertakan dalam konteks peristiwa. Lokasi parameter dalam konteks peristiwa tergantung pada parameter mana yang digunakan dan bagaimana itu dimasukkan dalam permintaan asli ke Titik Akses Lambda Object, seperti yang dijelaskan dalam tabel berikut.
| Parameter | Lokasi konteks peristiwa |
|---|---|
|
|
|
|
|
|
|
|
|
penting
URL presigned yang disediakan untuk Titik Akses Lambda Objek Anda tidak berisi parameter Range atau partNumber dari permintaan asli. Lihat opsi berikut tentang cara menangani parameter ini dalam AWS Lambda fungsi Anda.
Setelah Anda mengekstrak nilai Range atau partNumber, Anda dapat mengambil salah satu pendekatan berikut ini, berdasarkan kebutuhan aplikasi Anda:
-
Petakan
Rangeyang diminta ataupartNumberke objek yang diubah (disarankan).Cara yang paling dapat diandalkan untuk menangani permintaan
RangeataupartNumberadalah dengan melakukan hal berikut ini:-
Mengambil objek lengkap dari Amazon S3.
-
Mengubah objek tersebut.
-
Terapkan parameter
RangeataupartNumberyang diminta ke objek yang diubah.
Untuk melakukan ini, gunakan URL yang telah ditandatangani sebelumnya untuk mengambil seluruh objek dari Amazon S3, dan kemudian memproses objek tersebut sesuai kebutuhan. Untuk contoh fungsi Lambda yang memproses
Rangeparameter dengan cara ini, lihat sampel inidi repositori AWS Sampel GitHub . -
-
Petakan
Rangeyang diminta ke URL yang telah ditandatangani sebelumnya.Dalam beberapa kasus, fungsi Lambda Anda dapat memetakan permintaan
Rangelangsung ke URL yang telah ditentukan sebelumnya untuk mengambil hanya sebagian objek dari Amazon S3. Pendekatan ini hanya sesuai jika transformasi Anda memenuhi kedua kriteria berikut:-
Fungsi transformasi Anda dapat diterapkan ke sebagian rentang objek.
-
Menerapkan parameter
Rangesebelum atau sesudah fungsi transformasi menghasilkan objek yang ditransformasikan yang sama.
Misalnya, fungsi transformasi yang mengubah semua karakter dalam objek berkode ASCII menjadi huruf besar memenuhi kedua kriteria sebelumnya. Transformasi dapat diterapkan pada bagian dari suatu objek, dan menerapkan parameter
Rangesebelum transformasi mencapai hasil yang sama seperti menerapkannya setelah transformasi.Sebaliknya, fungsi yang membalikkan karakter dalam objek yang dikodekan ASCII tidak memenuhi kriteria ini. Fungsi seperti itu memenuhi kriteria 1, karena dapat diterapkan pada rentang objek sebagian. Namun, itu tidak memenuhi kriteria 2, karena menerapkan parameter
Rangesebelum transformasi mencapai hasil yang berbeda daripada menerapkan parameter setelah transformasi.Pertimbangkan permintaan untuk menerapkan fungsi ke tiga karakter pertama dari suatu objek dengan isinya
abcdefg. Menerapkan parameterRangesebelum transformasi hanya mengambilabcdan kemudian membalikkan data, mengembalikancba. Tetapi jika parameter diterapkan setelah transformasi, fungsi mengambil seluruh objek, membalikkannya, lalu menerapkan parameterRange, mengembalikangfe. Karena hasil ini berbeda, fungsi ini tidak boleh menerapkan parameterRangesaat mengambil objek dari Amazon S3. Sebaliknya, itu harus mengambil seluruh objek, melakukan transformasi, dan hanya kemudian menerapkan parameterRange.Awas
Dalam banyak kasus, menerapkan parameter
Rangeke URL yang telah ditandatangani sebelumnya akan menghasilkan perilaku tak terduga oleh fungsi Lambda atau klien yang meminta. Kecuali Anda yakin bahwa aplikasi Anda akan berfungsi dengan baik ketika hanya mengambil sebagian objek dari Amazon S3, kami menyarankan Anda mengambil dan mengubah objek penuh seperti yang dijelaskan sebelumnya dalam pendekatan A.Jika aplikasi Anda memenuhi kriteria yang dijelaskan sebelumnya dalam pendekatan B, Anda dapat menyederhanakan AWS Lambda fungsi Anda dengan mengambil hanya rentang objek yang diminta dan kemudian menjalankan transformasi Anda pada rentang tersebut.
Contoh kode Java berikut mendemonstrasikan cara untuk melakukan hal berikut ini:
-
Ambil header
Rangedari permintaanGetObject. -
Tambahkan header
Rangeke URL yang telah ditandatangani sebelumnya, yang dapat digunakan oleh Lambda untuk mengambil rentang yang diminta dari Amazon S3.
private HttpRequest.Builder applyRangeHeader(ObjectLambdaEvent event, HttpRequest.Builder presignedRequest) { var header = event.getUserRequest().getHeaders().entrySet().stream() .filter(e -> e.getKey().toLowerCase(Locale.ROOT).equals("range")) .findFirst(); // Add check in the query string itself. header.ifPresent(entry -> presignedRequest.header(entry.getKey(), entry.getValue())); return presignedRequest; } -