Topik ini menjelaskan cara menggunakan Tabel Objek untuk menghasilkan URL yang ditandatangani guna mengunggah dan mengunduh objek OSS.
Informasi latar belakang
Tabel Objek MaxCompute dapat memproses data tidak terstruktur di OSS. Anda dapat menggunakan Tabel Objek dan kueri SQL untuk menyaring daftar citra berdasarkan kriteria seperti waktu, nama, atau ukuran. Daftar ini kemudian dapat diteruskan ke layanan pihak ketiga untuk diproses. Namun, layanan komputasi tersebut memerlukan izin untuk mengunduh objek OSS. Metode umum termasuk penggunaan AccessKey (AK) permanen atau asumsi peran layanan. Metode-metode ini memiliki kelemahan sebagai berikut:
AK permanen menimbulkan risiko keamanan karena harus disimpan di layanan pihak ketiga. Jika AK bocor, hal ini dapat menyebabkan risiko keamanan yang signifikan.
Asumsi peran layanan biasanya merujuk pada peran yang diasumsikan oleh MaxCompute saat mengakses OSS. Layanan pihak ketiga harus mengasumsikan peran terpisah, yang dapat memperumit kode.
OSS mendukung penggunaan URL pra-tandatangan untuk mengunduh atau melihat pratinjau file. Jika URL yang ditandatangani memiliki periode validitas yang cukup lama, Anda dapat mengakses objek langsung melalui protokol HTTP. Proses ini sederhana. Selain menghasilkan URL untuk unduhan, Anda juga dapat menghasilkan URL untuk unggahan sesuai kebutuhan.
GET_SIGNED_URL_FROM_OSS
Menghasilkan URL yang ditandatangani tanpa kredensial untuk mengunduh atau mengunggah data OSS. Ini memungkinkan pengguna membaca dan menulis file OSS langsung melalui protokol HTTP.
Batasan
Anda hanya dapat membuat Tabel Objek dalam jaringan internal OSS.
Fungsi ini tidak didukung untuk akselerasi kueri MaxQA. Anda harus menambahkan parameter
SET odps.mcqa.disable=true;dan menjalankannya dengan Pernyataan SQL.Jika fitur Blokir Akses Publik diaktifkan untuk bucket OSS, fungsi
GET_SIGNED_URL_FROM_OSStidak dapat menghasilkan URL yang ditandatangani yang dapat diakses publik. Pastikan izin bucket mengizinkan pembuatan dan penggunaan URL yang ditandatangani.
Sintaksis
STRING GET_SIGNED_URL_FROM_OSS (
STRING <full_object_table_name>,
STRING <key>
[, INT <timeToLiveSeconds>]
[, DATETIME <expiration>]
[, STRING <httpMethod>]
)Parameter
Parameter | Diperlukan | Tipe data | Deskripsi | Nilai default |
full_object_table_name | Ya | STRING | Dalam model Lapisan 3, ini adalah jalur lengkap dari TABEL OBJEK. Jalur mencakup nama proyek dan skema, seperti Jika Anda memilih otentikasi RoleARN saat membuat tabel, parameter ini membantu menghasilkan token Security Token Service (STS) secara otomatis untuk mengakses OSS. | Tidak ada |
key | Ya | STRING | Nama objek yang akan diakses dalam Tabel Objek. Untuk informasi lebih lanjut, lihat deskripsi parameter key dalam hasil balik dari Lihat properti TABEL OBJEK. | Tidak ada |
timeToLiveSeconds | Tidak | INT | Periode validitas URL yang ditandatangani dalam detik. Nilai minimum adalah 1 detik. Nilai maksimum adalah 7 hari (604.800 detik). Anda tidak dapat menggunakan parameter ini dengan expiration. | 3.600 detik. |
expiration | Tidak | DATETIME | Waktu kedaluwarsa URL yang ditandatangani. Waktu harus setidaknya 1 detik setelah waktu saat ini dan tidak lebih dari 7 hari (604.800 detik) setelah waktu saat ini. Anda tidak dapat menggunakan parameter ini dengan timeToLiveSeconds. | 3.600 detik setelah waktu saat ini. |
httpMethod | Tidak | STRING | Metode HTTP yang digunakan dengan URL yang dihasilkan. Ini menentukan apakah akan mengunduh (membaca data dari OSS) atau mengunggah (menulis data ke OSS).
| Nilai defaultnya adalah GET. |
Nilai balik
Mengembalikan nilai STRING, yaitu URL pra-tandatangan yang dihasilkan.
Definisi fungsi lainnya untuk skenario berbeda
Mode minimal. URL kedaluwarsa dalam 3.600 detik. Metode default adalah GET.
STRING get_signed_url_from_oss ( STRING <fullTableName>, STRING <ossKey> );Periode kedaluwarsa kustom. Metode default adalah GET.
STRING GET_SIGNED_URL_FROM_OSS( STRING <fullTableName>, STRING <ossKey>, INT <timeToLiveSeconds> );Periode kedaluwarsa kustom dan metode akses.
STRING GET_SIGNED_URL_FROM_OSS( STRING <fullTableName>, STRING <ossKey>, INT <timeToLiveSeconds>, STRING <httpMethod> );Periode kedaluwarsa kustom. Metode default adalah GET.
STRING GET_SIGNED_URL_FROM_OSS( STRING <fullTableName>, STRING <ossKey>, DATETIME <expiration> );Periode kedaluwarsa kustom dan metode akses.
STRING GET_SIGNED_URL_FROM_OSS( STRING <fullTableName>, STRING <ossKey>, DATETIME <expiration>, STRING <httpMethod> );
Contoh
Bagian ini memberikan contoh di wilayah China (Hangzhou). Ini menunjukkan cara menghasilkan URL pra-tandatangan dan menggunakannya untuk mengunduh objek OSS dari instance Elastic Compute Service (ECS).
Saat menjalankan kode berikut, ganti project_name dan schema_name dengan nama proyek dan skema aktual Anda.
Unduh objek OSS dari instance ECS menggunakan URL yang ditandatangani
Langkah 1: Hasilkan URL untuk mengunduh objek OSS
Masuk ke Konsol OSS dan unggah file data uji signedget.txt ke direktori
object-table-test/object_table_folder. Untuk informasi lebih lanjut, lihat Unggah File.Gunakan klien lokal (odpscmd) atau buat node SQL MaxCompute di DataWorks untuk membuat Tabel Objek dan segarkan cache metadata-nya.
-- Tabel Objek dalam proyek MaxCompute mendukung skema. Aktifkan model Lapisan 3. SET odps.namespace.schema=true; -- Pilih proyek MaxCompute target. USE <project_name>; -- Pilih skema target. USE SCHEMA <schema_name>; -- Tabel Objek dalam proyek MaxCompute mendukung sistem tipe data 2.0. SET odps.sql.type.system.odps2=true; -- Fitur ini saat ini tidak didukung untuk akselerasi kueri MaxQA. SET odps.mcqa.disable=true; -- Buat Tabel Objek. CREATE OBJECT TABLE IF NOT EXISTS test_get_signed_url_from_oss LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/object-table-test/object_table_folder/'; -- Segarkan cache tabel. ALTER TABLE test_get_signed_url_from_oss REFRESH METADATA;Kueri metadata dalam Tabel Objek.
SELECT * FROM test_get_signed_url_from_oss;Hasil berikut dikembalikan:
+---------------+------------+------------+---------------------+---------------+----------------------------------+--------------+------------+--------------------+ | key | size | type | last_modified | storage_class | etag | restore_info | owner_id | owner_display_name | +---------------+------------+------------+---------------------+---------------+----------------------------------+--------------+------------+--------------------+ | signedget.txt | 38 | Normal | 2025-06-04 01:36:52 | Standard | 96D8258845DAB51BC9B****6E61A2563 | NONE | 13**** | 13**** | +---------------+------------+------------+---------------------+---------------+----------------------------------+--------------+------------+--------------------+Baca data objek menggunakan fungsi GET_DATA_FROM_OSS.
SELECT STRING( GET_DATA_FROM_OSS( '<project_name>.<schema_name>.test_get_signed_url_from_oss', key ) ) FROM test_get_signed_url_from_oss;Hasil berikut dikembalikan:
+----------------------------------------+ | _c0 | +----------------------------------------+ | test maxcompute download files by url | +----------------------------------------+Kueri Tabel Objek dan hasilkan URL yang ditandatangani.
SELECT GET_SIGNED_URL_FROM_OSS( '<project_name>.<schema_name>.test_get_signed_url_from_oss', key) FROM test_get_signed_url_from_oss;Hasil berikut dikembalikan:
+------------+ | _c0 | +------------+ | http://object-table-test.oss-cn-hangzhou-internal.aliyuncs.com/object_table_folder%2Fsignedget.txt?Expires=17490****&OSSAccessKeyId=STS.****&Signature=****&security-token=**** | +------------+
Langkah 2: Unduh objek dari server ECS
Masuk ke Konsol ECS. Di panel navigasi di sebelah kiri, pilih .
Beralih ke wilayah China (Hangzhou), pilih instans target, klik Koneksi Jarak Jauh, dan hubungkan ke instans ECS menggunakan Workbench.
Dalam kotak dialog terminal, jalankan perintah berikut untuk mengunduh objek OSS:
-- Beralih ke direktori /opt. cd /opt -- Unduh objek OSS menggunakan URL yang ditandatangani. curl -o /opt/ecs_signed.txt "http://object-table-test.oss-cn-hangzhou-internal.aliyuncs.com/object_table_folder%2Fsignedget.txt?Expires=17490****&OSSAccessKeyId=STS.****&Signature=****&security-token=****"Gambar berikut menunjukkan hasil yang dikembalikan:

