全部产品
Search
文档中心

MaxCompute:Hasilkan URL yang ditandatangani untuk mengunggah dan mengunduh objek OSS

更新时间:Oct 27, 2025

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_OSS tidak 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 project.schema.object_table.

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).

  • GET: Unduh objek.

  • PUT: Unggah objek.

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

  1. 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.

  2. 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;
  3. 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****             |
    +---------------+------------+------------+---------------------+---------------+----------------------------------+--------------+------------+--------------------+
  4. 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  |
    +----------------------------------------+
  5. 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

  1. Masuk ke Konsol ECS. Di panel navigasi di sebelah kiri, pilih Instances & Images > Instances.

  2. Beralih ke wilayah China (Hangzhou), pilih instans target, klik Koneksi Jarak Jauh, dan hubungkan ke instans ECS menggunakan Workbench.

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

    yuddd

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

  1. Gunakan server ECS yang Anda buat. Siapkan file data uji signedput.txt dan unggah ke direktori /opt.

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

    opopopo

Langkah 3: Kueri metadata Tabel Objek

  1. Segarkan cache tabel dengan menjalankan perintah berikut:

    ALTER TABLE test_get_signed_url_from_oss REFRESH METADATA;
  2. 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****   |
    +------------+------------+------------+---------------+---------------+------------+--------------+------------+--------------------+
  3. 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_ossxxxxxx tidak 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.table tidak dapat dikenali.

  • Solusi

    Tambahkan set odps.namespace.schema=true; sebelum pernyataan SQL fungsi untuk mengaktifkan sintaksis skema.