Bekerja dengan header Range dan partNumber - Amazon Simple Storage Service

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

Range (header)

userRequest.headers.Range

Range (parameter kueri)

userRequest.url (parameter kueri Range)

partNumber

userRequest.url (parameter kueri partNumber)

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:

  1. Petakan Range yang diminta atau partNumber ke objek yang diubah (disarankan).

    Cara yang paling dapat diandalkan untuk menangani permintaan Range atau partNumber adalah dengan melakukan hal berikut ini:

    • Mengambil objek lengkap dari Amazon S3.

    • Mengubah objek tersebut.

    • Terapkan parameter Range atau partNumber 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 ini di repositori AWS Sampel GitHub .

  2. 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:

    1. Fungsi transformasi Anda dapat diterapkan ke sebagian rentang objek.

    2. 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 parameter Range sebelum transformasi hanya mengambil abc dan kemudian membalikkan data, mengembalikan cba. Tetapi jika parameter diterapkan setelah transformasi, fungsi mengambil seluruh objek, membalikkannya, lalu menerapkan parameter Range, mengembalikan gfe. Karena hasil ini berbeda, fungsi ini tidak boleh menerapkan parameter Range saat mengambil objek dari Amazon S3. Sebaliknya, itu harus mengambil seluruh objek, melakukan transformasi, dan hanya kemudian menerapkan parameter Range.

    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 permintaan GetObject.

    • 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; }