Gera uma URL pré-assinada para um objeto no Object Storage Service (OSS), concedendo acesso temporário para upload (PUT) ou download (GET) do objeto via HTTP sem credenciais separadas.
Casos de uso
O MaxCompute oferece o recurso Object Table, que permite ao mecanismo de data warehouse acessar dados não estruturados e metadados armazenados no OSS. Para mais informações, consulte Object Table definition.
Uma Object Table armazena os metadados de objetos do OSS em um caminho especificado. Use GET_SIGNED_URL_FROM_OSS para gerar dinamicamente uma URL pré-assinada para um objeto, possibilitando uploads e downloads de arquivos. Para mais informações, consulte Generate a pre-signed URL to upload and download OSS objects.
Limitações
Crie Object Tables apenas usando o endpoint interno do OSS.
Esta função não oferece suporte à aceleração de consultas MaxQA. Inclua o comando
SET odps.mcqa.disable=true;na instrução SQL.Se um bucket do OSS tiver o recurso Block Public Access ativado, a função
GET_SIGNED_URL_FROM_OSSnão poderá gerar uma URL pré-assinada publicamente acessível. Verifique se as permissões do bucket permitem a geração e o uso de URLs pré-assinadas.
Sintaxe
STRING GET_SIGNED_URL_FROM_OSS (
STRING <full_object_table_name>,
STRING <key>
[, INT <timeToLiveSeconds>]
[, DATETIME <expiration>]
[, STRING <httpMethod>]
)
Parâmetros
Parâmetro | Obrigatório | Tipo | Descrição | Padrão |
full_object_table_name | Sim | STRING | Caminho completo da Object Table no modelo de três camadas, incluindo os nomes do projeto e do schema. Exemplo: Ao selecionar a autenticação RoleARN durante a criação da tabela, o sistema gera automaticamente um token STS para acessar o OSS. | Nenhum |
key | Sim | STRING | Nome do objeto a ser acessado na Object Table. Para obter detalhes sobre o parâmetro key, consulte a descrição nos resultados retornados em View Object Table properties. | Nenhum |
timeToLiveSeconds | Não | INT | Tempo de vida da URL pré-assinada em segundos. Mínimo: 1 segundo. Máximo: 604.800 segundos (7 dias). Este parâmetro é mutuamente exclusivo com expiration. | 3.600 segundos |
expiration | Não | DATETIME | Data e hora de expiração da URL pré-assinada. O valor deve ser de pelo menos 1 segundo e no máximo 604.800 segundos (7 dias) após o horário atual. Este parâmetro é mutuamente exclusivo com timeToLiveSeconds. | 3.600 segundos após o horário atual |
httpMethod | Não | STRING | Método HTTP da URL gerada. Define se a operação será de download (leitura) ou upload (escrita) no OSS.
| GET |
Valor retornado
Retorna a URL pré-assinada gerada como uma STRING.
Exemplos
O exemplo a seguir gera uma URL pré-assinada para baixar um objeto do OSS a partir de uma instância do Elastic Compute Service (ECS) na região China (Hangzhou).
Antes de executar o código abaixo, substitua project_name e schema_name pelos nomes reais do seu projeto e schema.
Etapa 1: Gerar uma URL de download
Faça login no console do OSS e envie o arquivo de teste signedget.txt para o diretório
object-table-test/object_table_folder. Para mais informações, consulte Upload files.-
Use um local client (odpscmd) ou crie um MaxCompute SQL node no DataWorks para criar uma Object Table e atualizar o cache de metadados.
-- 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; -
Consulte os metadados na Object Table.
SET odps.namespace.schema=true; SELECT * FROM test_get_signed_url_from_oss;Saída esperada:
+---------------+------------+------------+---------------------+---------------+----------------------------------+--------------+------------+--------------------+ | 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**** | +---------------+------------+------------+---------------------+---------------+----------------------------------+--------------+------------+--------------------+ -
Leia os dados do objeto usando a função 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;Saída esperada:
+----------------------------------------+ | _c0 | +----------------------------------------+ | test maxcompute download files by url | +----------------------------------------+ -
Consulte a Object Table e gere uma URL pré-assinada.
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;Saída esperada:
+------------+ | _c0 | +------------+ | http://object-table-test.oss-cn-hangzhou-internal.aliyuncs.com/object_table_folder%2Fsignedget.txt?Expires=17490****&OSSAccessKeyId=STS.****&Signature=****&security-token=**** | +------------+
Etapa 2: Baixar o objeto do ECS
Faça login no console do ECS. No painel de navegação à esquerda, escolha .
Na região China (Hangzhou), selecione a instância desejada, clique em Remote Connection e conecte-se à instância usando o Workbench.
-
No terminal, execute os comandos a seguir para baixar o objeto do 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=****"Saída:
[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]#
Perguntas frequentes
Problema 1: O caminho da tabela na função difere do caminho da tabela subjacente consultada
-
Mensagem de erro
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]). -
Descrição do problema
O nome da tabela
test_get_signed_url_from_ossxxxxxxnão existe ou difere do nome especificado na instrução SQL. -
Solução
Especifique o nome de uma Object Table existente no formato
project.schema.table.
O valor do parâmetro timeToLiveSeconds é inválido
-
Mensagem de erro
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]. -
Descrição do problema
O valor do parâmetro
timeToLiveSecondsé inválido. O valor deve estar no intervalo [1, 604800]. -
Solução
Defina um valor válido para o tempo de vida (TTL).
O valor do parâmetro HttpMethod é inválido
-
Mensagem de erro
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'. -
Descrição do problema
O valor do parâmetro
HttpMethodé inválido. -
Solução
Defina o parâmetro
HttpMethodcomo GET ou PUT.
O link expirou porque o período de validade é muito curto
-
Mensagem de erro
O erro
Request has expiredocorre ao executar o comando curl. -
Descrição do problema
A URL assinada expirou antes do uso.
-
Solução
Defina um valor adequado para o parâmetro
expiration. Evite valores excessivamente longos ou curtos.
A sintaxe do modelo de três camadas não está ativada
-
Mensagem de erro
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}'). -
Descrição do problema
A sintaxe de schema não está ativada. Portanto, o sistema não consegue analisar o formato
project.schema.table. -
Solução
Adicione o comando
set odps.namespace.schema=true;antes da instrução SQL para ativar a sintaxe de schema.
Funções relacionadas
GET_SIGNED_URL_FROM_OSS é uma função de processamento de dados não estruturados. Para outras funções relacionadas, consulte Functions for processing unstructured data.