OSS のアップロードコールバックは、オブジェクトが正常にアップロードされた後、アプリケーションサーバーに自動的に通知を送信し、後続の処理を行えるようにします。
制限事項
利用可能なリージョン
コールバック機能は、次のリージョンで利用できます:中国 (杭州)、中国 (上海)、中国 (青島)、中国 (北京)、中国 (張家口)、中国 (フフホト)、中国 (ウランチャブ)、中国 (深セン)、中国 (河源)、中国 (広州)、中国 (成都)、中国 (香港)、米国 (シリコンバレー)、米国 (バージニア)、日本 (東京)、シンガポール、マレーシア (クアラルンプール)、インドネシア (ジャカルタ)、フィリピン (マニラ)、ドイツ (フランクフルト)、英国 (ロンドン)、UAE (ドバイ)。
コールバックの動作
コールバックリクエストは 5 秒以内にレスポンスを受信する必要があります。それ以外の場合、コールバックは失敗します。
コールバックが失敗しても、オブジェクトのアップロードの成功に影響を与えません。
OSS は、失敗したコールバックを自動的にリトライしません。
サポートされている操作
PutObject、PostObject、CompleteMultipartUpload の各操作に対してコールバックを設定できます。これらの基本操作に基づいて構築されている V2 SDK のファイルアップロードマネージャーと署名付き URL も、コールバックをサポートしています。
仕組み
Object Storage Service (OSS) のコールバックプロセスの手順は次のとおりです。
コールバックパラメーターを指定したオブジェクトのアップロード
オブジェクトをアップロードする際、クライアントはアプリケーションサーバーの URL とコールバックリクエストの内容を指定するために、
callbackパラメーターを含める必要があります。カスタム変数を渡すには、オプションのcallback-varパラメーターを含めることもできます。OSS によるオブジェクトの格納とコールバックリクエストの送信
オブジェクトが正常にアップロードされると、OSS は指定されたコールバック URL に POST リクエストを送信します。このリクエストは、バケット、オブジェクト、サイズ、ETag などのオブジェクト情報、および任意のカスタム変数を含みます。
アプリケーションサーバーによるコールバックの処理とレスポンスの返信
コールバックリクエストを受信すると、アプリケーションサーバーはそれを処理し、セキュリティのため任意でリクエスト署名を検証して、5 秒以内に JSON 応答を返します。HTTP ステータスコード 200 は成功を示します。それ以外のステータスコードは失敗を示します。
OSS によるアップロード結果の返却
アプリケーションサーバーから成功のレスポンスを受信すると、OSS はそのレスポンスを最終的なアップロード結果としてクライアントに転送します。
実装
アップロードコールバックのデバッグは、クライアントサイドでのアップロードとサーバーサイドでのコールバック処理の2つの部分から構成されます。最初にクライアントサイドの実装をデバッグし、その後にアプリケーションサーバーをデバッグします。両方の部分が個別に動作することを確認した後、エンドツーエンドテストを実施します。
クライアントサイドでの実装
迅速に実装するには、SDKs に用意されているサンプルコードをご参照ください。
オブジェクトのアップロード後に OSS の自動コールバックをトリガーするには、アップロードリクエストに callback パラメーターと、任意の callback-var パラメーターを含める必要があります。
callbackパラメーターの設定このパラメーターは、アプリケーションサーバーの URL とリクエストボディの形式を定義します。JSON オブジェクトとして作成し、Base64 でエンコードする必要があります。
最小構成の例:
{ "callbackUrl":"http://oss-demo.aliyuncs.com:23450", "callbackBody":"bucket=${bucket}&object=${object}&my_var=${x:my_var}" }この例では、次のとおりです:
callbackUrl:アプリケーションサーバーのアドレスです。このパラメーターは実際のアドレスに設定する必要があります。ここでは、例としてhttp://oss-demo.aliyuncs.com:23450を使用します。callbackBody:コールバックリクエストボディの内容です。プレースホルダーを使用して、${bucket}(バケット名)、${object}(ファイルのフルパス) などのアップロード情報を動的に含めることができます。また、${x:xxx}を使用してカスタム変数を参照できます。OSS は、コールバック時にこれらのプレースホルダーを実際の値に置き換えます。サポートされているシステムパラメーターの詳細については、「System parameters supported by callbackBody」をご参照ください。
高度な構成の例:
{ "callbackUrl":"http://oss-demo.aliyuncs.com:23450", "callbackHost":"oss-cn-hangzhou.aliyuncs.com", "callbackBody":"bucket=${bucket}&object=${object}&my_var=${x:my_var}", "callbackBodyType":"application/x-www-form-urlencoded", "callbackSNI":false }各フィールドの詳細については、「Callback parameter」をご参照ください。
callback-varパラメーターの設定 (任意)重要callback-var パラメーターは JSON 形式である必要があります。各カスタムパラメーターのキーは「x:」で始まり、英小文字のみを含む必要があります。例:
x:uid。このパラメーターを使用して、ユーザーIDや注文番号などのカスタムビジネス情報をアプリケーションサーバーに渡します。例:
{ "x:uid": "12345", "x:order_id": "67890" }callback-varパラメーターは、callbackBodyパラメーターと併せて使用する必要があります。上記の例のカスタム変数 (uidとorder_id) は、callbackBody内で${x:xxx}プレースホルダーを使用して参照します。例:{ "callbackUrl": "http://oss-demo.aliyuncs.com:23450", "callbackBody": "uid=${x:uid}&order=${x:order_id}" }コールバックがトリガーされると、
callbackBodyTypeがapplication/x-www-form-urlencodedに設定されている場合、OSS は次の内容を送信します:uid=12345&order=67890callbackおよびcallback-varパラメーターの Base64 エンコード例:
callbackパラメーターのエンコード元の
callbackパラメーター:{ "callbackUrl": "http://oss-demo.aliyuncs.com:23450", "callbackHost": "your.callback.com", "callbackBody": "bucket=${bucket}&object=${object}&uid=${x:uid}&order=${x:order_id}", "callbackBodyType": "application/x-www-form-urlencoded", "callbackSNI": false }Base64 エンコード後の結果:
eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9例:
callback-varパラメーターのエンコード元の
callback-varパラメーター:{ "x:uid": "12345", "x:order_id": "67890" }Base64 エンコード後の結果:
eyJ4OnVpZCI6ICIxMjM0NSIsICJ4Om9yZGVyX2lkIjogIjY3ODkwIn0=
エンコードしたパラメーターのリクエストへの追加
パラメーターをエンコードした後、次のいずれかの方法で OSS に渡します。
ヘッダー (推奨)
この方法は、SDKまたはバックエンドコードからのアップロードに適しています。この方法はセキュリティが高く、推奨します。
x-oss-callbackとx-oss-callback-varの HTTP ヘッダーフィールドを設定して、コールバックパラメーターを渡すことができます。x-oss-callback:Base64 エンコードしたcallbackパラメーター。x-oss-callback-var(任意):Base64 エンコードしたcallback-varパラメーター。
注: リクエスト署名を計算する際は、リクエストを有効にするには、これら2つのパラメーターを正規ヘッダーに含める必要があります。
例: ヘッダーでコールバックパラメーターを渡す
PUT /your_object HTTP/1.1 Host: callback-test.oss-test.aliyun-inc.com Accept-Encoding: identity Content-Length: 5 x-oss-callback-var: eyJ4OnVpZCI6ICIxMjM0NSIsICJ4Om9yZGVyX2lkIjogIjY3ODkwIn0= User-Agent: aliyun-sdk-python/0.4.0 (Linux/2.6.32-220.23.2.ali1089.el5.x86_64/x86_64;2.5.4) x-oss-callback: eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9 Host: callback-test.oss-test.aliyun-inc.com Expect: 100-Continue Date: Wed, 26 Apr 2023 03:46:17 GMT Content-Type: text/plain Authorization: OSS qn6q**************:77Dv**************** TestPOST リクエストボディ
この方法は、PostObject のアップロードにのみ適用されます。コールバックパラメーターは、POST リクエストのボディ内のフォームフィールドとして渡す必要があります。
callbackパラメーター: このパラメーターを別のフォームフィールドとして渡します。値は Base64 エンコードされた JSON 設定です。--9431149156168 Content-Disposition: form-data; name="callback" eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9callback-varパラメーター (カスタム変数):各カスタム変数は、個別のフォームフィールドとして渡す必要があります。 単一のcallback-varフィールドにカプセル化することはできません。たとえば、カスタム変数が
uidとorder_idの場合:{ "x:uid": "12345", "x:order_id": "67890" }これらは2つの個別のフォームフィールドに変換する必要があります。
--9431149156168 Content-Disposition: form-data; name="x:uid" 12345 --9431149156168 Content-Disposition: form-data; name="x:order_id" 67890検証:
callbackパラメーター (オプション):policyでcallbackパラメーターの検証条件を指定できます。 この条件を省略した場合、アップロード中にパラメーターは検証されません。 例:{ "expiration": "2021-12-01T12:00:00.000Z", "conditions": [ {"bucket": "examplebucket" }, {"callback": "eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9"}, ["starts-with", "$key", "user/eric/"] ] }
URL
この方法は、通常、署名付き URL を使用してオブジェクトをアップロードする場合に使用します。自動コールバックを有効にするために、Base64 エンコードしたコールバックパラメーターを URL に追加します。ただし、この方法では URL にコールバック情報が露出し、セキュリティ上のリスクがあります。一時的なアクセス、または機密性の低いシナリオでのみ使用してください。
URL でコールバックパラメーターを渡す場合、
callbackパラメーターを含める必要があります。callback-varパラメーターは任意です。署名の計算時に、これらのパラメーターを正規クエリ文字列の一部として含める必要があります。詳細については、「Signature Version 4」をご参照ください。例:
PUT /your_object?OSSAccessKeyId=LTAI******************&Signature=vjby*************************************&Expires=1682484377&callback-var=eyJ4OnVpZCI6ICIxMjM0NSIsICJ4Om9yZGVyX2lkIjogIjY3ODkwIn0=&callback=eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9 HTTP/1.1 Host: callback-test.oss-cn-hangzhou.aliyuncs.com Date: Wed, 26 Apr 2023 03:46:17 GMT Content-Length: 5 Content-Type: text/plain
サーバーサイドでの実装
このセクションでは、サーバーサイドの処理フローについて説明します。各プログラミング言語のサンプルコードについては、「Server-side sample code」をご参照ください。
アプリケーションサーバーは、次の操作を実行できる必要があります:
OSS からの POST リクエストの受信
オブジェクトのアップロードが成功すると、OSS はアプリケーションサーバーに POST リクエストを自動的に送信します。次のサンプルコードは、リクエストの例を示しています:
POST /test HTTP/1.1 Host: your.callback.com Connection: close Authorization: GevnM3**********3j7AKluzWnubHSVWI4dY3VsIfUHYWnyw== Content-MD5: iKU/O/JB***ZMd8Ftg== Content-Type: application/x-www-form-urlencoded Date: Tue, 07 May 2024 03:06:13 GMT User-Agent: aliyun-oss-callback x-oss-bucket: your_bucket x-oss-pub-key-url: aHR0cHM6Ly9nb3NzcHVi**********vY2FsbGJeV92MS5wZW0= x-oss-request-id: 66399AA50*****3334673EC2 x-oss-requester: 23313******948342006 x-oss-signature-version: 1.0 x-oss-tag: CALLBACK bucket=your_bucket&object=your_object&uid=12345&order_id=67890セキュリティのためのリクエスト署名の検証 (任意)
コールバックリクエストが OSS から送信されたことを確認するために、アプリケーションサーバーでリクエスト署名を検証します。手順の詳細については、「Recommended configurations」をご参照ください。
説明署名検証は任意です。セキュリティ要件に応じて有効にできます。
コールバックレスポンスの返信
アプリケーションサーバーがコールバックリクエストを受信した後、OSS にレスポンスを返す必要があります。レスポンスは次の要件を満たす必要があります:
成功を示すために、アプリケーションサーバーは
HTTP/1.1 200 OKを返す必要があります。レスポンスヘッダーに
Content-Lengthを含める必要があります。レスポンスボディは JSON 形式または XML 形式をサポートしています。ここでは JSON を例に説明します。XML 形式を使用する場合は、レスポンスヘッダーに
Content-Type: application/xmlを追加してください。
たとえば、アプリケーションサーバーは
{"Status": "OK"}を返します。注: この例の Python バージョンは 2.7.6 です。開発には Python 3 の使用を推奨します。
HTTP/1.0 200 OK Server: BaseHTTP/0.3 Python/2.7.6 Date: Mon, 14 Sep 2015 12:37:27 GMT Content-Type: application/json Content-Length: 9 {"Status": "OK"}その後、OSS はこのレスポンスをクライアントに転送します。例:
HTTP/1.1 200 OK Date: Mon, 14 Sep 2015 12:37:27 GMT Content-Type: application/json Content-Length: 9 Connection: keep-alive ETag: "D8E8FCA2DC0F896FD7CB4CB0031BA249" Server: AliyunOSS x-oss-bucket-version: 1442231779 x-oss-request-id: 55F6BF87207FB30F2640C548 {"Status": "OK"}重要CompleteMultipartUploadリクエストの場合、アップロードコールバックを有効にすると、元のレスポンスボディに内容 (JSON 形式の情報など) が含まれている場合でも、その内容はコールバックのレスポンスによって上書きされます。たとえば、この場合は{"Status": "OK"}によって上書きされます。
推奨構成
リクエスト署名の検証
コールバックパラメーターを設定すると、OSS は指定された callbackUrl に基づいて、アプリケーションサーバーに POST コールバックリクエストを送信します。リクエストが OSS から送信されたことを確認するために、コールバックリクエストの署名を検証できます。次の手順では、検証プロセスについて説明します。
OSS による署名の生成方法
OSS は、MD5 ハッシュを使用した RSA の非対称暗号化アルゴリズムにより、リクエスト内容の署名を生成します。署名はその後、リクエストヘッダーの
Authorizationフィールドに含められます。署名は、次の式で計算されます:
authorization = base64_encode(rsa_sign(private_key, url_decode(path) + query_string + '\n' + body, md5))説明この式では、
private_keyは秘密鍵、pathはコールバックリクエストのリソースパス、query_stringはクエリ文字列、bodyはコールバックのメッセージボディです。署名を生成する手順:
署名対象の文字列を構築します。リソースパスを URL デコードし、元のクエリ文字列、改行文字 (
\n)、コールバックのメッセージボディを追加します。RSA 署名を生成します。秘密鍵を使用して署名対象の文字列に署名します。署名に使用するハッシュ関数は MD5 です。
結果を Base64 エンコードして最終的な署名を取得し、コールバックリクエストの
Authorizationヘッダーに含めます。
署名生成の例:
POST /index.php?id=1&index=2 HTTP/1.0 Host: 172.16.XX.XX Connection: close Content-Length: 18 Authorization: kKQeGTRccDKyHB3H9vF+xYMSrmhMZj****/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2t**** Content-Type: application/x-www-form-urlencoded User-Agent: http-client/0.0.1 x-oss-pub-key-url: aHR0cDovL2dvc3NwdWJsaWMuYWxpY2RuLmNvbS9jYWxsYmFja19wdWJfa2V5X3YxLnsr**** bucket=examplebucketpath は
/index.php、query_string は?id=1&index=2、body はbucket=examplebucketであり、生成される署名はkKQeGTRccDKyHB3H9vF+xYMSrmhMZjzzl2/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2t****です。
コールバックサーバーによる署名の検証
アプリケーションサーバーは、OSS からのリクエストの署名を検証して真正性を確認する必要があります。検証プロセスは次のとおりです:
公開鍵を取得します:
リクエストヘッダーの
x-oss-pub-key-urlフィールドから Base64 エンコードされた公開キー URL を取得し、デコードします。public_key = urlopen(base64_decode(value of the x-oss-pub-key-url header))デコード前の値の例:
aHR0cDovL2dvc3NwdWJsaWMuYWxpY2RuLmNvbS9jYWxsYmFja19wdWJfa2V5X3YxLnBlbQ==デコード後:
http://gosspublic.alicdn.com/callback_pub_key_v1.pem説明公開キー URL は
http://gosspublic.alicdn.com/またはhttps://gosspublic.alicdn.com/で始まる必要があります。公開キー URL のコンテンツは変更されないため、ネットワークの変動によるサービス中断を回避するために、公開鍵をキャッシュすることを推奨します。署名をデコードします。
リクエストヘッダーの
Authorizationフィールドから署名を取得し、Base64 デコードします。signature = base64_decode(value of the Authorization header)検証対象の文字列を構築します。
次の形式で、リソースパス、クエリ文字列、改行文字 (
\n)、コールバックのメッセージボディを連結します:sign_str = url_decode(path) + query_string + ‘\n’ + body署名を検証します。
MD5 ハッシュと RSA 公開鍵を使用して検証します。
result = rsa_verify(public_key, md5(sign_str), signature)
署名の検証の例
次の Python 3 のコードは、アプリケーションサーバーで署名を検証する例です。この例では M2Crypto ライブラリが必要です。
import http.client import base64 import hashlib import urllib.request import urllib.parse import socket from http.server import BaseHTTPRequestHandler, HTTPServer from M2Crypto import RSA from M2Crypto import BIO def get_local_ip(): try: csock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) csock.connect(('8.8.8.8', 80)) (addr, port) = csock.getsockname() csock.close() return addr except socket.error: return "" class MyHTTPRequestHandler(BaseHTTPRequestHandler): ''' def log_message(self, format, *args): return ''' def do_POST(self): # 公開鍵を取得します。 pub_key_url = '' try: pub_key_url_base64 = self.headers['x-oss-pub-key-url'] pub_key_url = base64.b64decode(pub_key_url_base64).decode() if not pub_key_url.startswith("http://gosspublic.alicdn.com/") and not pub_key_url.startswith("https://gosspublic.alicdn.com/"): self.send_response(400) self.end_headers() return url_reader = urllib.request.urlopen(pub_key_url) # 公開キーはキャッシュ可能です。パフォーマンス向上のため、公開キー URL に基づいて公開鍵コンテンツをキャッシュすることを推奨します。 pub_key = url_reader.read() except Exception as e: print('pub_key_url : ' + pub_key_url) print('Get pub key failed! Error:', str(e)) self.send_response(400) self.end_headers() return # 署名を取得します。 authorization_base64 = self.headers['authorization'] authorization = base64.b64decode(authorization_base64) # コールバックボディを取得します。 content_length = self.headers['content-length'] callback_body = self.rfile.read(int(content_length)) # 署名検証用の文字列を構築します。 auth_str = '' pos = self.path.find('?') if -1 == pos: auth_str = urllib.parse.unquote(self.path) + '\n' + callback_body.decode() else: auth_str = urllib.parse.unquote(self.path[0:pos]) + self.path[pos:] + '\n' + callback_body.decode() print(auth_str) # 署名を検証します。 bio = BIO.MemoryBuffer(pub_key) rsa_pub = RSA.load_pub_key_bio(bio) try: result = rsa_pub.verify(auth_str.encode(), authorization, 'md5') except: result = False if not result: print('Authorization verify failed!') print('Public key : %s' % (pub_key)) print('Auth string : %s' % (auth_str)) self.send_response(400) self.end_headers() return # callback_body に基づいて後続の操作を実行します。 # OSS に応答を送信します。 resp_body = '{"Status":"OK"}' self.send_response(200) self.send_header('Content-Type', 'application/json') self.send_header('Content-Length', str(len(resp_body))) self.end_headers() self.wfile.write(resp_body.encode()) class MyHTTPServer(HTTPServer): def __init__(self, host, port): super().__init__((host, port), MyHTTPRequestHandler) if __name__ == '__main__': server_ip = get_local_ip() server_port = 23451 server = MyHTTPServer(server_ip, server_port) server.serve_forever()次の表に、他の言語のサーバーサイドサンプルコードを示します。
言語
説明
Java
ダウンロード URL:Java
実行方法:パッケージを解凍し、
java -jar oss-callback-server-demo.jar 9000を実行します (9000 はポート番号で、変更できます)。
Python
ダウンロード URL:Python
パッケージを解凍し、
python callback_app_server.pyを実行します。このプログラムの実行には M2Crypto ライブラリが必要です。
PHP
ダウンロード URL:PHP
実行方法:Apache 環境にスクリプトをデプロイします。PHP でのヘッダー取得は環境に依存するため、例の変更が必要になる場合があります。
.NET
ダウンロード URL:.NET
アプリケーションを実行するには、パッケージを解凍し、
README.mdファイルを確認してください。
Node.js
ダウンロード URL:Node.js
例を実行するには、パッケージを解凍し、
node example.jsを実行します。
Ruby
ダウンロード URL:Ruby
実行方法:
ruby aliyun_oss_callback_server.rb
コールバックパラメーター
次の表では、OSS へのオブジェクトのアップロードが成功した後に送信されるコールバックリクエストの内容と動作を設定するためのcallback パラメーターのフィールドについて説明します。
パラメーター | 必須 | 説明 |
callbackUrl | はい | オブジェクトがアップロードされた後、OSS が POST コールバックリクエストを送信する URL です。
|
callbackBody | はい | コールバックリクエストボディの内容です。形式は、
|
callbackHost | いいえ | コールバックリクエストの Host ヘッダーの値です。値はドメイン名または IP アドレスにすることができます。
|
callbackSNI | いいえ | コールバックリクエストにサーバー名表示 (SNI) を含めるかどうかを指定します。HTTPS リクエストでは、SNI を使用することで、サーバーはリクエストされたホスト名に対して正しい証明書を提示できます。
|
callbackBodyType | いいえ | コールバックリクエストの 次のタイプがサポートされています。
|
callbackBody でサポートされているシステムパラメーター
callback パラメーターの callbackBody フィールドは、複数のシステムパラメーターを参照して、アップロードされたオブジェクトに関する情報をコールバックリクエストで渡すことができます。次の表では、サポートされているシステムパラメーターについて説明します。
パラメーター | 説明 |
bucket | バケットの名前です。 |
object | オブジェクトのフルパスです。 |
etag | オブジェクトの etag です。クライアントに返される etag 値と同じです。 |
size | オブジェクトのサイズです。CompleteMultipartUpload API を呼び出した場合、 |
mimeType | リソースタイプです。たとえば、JPEG 画像のリソースタイプは |
imageInfo.height | 画像の高さです。この変数は画像ファイルでのみ利用できます。 |
imageInfo.width | 画像の幅です。この変数は画像ファイルでのみ利用できます。 |
imageInfo.format | 画像の形式 (JPG、PNG など) です。この変数は画像ファイルでのみ利用できます。 |
crc64 | オブジェクトのアップロード後に返される |
contentMd5 | オブジェクトのアップロード後に返される 重要 この変数は、PutObject または PostObject API を使用してアップロードされたオブジェクトでのみ利用できます。 |
vpcId | リクエストを送信するクライアントの VPC ID です。リクエストが VPC から送信されていない場合、この変数は空になります。 |
clientIp | リクエストを送信するクライアントの IP アドレスです。 |
reqId | リクエスト ID です。 |
operation | リクエストされた API の名前 (PutObject、PostObject など) です。 |
SDK
次の表に、クライアント側の実装デモへのリンクを示します。
簡易アップロード (PutObject 操作を使用して) | マルチパートアップロード (CompleteMultipartUpload オペレーションを使用して) | 署名付き URL によるアップロード (PutObject 操作を使用して) | |
Java | |||
Python V2 | - | ||
Go V2 |
トラブルシューティング
コールバックプロセス中にエラーが発生した場合、OSS から返されるエラーコードを使用して問題をトラブルシューティングできます。各エラーコードは特定の原因に対応しています。コールバック関連のエラーコードについては、07-CALLBACK を参照してください。
よくある質問
アップロード失敗時のコールバック
いいえ。OSS は、オブジェクトが正常にアップロードされた後にのみコールバックをトリガーします。アップロードが失敗した場合、コールバックは送信されず、エラーメッセージがクライアントに直接返されます。
「Response body is not valid json format」 エラー
アプリケーションサーバーでの処理中に例外が発生すると、次のコードに示すように、無効な JSON フォーマットのレスポンスボディが送信されます。
# OSS にレスポンスを送信します。 resp_body = '{"Status":"OK"}' self.send_response(200) self.send_header('Content-Type', 'application/json') self.send_header('Content-Length', str(len(resp_body))) self.end_headers() self.wfile.write(resp_body)解決策:
次のコマンドを実行して内容を検証します。
curl -d "<Content>" <CallbackServerURL> -vパケットをキャプチャして内容を検査します。
Windows では、Wireshark を使用してパケットをキャプチャすることを推奨します。Linux では、tcpdump コマンドを使用してパケットをキャプチャします。
アプリケーションサーバーが OSS に返すレスポンスボディに BOM ヘッダーが含まれています。
このエラーは PHP ベースのアプリケーションサーバーでよく見られます。PHP SDK は BOM ヘッダーを返します。これにより、OSS が受信するレスポンス本文の先頭に 3 バイトが余分に追加され、本文が JSON オブジェクトとして無効になります。次のパケットキャプチャでは、バイト
ef bb bfが BOM ヘッダーを表します。Frame 6: 448 bytes on wire (3584 bits), 448 bytes captured (3584 bits) Ethernet II, Src: Inventec_5e:4f:5c (00:8c:fa:5e:4f:5c), Dst: Inventec_5e:4b:64 (00:8c:fa:5e:4b:64) Internet Protocol Version 4, Src: 10.101.166.30, Dst: 10.101.166.53 Transmission Control Protocol, Src Port: 8083 (8083), Dst Port: 49607 (49607), Seq: 1, Ack: 518, Len: 382 Hypertext Transfer Protocol Line-based text data: text/html \357\273\277{"Status":"OK"} 0090 64 20 48 61 74 29 0d 0a 53 65 72 2d 43 6f 6b d Hat).. Set-Cook 00a0 69 65 3a 20 50 48 50 53 45 53 53 49 44 3d 66 61 ie: PHPS ESSID=fa 00b0 74 37 33 6e 74 6c 70 68 30 6e 63 67 38 68 33 30 t73ntlph 0ncg8h30 00c0 65 6e 75 35 31 34 67 31 3b 20 48 74 74 70 4f 6e enu514g1 ; HttpOn 00d0 6c 79 0d 0a 45 78 70 69 72 65 73 3a 20 54 68 75 ly..Expi res: Thu 00e0 2c 20 31 39 20 4e 6f 76 20 31 39 38 31 20 30 38 , 19 Nov 1981 08 00f0 3a 35 32 3a 30 30 20 47 4d 54 0d 0a 43 61 63 68 :52:00 G MT..Cach 0100 65 2d 43 6f 6e 74 72 6f 6c 3a 20 6e 6f 2d 73 74 e-Contro l: no-st 0110 f2 65 2c 20 6e 6f 2d 63 61 63 68 65 2c 20 6d ore, no- cache, m 0120 75 73 74 2d 72 65 76 61 6c 69 64 61 74 65 2c 20 ust-reva lidate, 0130 70 6f 73 74 2d 63 68 65 63 6b 3d 30 2c 20 70 72 post-che ck=0, pr 0140 65 2d 63 68 65 63 6b 3d 30 0d 0a 50 72 61 67 6d e-check= 0..Pragm 0150 61 3a 20 6e 6f 2d 63 61 63 68 65 0d 0a 43 6f 6e a: no-ca che..Con 0160 74 65 6e 74 2d 4c 65 6e 67 74 68 3a 20 31 38 0d tent-Len gth: 18. 0170 0a 43 6f 6e 6e 65 63 74 69 6f 6e 3a 20 63 6c 6f .Connect ion: clo 0180 73 65 0d 0a 43 6f 6e 74 65 6e 74 2d 54 79 70 65 se..Cont ent-Type 0190 3a 20 74 65 78 74 2f 68 74 6d 6c 3b 20 63 68 61 : text/h tml; cha 01a0 72 73 65 74 3d 55 54 46 2d 38 0d 0a 0d 0a ef bb rset=UTF -8..... 01b0 bf 7b 22 53 74 61 74 75 73 22 3a 22 4f 4b 22 7d .{"Statu s":"OK"}解決策:アプリケーションサーバーが OSS に返すレスポンスボディから BOM ヘッダーを削除します。