Génère une URL pré-signée pour un objet dans Object Storage Service (OSS), accordant un accès temporaire pour le téléversement (PUT) ou le téléchargement (GET) de l'objet via HTTP sans informations d'identification distinctes.
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 GET_SIGNED_URL_FROM_OSS pour générer dynamiquement une URL pré-signée pour un objet, ce qui permet le téléversement et le téléchargement de fichiers. Pour plus d'informations, consultez la rubrique Générer une URL pré-signée pour téléverser et télécharger des objets OSS.
Limitations
Créez des Object Tables uniquement en utilisant le point de terminaison interne d'OSS.
Cette fonction n'est pas prise en charge pour l'accélération des requêtes MaxQA. Incluez 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 dans les résultats renvoyés par la rubrique Afficher les propriétés d'une Object Table. | Aucune |
timeToLiveSeconds | Non | INT | La durée de vie de l'URL pré-signée en secondes. Minimum : 1 seconde. Maximum : 604 800 secondes (7 jours). Ce paramètre est mutuellement exclusif avec 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 timeToLiveSeconds. | 3 600 secondes après l'heure actuelle |
httpMethod | Non | STRING | La méthode HTTP pour l'URL générée, spécifiant s'il s'agit d'un téléchargement (lecture) depuis OSS ou d'un téléversement (écriture) vers OSS.
| GET |
Valeur de retour
Renvoie l'URL pré-signée générée sous forme de 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) dans la région Chine (Hangzhou).
Avant d'exécuter le code suivant, remplacez project_name et schema_name par vos noms de projet et de schéma réels.
Étape 1 : Générer une URL de téléchargement
Connectez-vous à la console OSS et téléversez le fichier de test signedget.txt dans le répertoire
object-table-test/object_table_folder. Pour plus d'informations, consultez la rubrique Téléverser des fichiers.-
Utilisez un client local (odpscmd) ou créez un nœud MaxCompute SQL dans DataWorks pour créer une Object Table et 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 WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::<uid>:role/<role_name>' ) 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 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 en utilisant 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 à l'aide de 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 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 la 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 au 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
timeToLiveSecondsn'est pas valide. La valeur doit être comprise dans la plage [1, 604800]. -
Solution
Spécifiez 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
HttpMethodn'est pas valide. -
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 lorsque vous exécutez 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. Ne définissez pas une valeur excessivement longue ou courte.
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 du 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 du schéma.
Fonctions associées
GET_SIGNED_URL_FROM_OSS est une fonction de traitement des données non structurées. Pour les autres fonctions associées, consultez la rubrique Fonctions de traitement des données non structurées.