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
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
Range
yang diminta ataupartNumber
ke objek yang diubah (disarankan).Cara yang paling dapat diandalkan untuk menangani permintaan
Range
ataupartNumber
adalah dengan melakukan hal berikut ini:-
Mengambil objek lengkap dari Amazon S3.
-
Mengubah objek tersebut.
-
Terapkan parameter
Range
ataupartNumber
yang 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
Range
parameter dengan cara ini, lihat sampel inidi repositori AWS Sampel GitHub . -
-
Petakan
Range
yang diminta ke URL yang telah ditandatangani sebelumnya.Dalam beberapa kasus, fungsi Lambda Anda dapat memetakan permintaan
Range
langsung 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
Range
sebelum 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
Range
sebelum 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
Range
sebelum 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 parameterRange
sebelum transformasi hanya mengambilabc
dan 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 parameterRange
saat mengambil objek dari Amazon S3. Sebaliknya, itu harus mengambil seluruh objek, melakukan transformasi, dan hanya kemudian menerapkan parameterRange
.Awas
Dalam banyak kasus, menerapkan parameter
Range
ke 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
Range
dari permintaanGetObject
. -
Tambahkan header
Range
ke 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; }
-