Unggah objek OSS dari instance ECS menggunakan URL yang ditandatangani
Langkah 1: Hasilkan URL untuk mengunggah objek OSS
Gunakan Tabel Objek test_get_signed_url_from_oss yang Anda buat. Kueri Tabel Objek untuk menghasilkan URL yang ditandatangani. Kode berikut memberikan contoh:
SELECT get_signed_url_from_oss(
'<project_name>.<schema_name>.test_get_signed_url_from_oss',
key,
3600,
'PUT'
)
FROM test_get_signed_url_from_oss;Hasil berikut dikembalikan:
+------------+
| _c0 |
+------------+
| http://object-table-test.oss-cn-hangzhou-internal.aliyuncs.com/object_table_folder%2Fsinged_put?Expires=17490****&OSSAccessKeyId=****&Signature=****&security-token=**** |
+------------+Langkah 2: Unggah objek dari server ECS
Gunakan server ECS yang Anda buat. Siapkan file data uji signedput.txt dan unggah ke direktori /opt.
Dalam terminal Workbench, jalankan perintah berikut untuk mengunggah data ke OSS.
-- Beralih ke direktori /opt. cd /opt -- Unggah signedput.txt ke OSS menggunakan URL yang ditandatangani. curl -X PUT -T /opt/signedput.txt -i "http://object-table-test.oss-cn-hangzhou-internal.aliyuncs.com/object_table_folder%2Fsinged_put?Expires=17490****&OSSAccessKeyId=****&Signature=****&security-token=****"Gambar berikut menunjukkan hasilnya:

