すべてのプロダクト
Search
ドキュメントセンター

Object Storage Service:コールバック

最終更新日:Jun 27, 2026

OSS のアップロードコールバックは、オブジェクトが正常にアップロードされた後、アプリケーションサーバーに自動的に通知を送信し、後続の処理を行えるようにします。

制限事項

  • 利用可能なリージョン

    コールバック機能は、次のリージョンで利用できます:中国 (杭州)、中国 (上海)、中国 (青島)、中国 (北京)、中国 (張家口)、中国 (フフホト)、中国 (ウランチャブ)、中国 (深セン)、中国 (河源)、中国 (広州)、中国 (成都)、中国 (香港)、米国 (シリコンバレー)、米国 (バージニア)、日本 (東京)、シンガポール、マレーシア (クアラルンプール)、インドネシア (ジャカルタ)、フィリピン (マニラ)、ドイツ (フランクフルト)、英国 (ロンドン)、UAE (ドバイ)。

  • コールバックの動作

    • コールバックリクエストは 5 秒以内にレスポンスを受信する必要があります。それ以外の場合、コールバックは失敗します。

    • コールバックが失敗しても、オブジェクトのアップロードの成功に影響を与えません。

    • OSS は、失敗したコールバックを自動的にリトライしません。

  • サポートされている操作

    PutObjectPostObjectCompleteMultipartUpload の各操作に対してコールバックを設定できます。これらの基本操作に基づいて構築されている V2 SDK のファイルアップロードマネージャーと署名付き URL も、コールバックをサポートしています。

仕組み

Object Storage Service (OSS) のコールバックプロセスの手順は次のとおりです。

  1. コールバックパラメーターを指定したオブジェクトのアップロード

    オブジェクトをアップロードする際、クライアントはアプリケーションサーバーの URL とコールバックリクエストの内容を指定するために、callback パラメーターを含める必要があります。カスタム変数を渡すには、オプションの callback-var パラメーターを含めることもできます。

  2. OSS によるオブジェクトの格納とコールバックリクエストの送信

    オブジェクトが正常にアップロードされると、OSS は指定されたコールバック URL に POST リクエストを送信します。このリクエストは、バケット、オブジェクト、サイズ、ETag などのオブジェクト情報、および任意のカスタム変数を含みます。

  3. アプリケーションサーバーによるコールバックの処理とレスポンスの返信

    コールバックリクエストを受信すると、アプリケーションサーバーはそれを処理し、セキュリティのため任意でリクエスト署名を検証して、5 秒以内に JSON 応答を返します。HTTP ステータスコード 200 は成功を示します。それ以外のステータスコードは失敗を示します。

  4. OSS によるアップロード結果の返却

    アプリケーションサーバーから成功のレスポンスを受信すると、OSS はそのレスポンスを最終的なアップロード結果としてクライアントに転送します。

実装

アップロードコールバックのデバッグは、クライアントサイドでのアップロードとサーバーサイドでのコールバック処理の2つの部分から構成されます。最初にクライアントサイドの実装をデバッグし、その後にアプリケーションサーバーをデバッグします。両方の部分が個別に動作することを確認した後、エンドツーエンドテストを実施します。

クライアントサイドでの実装

迅速に実装するには、SDKs に用意されているサンプルコードをご参照ください。

