オブジェクトが Object Storage Service (OSS) にアップロードされた後、OSS はアプリケーションサーバーにコールバックリクエストを自動的に送信し、後続の操作を実行するように通知できます。
使用上の注意
リージョンに関する制限
コールバックは、次のリージョンでサポートされています。中国 (杭州)、中国 (上海)、中国 (青島)、中国 (北京)、中国 (張家口)、中国 (フフホト)、中国 (ウランチャブ)、中国 (深セン)、中国 (河源)、中国 (広州)、中国 (成都)、中国 (香港)、米国 (シリコンバレー)、米国 (バージニア)、日本 (東京)、シンガポール、マレーシア (クアラルンプール)、インドネシア (ジャカルタ)、フィリピン (マニラ)、ドイツ (フランクフルト)、英国 (ロンドン)、UAE (ドバイ)。
コールバックロジック
OSS がリクエストを送信してから 5 秒以内にコールバックリクエストが応答を受信しない場合、OSS はリクエストがタイムアウトしたと判断します。
アップロードされたオブジェクトは、アップロードコールバックリクエストが成功したか失敗したかに関係なく、OSS に保存されます。
コールバックリクエストが失敗した場合、コールバックリクエストは再試行されません。
サポートされている操作
PutObject、PostObject、CompleteMultipartUpload 操作のみがコールバックをサポートしています。
コールバックプロセス
手順:
クライアントは、コールバックパラメータを指定してオブジェクトをアップロードします
クライアントがオブジェクトをアップロードするときは、アプリケーションサーバーの URL とコールバックコンテンツを含む callback パラメータを指定します。クライアントは、callback-var パラメータを使用してカスタムパラメータを構成できます。
OSS はオブジェクトを保存し、コールバックリクエストを送信します
オブジェクトがアップロードされると、OSS はアプリケーションサーバーの URL に POST リクエストを送信します。リクエストには、バケット名、オブジェクト名、オブジェクトサイズ、オブジェクト ETag、カスタムパラメータなどのオブジェクト情報が含まれています。
アプリケーションサーバーはコールバックリクエストを処理し、応答を返します
アプリケーションサーバーは、コールバックリクエストを受信すると、リクエスト署名 (オプション) を検証してセキュリティを確保し、5 秒以内にコールバックリクエストを処理し、JSON 形式で応答を返します。 HTTP ステータスコード 200 は、呼び出しが成功したことを示します。その他の HTTP ステータスコードは、呼び出しが失敗したことを示します。
OSS はアップロードとコールバックの結果を返します
OSS はコールバック応答を受信すると、アップロードとコールバックの結果をクライアントに返します。
アップロードコールバックを構成する手順
アップロードコールバックのデバッグは、クライアントからオブジェクトをアップロードすることと、アプリケーションサーバーでコールバックリクエストを処理することの 2 つの部分で構成されます。オブジェクトのアップロードをデバッグしてから、コールバックリクエストの処理をデバッグすることをお勧めします。両方の部分がデバッグされたら、ジョイントデバッグを完了します。
オブジェクトのアップロードをデバッグする
次のセクションでは、ロジックを構築および処理し、コールバックパラメータをアップロードする方法について説明します。アップロードコールバック機能を迅速に実装するには、OSS SDK に提供されているサンプルコードを参照することをお勧めします。
オブジェクトがアップロードされた後に OSS が自動的にコールバックをトリガーするようにするには、アップロードリクエストで次のパラメータを指定する必要があります。callback と callback-var (オプション)。
callback パラメータを構築します。
callback パラメータは、アプリケーションサーバーの URL とリクエストコンテンツ形式を指定するために使用されます。JSON 形式で構築し、Base64 でエンコードする必要があります。
簡単な構成例:
{ "callbackUrl":"http://oss-demo.aliyuncs.com:23450", "callbackBody":"bucket=${bucket}&object=${object}&my_var=${x:my_var}" }
callbackUrl: アプリケーションサーバーの URL。この例では、
http://oss-demo.aliyuncs.com:23450
が使用されています。callbackBody: コールバックリクエスト本文。 callbackBody フィールドは、${bucket} や ${object} などのシステム変数とカスタム変数をサポートしています。システム変数の詳細については、「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 パラメータでサポートされているフィールド」をご参照ください。
(オプション) callback-var パラメータを構築します
このパラメータは、ユーザー ID や注文番号などのカスタムサービス情報をアプリケーションサーバーに渡すために使用されます。JSON 形式である必要があります。各カスタムパラメータのキーは x: で始まり、小文字を含める必要があります。例:
{ "x:uid": "12345", "x:order_id": "67890" }
callback-var パラメータは、callbackBody パラメータと一緒に使用する必要があります。上記の例のユーザー ID (uid) と注文番号 (order_id) パラメータは、callbackBody のプレースホルダー ${x:xxx} によって参照される必要があります。例:
{ "callbackUrl": "http://oss-demo.aliyuncs.com:23450", "callbackBody": "uid=${x:uid}&order=${x:order_id}" }
実際のコールバックリクエストプロセス中に、OSS は次のコンテンツを送信します。この例では、callbackBodyType フィールドは application/x-www-form-urlencoded に設定されています。
uid=12345&order=67890
callback パラメータと callback-var パラメータを構築した後、Base64 でエンコードする必要があります。
例: callback パラメータを Base64 エンコードする
Base64 エンコードされていない 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 エンコードされた callback パラメータ:
eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9
例: callback-var パラメータを Base64 エンコードする
Base64 エンコードされていない callback-var パラメータ:
{ "x:uid": "12345", "x:order_id": "67890" }
Base64 エンコードされた callback-var パラメータ:
eyJ4OnVpZCI6ICIxMjM0NSIsICJ4Om9yZGVyX2lkIjogIjY3ODkwIn0=
Base64 エンコードされたパラメータをリクエストに追加します。
次のいずれかの方法を使用して、Base64 エンコードされたパラメータをリクエストに追加できます。
(推奨) パラメータをヘッダーとしてリクエストに追加する
この方法は、高いセキュリティを提供する OSS SDK またはバックエンドコードを使用して OSS にオブジェクトをアップロードする場合に適しています。 x-oss-callback ヘッダーを Base64 エンコードされた callback パラメータに設定し、x-oss-callback-var を Base64 エンコードされた callback-var パラメータに設定できます。この x-oss-callback-var ヘッダーはオプションです。
注: x-oss-callback-var ヘッダーと x-oss-callback ヘッダーは、署名を計算するために正規ヘッダーに含まれています。
例
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**************** Test
POST リクエストの本文にあるフォームフィールドにパラメータを追加する
この方法は、PostObject 操作に対してのみサポートされています。 callback パラメータと callback-var パラメータは、POST リクエストの本文にあるフォームフィールドを使用してのみ渡すことができます。
callback パラメータ: パラメータは、JSON 形式の個別のフォームアイテムとして渡す必要があります。
--9431149156168 Content-Disposition: form-data; name="callback" eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9
callback-var パラメータ: カスタムフィールドは、個別のフォームアイテムとして渡す必要があり、callback-var フィールド全体としてカプセル化することはできません。このフォームフィールドはオプションです。
uid パラメータと order_id パラメータのサンプル:
{ "x:uid": "12345", "x:order_id": "67890" }
uid パラメータと order_id パラメータをフォームの個別のフィールドに変換します。
--9431149156168 Content-Disposition: form-data; name="x:uid" 12345 --9431149156168 Content-Disposition: form-data; name="x:order_id" 67890
(オプション) callback パラメータを検証する: ポリシーで callback パラメータの検証条件を指定できます。条件を空のままにすると、OSS にオブジェクトをアップロードするときに callback パラメータは検証されません。例:
{ "expiration": "2021-12-01T12:00:00.000Z", "conditions": [ {"bucket": "examplebucket" }, {"callback": "eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9"}, ["starts-with", "$key", "user/eric/"], ] }
URL にパラメータを追加する
この方法は、署名付き URL を使用してオブジェクトをアップロードする場合によく使用されます。 Base64 エンコードされた callback パラメータと callback-var パラメータをエンコードし、URL で連結してコールバックを自動化できます。ただし、コールバック情報は URL で公開されるため、セキュリティリスクが高まります。一時的なアクセスまたは機密性の低いシナリオでのみ使用することをお勧めします。
callback
パラメータは必須で、callback-var
パラメータはオプションです。署名の計算中に、これらのパラメータを正規クエリ文字列の一部として使用する必要があります。詳細については、「(推奨) V4 署名を URL に含める」をご参照ください。例:
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
アプリケーションサーバーでコールバックリクエストを処理する
このセクションでは、アプリケーションサーバーがコールバックリクエストを処理する方法を示します。さまざまなプログラミング言語のサンプルコードの詳細については、「さまざまなプログラミング言語のサンプルコード」をご参照ください。
アプリケーションサーバーには、次の機能が必要です。
OSS からの POST リクエストを受信する
オブジェクトがアップロードされると、OSS は callbackUrl パラメータに基づいてアプリケーションサーバーに 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 によって送信されたことを確認するには、アプリケーションサーバーでリクエスト署名を検証することをお勧めします。詳細については、「推奨構成」をご参照ください。
説明署名の検証は必須ではありません。ビジネス要件に基づいて有効にすることができます。
コールバックリクエストの応答を返す
アプリケーションサーバーは、コールバックリクエストを受信すると、OSS に応答を返す必要があります。応答は次の要件を満たしている必要があります。
通常、アプリケーションサーバーは HTTP/1.1 200 OK を返します。
アプリケーションサーバーが OSS に返す応答には、Content-Length ヘッダーが含まれている必要があります。ヘッダーのサイズは 3 MB を超えることはできません。
レスポンス本文は JSON 形式である必要があり、サイズは 1 MB を超えることはできません。
この例では、アプリケーションサーバーは {"Status": "OK"} を返しました。
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"}
によって上書きされます。
推奨構成
コールバックリクエストの署名を検証してデータセキュリティを確保する
コールバックパラメータを構成した後、callbackUrl パラメータに基づいてオブジェクトを OSS にアップロードすると、OSS はアプリケーションサーバーにコールバックリクエストを送信します。 リクエストが OSS によって送信されたことを確認するために、コールバックリクエストの署名を検証できます。 検証手順:
OSS がクライアントで署名を生成する
OSS は RSA 非対称暗号化アルゴリズムと MD5 ハッシュを使用してリクエストの署名を生成し、その署名を権限付与リクエストヘッダーに追加します。
署名計算のサンプルコード:
authorization = base64_encode(rsa_sign(private_key, url_decode(path) + query_string + '\n' + body, md5))
説明上記のコードでは、private_key は秘密鍵を指定し、path はコールバックリクエストに含まれるリソースパスを指定し、query_string はクエリ文字列を指定し、body はコールバックリクエストのメッセージ本文を指定します。
署名を生成する手順:
署名する文字列を作成します。 文字列は、URL をデコードして取得したリソースパス、元のクエリ文字列、キャリッジリターン、およびコールバックメッセージ本文で構成されます。
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=examplebucket
上記のコードでは、最終的な署名は
kKQeGTRccDKyHB3H9vF+xYMSrmhMZjzzl2/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2t****
です。 署名は、/index.php
パス、?id=1&index=2
クエリ文字列、およびbucket=examplebucket
本文から生成されます。
アプリケーションサーバーが署名を検証する
アプリケーションサーバーは、リクエストの署名を検証して、リクエスト元の有効性を確認する必要があります。 手順:
公開鍵を取得する:
x-oss-pub-key-url リクエストヘッダーから Base64 エンコードされた公開鍵 URL を取得し、デコードします。
public_key = urlopen(base64_decode(x-oss-pub-key-url header value))
Base64 エンコードされた公開鍵 URL:
aHR0cDovL2dvc3NwdWJsaWMuYWxpY2RuLmNvbS9jYWxsYmFja19wdWJfa2V5X3YxLnBlbQ==
デコードされた公開鍵 URL:
http://gosspublic.alicdn.com/callback_pub_key_v1.pem
説明公開鍵 URL は、
http://gosspublic.alicdn.com/
またはhttps://gosspublic.alicdn.com/
で始まる必要があります。 公開鍵 URL の内容は変更されません。 ネットワークの変動によるサービスへの影響を防ぐために、公開鍵をキャッシュすることをお勧めします。署名をデコードする。
authorization リクエストヘッダーから署名を取得し、Base64 デコードを実行します:
signature = base64_decode(authorization header value)
検証する文字列を作成する。
リソースパス、クエリ文字列、改行、およびコールバックメッセージ本文を次の形式で連結します:
sign_str = url_decode(path) + query_string + '\n' + body
署名を検証する。
MD5 ハッシュと RSA 公開鍵を使用して署名を検証します:
result = rsa_verify(public_key, md5(sign_str), signature)
署名検証の例
次のコードは、アプリケーションサーバーが署名を検証する方法の例を示しています。 OSS SDK for Python のコードを実行する前に、M2Crypto ライブラリをインストールしてください。
import httplib import base64 import md5 import urllib2 from BaseHTTPServer 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 = pub_key_url_base64.decode('base64') 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 = urllib2.urlopen(pub_key_url) # キャッシュできます。公開鍵アドレスに基づいて公開鍵コンテンツをキャッシュすることをお勧めします // 翻訳済み pub_key = url_reader.read() except: print 'pub_key_url : ' + pub_key_url print '公開鍵の取得に失敗しました!' // 翻訳済み self.send_response(400) self.end_headers() return # 認証を取得する // 翻訳済み authorization_base64 = self.headers['authorization'] authorization = authorization_base64.decode('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 = urllib2.unquote(self.path) + '\n' + callback_body else: auth_str = urllib2.unquote(self.path[0:pos]) + self.path[pos:] + '\n' + callback_body print auth_str # 認証を検証する // 翻訳済み auth_md5 = md5.new(auth_str).digest() bio = BIO.MemoryBuffer(pub_key) rsa_pub = RSA.load_pub_key_bio(bio) try: result = rsa_pub.verify(auth_md5, authorization, 'md5') except: result = False if not result: print '認証の検証に失敗しました!' // 翻訳済み print '公開鍵 : %s' % (pub_key) // 翻訳済み print '認証文字列 : %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) class MyHTTPServer(HTTPServer): def __init__(self, host, port): HTTPServer.__init__(self, (host, port), MyHTTPRequestHandler) if '__main__' == __name__: server_ip = get_local_ip() server_port = 23451 server = MyHTTPServer(server_ip, server_port) server.serve_forever()
次の表は、他のプログラミング言語でサーバー上の署名を検証するために使用できるコードを示しています。
SDK プログラミング言語
説明
Java
ダウンロードリンク: OSS SDK for Java
実行方法: パッケージを解凍し、
java -jar oss-callback-server-demo.jar 9000
を実行します。 9000 は別のポート番号に置き換えることができます。
Python
ダウンロードリンク: OSS SDK for Python
実行方法: パッケージを解凍し、
python callback_app_server.py
を実行します。 コードを実行するには、RSA 依存関係が必要です。
PHP
ダウンロードリンク: OSS SDK for PHP
実行方法: コードを Apache 環境にデプロイして、コード内の特定のヘッダーが環境を依存関係として使用できるようにします。 環境に基づいてサンプルコードを変更できます。
.NET
ダウンロードリンク: OSS SDK for .NET
実行方法: パッケージを解凍し、
README.md
の手順に従います。
Node.js
ダウンロードリンク: OSS SDK for Node.js
実行方法: パッケージを解凍し、
node example.js
を実行します。
Ruby
ダウンロードリンク: OSS SDK for Ruby
実行方法: ruby aliyun_oss_callback_server.rb を実行します。
コールバックパラメータでサポートされているフィールド
次の表に、コールバックパラメータでサポートされているフィールドを示します。これらのフィールドは、オブジェクトが OSS にアップロードされた後のコールバックリクエストコンテンツと動作を設定するために使用されます。
フィールド | 必須 | 説明 |
callbackUrl | はい | OSS がコールバックリクエストを送信するアプリケーションサーバの URL です。
|
callbackBody | はい | コールバックリクエストの本文。リクエスト本文の形式は、callbackType フィールドと一致している必要があります。
callbackBody フィールドは、OSS システムパラメータ、カスタムパラメータ、および定数をサポートしています。システム変数の詳細については、「callbackBody でサポートされているシステム変数」をご参照ください。 |
callbackHost | いいえ | コールバックリクエストの Host ヘッダーの値。値はドメイン名または IP アドレスである必要があります。
|
callbackSNI | いいえ | コールバックリクエストでサーバ名表示(SNI)を指定するかどうかを指定します。 callbackUrl パラメータで HTTPS を使用する場合は、このパラメータを有効にすることをお勧めします。そうしないと、証明書が一致しないためにコールバックが失敗する可能性があります。たとえば、「502 callback failed」が返されます。有効な値:
|
callbackBodyType | いいえ | コールバックリクエストの Content-Type の値。これは、 有効な値:
|
callbackBody でサポートされているシステム変数
callback パラメータの callbackBody フィールドでは、複数のシステムパラメータを使用して、コールバックリクエストでアップロードされたオブジェクトに関する情報を渡すことができます。次の表に、サポートされているシステムパラメータを示します。
システムパラメータ | 説明 |
bucket | バケットの名前。 |
object | オブジェクトの完全なパス。 |
etag | オブジェクトの ETag フィールド。ETag はリクエスタに返されます。 |
size | オブジェクトのサイズ。サイズは、CompleteMultipartUpload 操作を呼び出したときのオブジェクト全体のサイズです。 |
mimeType | リソースタイプ。たとえば、JPEG 画像のリソースタイプは image/jpeg です。 |
imageInfo.height | 画像の高さ。このパラメータは画像オブジェクトにのみ適用されます。他のオブジェクトの場合、このパラメータは空のままです。 |
imageInfo.width | 画像の幅。このパラメータは画像オブジェクトにのみ適用されます。他のオブジェクトの場合、このパラメータは空のままです。 |
imageInfo.format | 画像の形式。例:JPG、PNG。このパラメータは画像オブジェクトにのみ適用されます。他のオブジェクトの場合、このパラメータは空のままです。 |
crc64 | CRC64 値。このパラメータの値は、オブジェクトのアップロード後に返される x-oss-hash-crc64ecma ヘッダーの値と同じです。 |
contentMd5 | MD5 値。このパラメータの値は、オブジェクトのアップロード後に返される Content-MD5 ヘッダーの値と同じです。 重要 このパラメータは、PutObject または PostObject 操作を呼び出してオブジェクトをアップロードする場合にのみ必要です。 |
vpcId | リクエストを開始したクライアントが存在する仮想プライベートクラウド(VPC)の ID。リクエストが VPC 経由で開始されない場合、このパラメータは空のままです。 |
clientIp | リクエストを開始したクライアントの IP アドレス。 |
reqId | 開始されたリクエストの ID。 |
operation | リクエストの開始に使用される API 操作(PutObject、PostObject など)。 |
SDK
次の表は、コールバックの設定に使用できる OSS SDK について説明しています。
シンプルアップロード | マルチパートアップロード | 署名付き URL ベースのアップロード | |
Java | |||
Python V2 | - | ||
Go V2 |
トラブルシューティング
コールバック プロセス中にエラーが発生した場合、エラーコードを含むエラーメッセージが OSS によって返されます。トラブルシューティングには、エラーコードを使用できます。各エラーコードは特定のエラー原因に対応しています。 コールバックに関連するエラーコードについては、「07-CALLBACK」をご参照ください。
よくある質問
オブジェクトのアップロードに失敗した場合、OSS はアプリケーションサーバにコールバックリクエストを送信しますか?
いいえ。OSS は、オブジェクトがアップロードされた場合にのみ、アプリケーションサーバにコールバックリクエストを送信します。オブジェクトのアップロードに失敗した場合、OSS はアプリケーションサーバにコールバックリクエストを送信せず、エラーメッセージを返します。
「Response body is not valid json format(応答本文が有効な JSON 形式ではありません)」というエラーメッセージが返された場合はどうすればよいですか?
このエラーメッセージは、リクエストの処理中にアプリケーションサーバが例外をスローしたために返されます。この場合、OSS に返される応答本文は JSON 形式ではありません。次の図は、このエラーが発生したときに OSS に返される応答を示しています。
解決策:
次のコマンドを実行してコンテンツを確認します。
curl -d "<Content>" <CallbackServerURL> -v
パケットをキャプチャしてコンテンツを確認します。
Windows では Wireshark ツールを使用するか、Linux では tcpdump コマンドを実行することをお勧めします。
アプリケーションサーバから OSS に返される応答の本文に BOM ヘッダーが含まれています。
このエラーは、OSS SDK for PHP を使用して記述されたアプリケーションサーバでよく発生します。OSS SDK for PHP は BOM ヘッダーを返します。その結果、OSS は応答本文で JSON 形式ではない 3 バイトの追加バイトを受信します。次の図は、ef、bb、bf バイトが応答本文に追加されたバイトであることを示しています。
解決策: アプリケーションサーバから OSS に返される応答本文から BOM ヘッダーを削除します。