Langkah 3: Kueri metadata Tabel Objek
Segarkan cache tabel dengan menjalankan perintah berikut:
ALTER TABLE test_get_signed_url_from_oss REFRESH METADATA;Kueri metadata Tabel Objek dengan menjalankan perintah berikut:
SELECT * FROM test_get_signed_url_from_oss;Hasil berikut dikembalikan:
+------------+------------+------------+---------------+---------------+------------+--------------+------------+--------------------+ | key | size | type | last_modified | storage_class | etag | restore_info | owner_id | owner_display_name | +------------+------------+------------+---------------+---------------+------------+--------------+------------+--------------------+ | signedget.txt | 38 | Normal | 2025-06-03 01:36:52 | Standard | 96D8258845DAB51BC****546E61A2563 | NONE | 13**** | 13**** | | singed_put | 44 | Normal | 2025-06-03 19:31:23 | Standard | F5EA64DF895CF08C3****7D3FD09F12 | NONE | 13**** | 13**** | +------------+------------+------------+---------------+---------------+------------+--------------+------------+--------------------+Baca data objek OSS menggunakan fungsi GET_DATA_FROM_OSS. Perintahnya adalah sebagai berikut:
SELECT string( get_data_from_oss( '<project_name>.<schema_name>.test_get_signed_url_from_oss', key ) ) FROM test_get_signed_url_from_oss;Hasil berikut dikembalikan:
+------------+ | _c0 | +------------+ | test maxcompute download files by url | | test Object Table upload file to oss by url | +------------+
Pertanyaan Umum
Pertanyaan Umum 1: Jalur tabel dalam fungsi berbeda dari jalur tabel dasar yang sedang dikueri
Pesan Kesalahan
ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: Can't do ObjectTableTwoPhasesSplitting process (Caused by: java.lang.IllegalArgumentException: The first arg[xxx.default.test_get_signed_url_from_ossxxxxxx] of function GET_SIGNED_URL_FROM_OSS({object_table_full_name}, {object_key}, ...) can't be found in the underlying object table scans[xxx.default.test_get_signed_url_from_oss]).Deskripsi Kesalahan
Nama tabel
test_get_signed_url_from_ossxxxxxxtidak ada atau berbeda dari nama tabel yang diakses dalam pernyataan SQL.Solusi
Masukkan nama Tabel Objek yang ada. Nama tersebut harus sama dengan tabel yang sedang dikueri dan dalam format
project.schema.table.
Pertanyaan Umum 2: Nilai parameter timeToLiveSeconds tidak valid
Pesan Kesalahan
ODPS-0121095:[1,8] Invalid argument - The parameter <timeToLiveSeconds> of the function GET_SIGNED_URL_FROM_OSS() you specified (0) is invalid, it should be in the range [1, 604800].Deskripsi Kesalahan
Nilai parameter periode kedaluwarsa (timeToLiveSeconds) dalam fungsi tidak valid. Nilai tersebut harus berupa bilangan bulat dari 1 hingga 604.800.
Solusi
Masukkan periode kedaluwarsa yang berada dalam rentang valid.
Pertanyaan Umum 3: Nilai parameter HttpMethod tidak valid
Pesan Kesalahan
ODPS-0121095:[1,8] Invalid argument - The parameter <httpMethod> of the function GET_SIGNED_URL_FROM_OSS() you specified 'PU' is invalid, it can only be 'GET' or 'PUT'.Deskripsi Kesalahan
Nilai parameter HttpMethod dalam fungsi tidak valid.
Solusi
Nilai parameter HttpMethod hanya bisa GET atau PUT.
Pertanyaan Umum 4: URL yang ditandatangani telah kedaluwarsa karena periode validitas terlalu pendek
Pesan Kesalahan
Kesalahan "Permintaan telah kedaluwarsa" dilaporkan saat Anda menjalankan perintah curl.
Deskripsi Kesalahan
Periode validitas URL yang ditandatangani terlalu pendek, dan URL telah kedaluwarsa.
Solusi
Atur parameter kedaluwarsa ke nilai yang wajar. Kami sarankan Anda menghindari menetapkan periode yang terlalu lama atau terlalu pendek.
Pertanyaan Umum 5: Sakelar untuk sintaksis model Lapisan 3 tidak diaktifkan
Pesan Kesalahan
ODPS-0130071:[0,0] Semantic analysis exception - physical plan generation failed: Can't do ObjectTableTwoPhasesSplitting process (Caused by: java.lang.IllegalArgumentException: Invalid parameter of object table full name[str=xxx.test_get_signed_url_from_oss], which should be split up into 3 parts by '.' like '${project}.${schema}.${table}').Deskripsi Kesalahan
Sakelar untuk sintaksis skema tidak diaktifkan. Oleh karena itu, format sintaksis
project.schema.tabletidak dapat dikenali.Solusi
Tambahkan
set odps.namespace.schema=true;sebelum pernyataan SQL fungsi untuk mengaktifkan sintaksis skema.