オブジェクトのアップロード後に OSS の自動コールバックをトリガーするには、アップロードリクエストに callback パラメーターと、任意の callback-var パラメーターを含める必要があります。

  1. callback パラメーターの設定

    このパラメーターは、アプリケーションサーバーの URL とリクエストボディの形式を定義します。JSON オブジェクトとして作成し、Base64 でエンコードする必要があります。

    1. 最小構成の例:

      {
      "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」をご参照ください。

    2. 高度な構成の例:

      {
      "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」をご参照ください。

  2. callback-var パラメーターの設定 (任意)

    重要

    callback-var パラメーターは JSON 形式である必要があります。各カスタムパラメーターのキーは「x:」で始まり、英小文字のみを含む必要があります。例: x:uid

    このパラメーターを使用して、ユーザーIDや注文番号などのカスタムビジネス情報をアプリケーションサーバーに渡します。例:

    {
      "x:uid": "12345",
      "x:order_id": "67890"
    }

    callback-var パラメーターは、callbackBody パラメーターと併せて使用する必要があります。上記の例のカスタム変数 (uidorder_id) は、callbackBody 内で ${x:xxx} プレースホルダーを使用して参照します。例:

    {
      "callbackUrl": "http://oss-demo.aliyuncs.com:23450",
      "callbackBody": "uid=${x:uid}&order=${x:order_id}"
    }

    コールバックがトリガーされると、callbackBodyTypeapplication/x-www-form-urlencoded に設定されている場合、OSS は次の内容を送信します:

    uid=12345&order=67890
  3. callback および 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=
  4. エンコードしたパラメーターのリクエストへの追加

    パラメーターをエンコードした後、次のいずれかの方法で OSS に渡します。

    ヘッダー (推奨)

    この方法は、SDKまたはバックエンドコードからのアップロードに適しています。この方法はセキュリティが高く、推奨します。x-oss-callbackx-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****************
    Test

    POST リクエストボディ

    この方法は、PostObject のアップロードにのみ適用されます。コールバックパラメーターは、POST リクエストのボディ内のフォームフィールドとして渡す必要があります。

    • callback パラメーター: このパラメーターを別のフォームフィールドとして渡します。値は Base64 エンコードされた JSON 設定です。

      --9431149156168
      Content-Disposition: form-data; name="callback"
      eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9
    • callback-var パラメーター (カスタム変数):各カスタム変数は、個別のフォームフィールドとして渡す必要があります。 単一の callback-var フィールドにカプセル化することはできません。

      たとえば、カスタム変数が uidorder_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 パラメーター (オプション): policycallback パラメーターの検証条件を指定できます。 この条件を省略した場合、アップロード中にパラメーターは検証されません。 例:

      { "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」をご参照ください。

アプリケーションサーバーは、次の操作を実行できる必要があります:

  1. 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
  2. セキュリティのためのリクエスト署名の検証 (任意)

    コールバックリクエストが OSS から送信されたことを確認するために、アプリケーションサーバーでリクエスト署名を検証します。手順の詳細については、「Recommended configurations」をご参照ください。

    説明

    署名検証は任意です。セキュリティ要件に応じて有効にできます。

  3. コールバックレスポンスの返信

    アプリケーションサーバーがコールバックリクエストを受信した後、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 から送信されたことを確認するために、コールバックリクエストの署名を検証できます。次の手順では、検証プロセスについて説明します。

  1. 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 はコールバックのメッセージボディです。

    • 署名を生成する手順:

      1. 署名対象の文字列を構築します。リソースパスを URL デコードし、元のクエリ文字列、改行文字 (\n)、コールバックのメッセージボディを追加します。

      2. RSA 署名を生成します。秘密鍵を使用して署名対象の文字列に署名します。署名に使用するハッシュ関数は MD5 です。

      3. 結果を 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

      path は /index.php、query_string は ?id=1&index=2、body は bucket=examplebucket であり、生成される署名は kKQeGTRccDKyHB3H9vF+xYMSrmhMZjzzl2/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2t**** です。

  2. コールバックサーバーによる署名の検証

    アプリケーションサーバーは、OSS からのリクエストの署名を検証して真正性を確認する必要があります。検証プロセスは次のとおりです:

    1. 公開鍵を取得します:

      リクエストヘッダーの 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 のコンテンツは変更されないため、ネットワークの変動によるサービス中断を回避するために、公開鍵をキャッシュすることを推奨します。

    2. 署名をデコードします。

      リクエストヘッダーの Authorization フィールドから署名を取得し、Base64 デコードします。

      signature = base64_decode(value of the Authorization header)
    3. 検証対象の文字列を構築します。

      次の形式で、リソースパス、クエリ文字列、改行文字 (\n)、コールバックのメッセージボディを連結します:

      sign_str = url_decode(path) + query_string + ‘\n’ + body
    4. 署名を検証します。

      MD5 ハッシュと RSA 公開鍵を使用して検証します。

      result = rsa_verify(public_key, md5(sign_str), signature)
  3. 署名の検証の例

    次の 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 です。

  • 最大 5 つの URL をセミコロン (;) で区切って指定できます。OSS は、最初のコールバックレスポンスが成功するまで、URL に順序どおりにリクエストを送信します。

  • HTTPS URL をサポートしています。

  • IPv6 アドレス、または IPv6 アドレスに解決されるドメイン名は指定できません。

  • 中国語などの文字が正しく処理されるように、callbackUrl は URL エンコードする必要があります。たとえば、https://example.com/中文.php?key=value&中文名称=中文值https://example.com/%E4%B8%AD%E6%96%87.php?key=value&%E4%B8%AD%E6%96%87%E5%90%8D%E7%A7%B0=%E4%B8%AD%E6%96%87%E5%80%BC としてエンコードする必要があります。

callbackBody

はい

コールバックリクエストボディの内容です。形式は、callbackBodyType パラメーターと一致させる必要があります。

  • callbackBodyType がデフォルト値の application/x-www-form-urlencoded の場合、callbackBody はキーと値のペア形式にする必要があります。例:bucket=${bucket}&object=${object}&my_var_1=${x:my_var1}&my_var_2=${x:my_var2}

  • callbackBodyTypeapplication/json の場合、callbackBody は JSON 形式にする必要があります。例:{\"bucket\":${bucket},\"object\":${object},\"mimeType\":${mimeType},\"size\":${size},\"my_var1\":${x:my_var1},\"my_var2\":${x:my_var2}}

callbackBody は、OSS のシステムパラメーター、カスタム変数、および定数を参照できます。システムパラメーターの詳細については、「callbackBody でサポートされているシステムパラメーター」をご参照ください。

callbackHost

いいえ

コールバックリクエストの Host ヘッダーの値です。値はドメイン名または IP アドレスにすることができます。

  • callbackHost を設定しない場合、OSS は callbackUrl を解析し、抽出されたホストを callbackHost の値として使用します。

callbackSNI

いいえ

コールバックリクエストにサーバー名表示 (SNI) を含めるかどうかを指定します。HTTPS リクエストでは、SNI を使用することで、サーバーはリクエストされたホスト名に対して正しい証明書を提示できます。

callbackUrl が HTTPS を使用する場合、このパラメーターを有効にすることを推奨します。そうしないと、証明書の不一致が原因でコールバックが失敗し、502 callback failed などのエラーが発生する可能性があります。有効な値:

  • true:SNI を送信します。

  • false (デフォルト):SNI を送信しません。

    説明

    英国 (ロンドン) リージョンでは、このパラメーターの設定に関係なく、SNI は常に送信されます。

callbackBodyType

いいえ

コールバックリクエストの Content-Type、つまり`callbackBody` のデータ形式です。

次のタイプがサポートされています。

  • application/x-www-form-urlencoded (デフォルト)

    callbackBody 内の変数を URL エンコードされた値に置き換えます。

  • application/json

    callbackBody 内の変数を JSON 形式のルールに従って置き換えます。

callbackBody でサポートされているシステムパラメーター

callback パラメーターの callbackBody フィールドは、複数のシステムパラメーターを参照して、アップロードされたオブジェクトに関する情報をコールバックリクエストで渡すことができます。次の表では、サポートされているシステムパラメーターについて説明します。

パラメーター

説明

bucket

バケットの名前です。

object

オブジェクトのフルパスです。

etag

オブジェクトの etag です。クライアントに返される etag 値と同じです。

size

オブジェクトのサイズです。CompleteMultipartUpload API を呼び出した場合、size はオブジェクト全体のサイズを表します。

mimeType

リソースタイプです。たとえば、JPEG 画像のリソースタイプは image/jpeg です。

imageInfo.height

画像の高さです。この変数は画像ファイルでのみ利用できます。

imageInfo.width

画像の幅です。この変数は画像ファイルでのみ利用できます。

imageInfo.format

画像の形式 (JPG、PNG など) です。この変数は画像ファイルでのみ利用できます。

crc64

オブジェクトのアップロード後に返される x-oss-hash-crc64ecma ヘッダーの値です。

contentMd5

オブジェクトのアップロード後に返される Content-MD5 ヘッダーの値です。

重要

この変数は、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 ヘッダーを削除します。