Object Storage Service (OSS) 内のオブジェクトの署名付き URL を生成し、個別の認証情報なしで HTTP 経由でオブジェクトをアップロード (PUT) またはダウンロード (GET) するための一時的なアクセス権を付与します。
ユースケース
MaxCompute はオブジェクトテーブル機能を提供しており、データウェアハウスエンジンが OSS に保存された非構造化データとそのメタデータにアクセスできるようにします。詳細については、「オブジェクトテーブルの定義」をご参照ください。
オブジェクトテーブルは、指定されたパス内の OSS オブジェクトのメタデータを保存します。GET_SIGNED_URL_FROM_OSS を使用して、オブジェクトの署名付き URL を動的に生成することで、ファイルのアップロードとダウンロードが可能になります。詳細については、「署名付き URL を生成して OSS オブジェクトをアップロードおよびダウンロードする」をご参照ください。
制限事項
オブジェクトテーブルは、OSS の内部エンドポイントを使用してのみ作成できます。
この関数は MaxQA クエリアクセラレーションではサポートされていません。SQL ステートメントに
SET odps.mcqa.disable=true;コマンドを含める必要があります。OSS バケットでパブリックアクセスブロック機能が有効になっている場合、
GET_SIGNED_URL_FROM_OSS関数はパブリックにアクセス可能な署名付き URL を生成できません。バケットのアクセス許可で署名付き URL の生成と使用が許可されていることを確認してください。
構文
STRING GET_SIGNED_URL_FROM_OSS (
STRING <full_object_table_name>,
STRING <key>
[, INT <timeToLiveSeconds>]
[, DATETIME <expiration>]
[, STRING <httpMethod>]
)パラメータ
パラメータ | 必須 | タイプ | 説明 | デフォルト |
full_object_table_name | はい | STRING | 3 層モデルにおけるオブジェクトテーブルの完全パス。プロジェクト名とスキーマ名を含みます。例: テーブル作成時に RoleARN 認証を選択した場合、OSS にアクセスするための STS トークンが自動的に生成されます。 | なし |
key | はい | STRING | オブジェクトテーブル内でアクセスするオブジェクトの名前。key パラメータの詳細については、オブジェクトテーブルのプロパティを表示するの戻り結果の説明をご参照ください。 | なし |
timeToLiveSeconds | いいえ | INT | 署名付き URL の有効期間 (秒単位)。最小値:1 秒。最大値:604,800 秒 (7 日間)。このパラメータは expiration と相互に排他的です。 | 3,600 秒 |
expiration | いいえ | DATETIME | 署名付き URL の有効期限。値は、現在時刻の 1 秒後から 604,800 秒 (7日間) 後までの範囲で指定する必要があります。このパラメータは timeToLiveSeconds と相互に排他的です。 | 現在時刻から 3,600 秒後 |
httpMethod | いいえ | STRING | 生成される URL の HTTP メソッド。OSS からのダウンロード (読み取り) か、OSS へのアップロード (書き込み) かを指定します。
| GET |
戻り値
生成された署名付き URL を STRING として返します。
例
次の例では、中国 (杭州) リージョンの Elastic Compute Service (ECS) インスタンスから OSS オブジェクトをダウンロードするための署名付き URL を生成します。
次のコードを実行する前に、project_name と schema_name を実際のプロジェクト名とスキーマ名に置き換えてください。
ステップ 1: ダウンロード URL の生成
OSS コンソールにログインし、テストファイル signedget.txt を
object-table-test/object_table_folderディレクトリにアップロードします。詳細については、「ファイルのアップロード」をご参照ください。ローカルクライアント (odpscmd) を使用するか、DataWorks で MaxCompute SQL ノードを作成して、オブジェクトテーブルを作成し、メタデータキャッシュを更新します。
-- MaxCompute プロジェクトでスキーマをサポートするために 3 層モデルを有効にします。 SET odps.namespace.schema=true; -- MaxCompute プロジェクトを選択します。 USE <project_name>; -- スキーマを選択します。 USE SCHEMA <schema_name>; -- MaxCompute プロジェクトで 2.0 データ型システムを有効にします。 SET odps.sql.type.system.odps2=true; -- この関数は MaxQA クエリアクセラレーションではサポートされていません。 SET odps.mcqa.disable=true; -- オブジェクトテーブルを作成します。 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/'; -- テーブルキャッシュを更新します。 ALTER TABLE test_get_signed_url_from_oss REFRESH METADATA;オブジェクトテーブル内のメタデータをクエリします。
SET odps.namespace.schema=true; SELECT * FROM test_get_signed_url_from_oss;想定される出力:
+---------------+------------+------------+---------------------+---------------+----------------------------------+--------------+------------+--------------------+ | key | size | type | last_modified | storage_class | etag | restore_info | owner_id | owner_display_name | +---------------+------------+------------+---------------------+---------------+----------------------------------+--------------+------------+--------------------+ | signedget.txt | 38 | 標準 | 2025-06-04 01:36:52 | Standard | 96D8258845DAB51BC9B****6E61A2563 | NONE | 13**** | 13**** | +---------------+------------+------------+---------------------+---------------+----------------------------------+--------------+------------+--------------------+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;想定される出力:
+----------------------------------------+ | _c0 | +----------------------------------------+ | test maxcompute download files by url | +----------------------------------------+オブジェクトテーブルをクエリし、署名付き URL を生成します。
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;想定される出力:
+------------+ | _c0 | +------------+ | http://object-table-test.oss-cn-hangzhou-internal.aliyuncs.com/object_table_folder%2Fsignedget.txt?Expires=17490****&OSSAccessKeyId=STS.****&Signature=****&security-token=**** | +------------+
ステップ 2: ECS からのオブジェクトのダウンロード
ECS コンソールにログインします。左側メニューで、 を選択します。
中国 (杭州) リージョンで、対象のインスタンスを選択し、[Remote Connection] をクリックし、Workbench を使用してインスタンスに接続します。
ターミナルで、次のコマンドを実行して OSS オブジェクトをダウンロードします:
-- ディレクトリを /opt に変更します。 cd /opt -- 署名付き URL を使用して OSS オブジェクトをダウンロードします。 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=****"出力:
[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]#
よくある質問
問題 1:関数で指定したテーブルパスが、クエリ対象のテーブルパスと異なる
エラーメッセージ
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])問題の説明
テーブル名
test_get_signed_url_from_ossxxxxxxが存在しないか、SQL ステートメントで指定されたテーブル名と異なります。解決策
既存のオブジェクトテーブルの名前を
project.schema.tableの形式で指定してください。
timeToLiveSeconds パラメータの値が無効
エラーメッセージ
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]問題の説明
timeToLiveSecondsパラメータの値が無効です。値は [1, 604800] の範囲内である必要があります。解決策
有効な有効期間 (TTL) の値を指定してください。
HttpMethod パラメータの値が無効
エラーメッセージ
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'問題の説明
HttpMethodパラメータの値が無効です。解決策
HttpMethodパラメータを GET または PUT に設定してください。
有効期間が短すぎてリンクが期限切れになる
エラーメッセージ
curl コマンドを実行すると
Request has expiredエラーが表示されます。問題の説明
署名付き URL が使用される前に有効期限が切れました。
解決策
expirationパラメータに適切な値を設定してください。過度に長い値や短い値を設定しないでください。
3 層モデル構文が有効になっていない
エラーメッセージ
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}')問題の説明
スキーマ構文が有効になっていません。そのため、
project.schema.tableの形式を解析できません。解決策
SQL ステートメントの前に
set odps.namespace.schema=true;コマンドを追加して、スキーマ構文を有効にしてください。
関連関数
GET_SIGNED_URL_FROM_OSS は非構造化データ処理関数です。その他の関連関数については、非構造化データを処理する関数をご参照ください。