Génère une URL pré-signée pour un objet stocké dans Object Storage Service (OSS), accordant un accès temporaire pour le chargement (PUT) ou le téléchargement (GET) de l'objet via HTTP, sans nécessiter d'identifiants distincts.
Cas d'utilisation
MaxCompute propose la fonctionnalité Object Table, qui permet au moteur d'entrepôt de données d'accéder aux données non structurées et à leurs métadonnées stockées dans OSS. Pour plus d'informations, consultez la rubrique Définition d'une Object Table.
Une Object Table stocke les métadonnées des objets OSS situés dans un chemin d'accès spécifié. Utilisez la fonction GET_SIGNED_URL_FROM_OSS pour générer dynamiquement une URL pré-signée pour un objet, ce qui permet le chargement et le téléchargement de fichiers. Pour en savoir plus, reportez-vous à la section Générer une URL pré-signée pour charger et télécharger des objets OSS.
Limites
Créez des Object Tables uniquement en utilisant le point de terminaison interne d'OSS.
Cette fonction n'est pas prise en charge par l'accélération des requêtes MaxQA. Vous devez inclure la commande
SET odps.mcqa.disable=true;avec votre instruction SQL.Si la fonctionnalité Block Public Access est activée sur un bucket OSS, la fonction
GET_SIGNED_URL_FROM_OSSne peut pas générer d'URL pré-signée accessible publiquement. Assurez-vous que les autorisations de votre bucket permettent la génération et l'utilisation d'URL pré-signées.
Syntaxe
STRING GET_SIGNED_URL_FROM_OSS (
STRING <full_object_table_name>,
STRING <key>
[, INT <timeToLiveSeconds>]
[, DATETIME <expiration>]
[, STRING <httpMethod>]
)
Paramètres
Paramètre | Obligatoire | Type | Description | Valeur par défaut |
full_object_table_name | Oui | STRING | Le chemin d'accès complet de l'Object Table dans le modèle à trois couches, incluant les noms du projet et du schéma. Exemple : Si vous sélectionnez l'authentification RoleARN lors de la création de la table, un jeton STS est automatiquement généré pour accéder à OSS. | Aucune |
key | Oui | STRING | Le nom de l'objet auquel accéder au sein de l'Object Table. Pour plus d'informations sur le paramètre key, consultez la description fournie dans les résultats renvoyés par la section Afficher les propriétés d'une Object Table. | Aucune |
timeToLiveSeconds | Non | INT | La durée de vie de l'URL pré-signée, exprimée en secondes. Minimum : 1 seconde. Maximum : 604 800 secondes (7 jours). Ce paramètre est mutuellement exclusif avec le paramètre expiration. | 3 600 secondes |
expiration | Non | DATETIME | L'heure d'expiration de l'URL pré-signée. La valeur doit être comprise entre 1 seconde et 604 800 secondes (7 jours) après l'heure actuelle. Ce paramètre est mutuellement exclusif avec le paramètre timeToLiveSeconds. | 3 600 secondes après l'heure actuelle |
httpMethod | Non | STRING | La méthode HTTP utilisée pour l'URL générée, indiquant s'il s'agit d'un téléchargement (lecture) depuis OSS ou d'un chargement (écriture) vers OSS.
| GET |
Valeur de retour
Renvoie l'URL pré-signée générée sous forme de chaîne de caractères (STRING).
Exemples
L'exemple suivant génère une URL pré-signée pour télécharger un objet OSS depuis une instance Elastic Compute Service (ECS) située dans la région Chine (Hangzhou).
Avant d'exécuter le code ci-dessous, remplacez project_name et schema_name par les noms réels de votre projet et de votre schéma.
Étape 1 : Générer une URL de téléchargement
Connectez-vous à la console OSS et chargez le fichier de test signedget.txt dans le répertoire
object-table-test/object_table_folder. Pour plus de détails, consultez la rubrique Charger des fichiers.-
Utilisez un client local (odpscmd) ou créez un nœud SQL MaxCompute dans DataWorks afin de créer une Object Table et d'actualiser le cache des métadonnées.
-- Enable the three-layer model to support schemas in a MaxCompute project. SET odps.namespace.schema=true; -- Select the MaxCompute project. USE <project_name>; -- Select the schema. USE SCHEMA <schema_name>; -- Enable the 2.0 data type system in the MaxCompute project. SET odps.sql.type.system.odps2=true; -- This function is not supported for MaxQA query acceleration. SET odps.mcqa.disable=true; -- Create an Object Table. 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/'; -- Refresh the table cache. ALTER TABLE test_get_signed_url_from_oss REFRESH METADATA; -
Interrogez les métadonnées présentes dans l'Object Table.
SET odps.namespace.schema=true; SELECT * FROM test_get_signed_url_from_oss;Résultat attendu :
+---------------+------------+------------+---------------------+---------------+----------------------------------+--------------+------------+--------------------+ | 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**** | +---------------+------------+------------+---------------------+---------------+----------------------------------+--------------+------------+--------------------+ -
Lisez les données de l'objet à l'aide de la fonction GET_DATA_FROM_OSS.
SET odps.namespace.schema=true; SELECT STRING( GET_DATA_FROM_OSS( '<project_name>.<schema_name>.test_get_signed_url_from_oss', key ) ) FROM test_get_signed_url_from_oss;Résultat attendu :
+----------------------------------------+ | _c0 | +----------------------------------------+ | test maxcompute download files by url | +----------------------------------------+ -
Interrogez l'Object Table et générez une URL pré-signée.
SET odps.namespace.schema=true; SELECT GET_SIGNED_URL_FROM_OSS( '<project_name>.<schema_name>.test_get_signed_url_from_oss', key) FROM test_get_signed_url_from_oss;Résultat attendu :
+------------+ | _c0 | +------------+ | http://object-table-test.oss-cn-hangzhou-internal.aliyuncs.com/object_table_folder%2Fsignedget.txt?Expires=17490****&OSSAccessKeyId=STS.****&Signature=****&security-token=**** | +------------+
Étape 2 : Télécharger l'objet depuis ECS
Connectez-vous à la console ECS. Dans le volet de navigation de gauche, choisissez .
Dans la région Chine (Hangzhou), sélectionnez l'instance cible, cliquez sur Remote Connection, puis connectez-vous à l'instance via Workbench.
-
Dans le terminal, exécutez les commandes suivantes pour télécharger l'objet OSS :
-- Change the directory to /opt. cd /opt -- Download the OSS object by using the pre-signed URL. 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=****"Sortie :
[xxx] opt]# curl -o /opt/ecs_signed.txt "http://object-table-test.oss-cn-hangzhou-inxxx&SAccessKeyId=STS.xxx&Signature=xxx&security-token=CAIS3gJxxx xxx % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 38 100 38 0 0 263 0 --:--:-- --:--:-- --:--:-- 265 opt]# ls aliyun-security ecs_signed.txt [root@iZbp1al9u5z0axrqx50mptZ opt]# cat ecs_signed.txt test maxcompute download files by url xxx opt]#
FAQ
Problème 1 : Le chemin de la table indiqué dans la fonction diffère du chemin de la table sous-jacente interrogée
-
Message d'erreur
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]). -
Description du problème
Le nom de table
test_get_signed_url_from_ossxxxxxxn'existe pas ou diffère du nom de table spécifié dans l'instruction SQL. -
Solution
Spécifiez le nom d'une Object Table existante en utilisant le format
project.schema.table.
La valeur du paramètre timeToLiveSeconds n'est pas valide
-
Message d'erreur
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]. -
Description du problème
La valeur du paramètre
timeToLiveSecondsest incorrecte. Elle doit se situer dans la plage [1, 604 800]. -
Solution
Indiquez une valeur valide pour la durée de vie (TTL).
La valeur du paramètre HttpMethod n'est pas valide
-
Message d'erreur
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'. -
Description du problème
La valeur du paramètre
HttpMethodest incorrecte. -
Solution
Définissez le paramètre
HttpMethodsur GET ou PUT.
Le lien a expiré car la période de validité est trop courte
-
Message d'erreur
L'erreur
Request has expireds'affiche lors de l'exécution de la commande curl. -
Description du problème
L'URL signée a expiré avant d'être utilisée.
-
Solution
Définissez une valeur raisonnable pour le paramètre
expiration. Évitez les valeurs excessivement longues ou courtes.
La syntaxe du modèle à trois couches n'est pas activée
-
Message d'erreur
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}'). -
Description du problème
La syntaxe de schéma n'est pas activée. Par conséquent, le format
project.schema.tablene peut pas être analysé. -
Solution
Ajoutez la commande
set odps.namespace.schema=true;avant l'instruction SQL pour activer la syntaxe de schéma.
Fonctions associées
GET_SIGNED_URL_FROM_OSS est une fonction de traitement des données non structurées. Pour consulter d'autres fonctions connexes, reportez-vous à la rubrique Fonctions de traitement des données non structurées.