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

Object Storage Service:コールバック

最終更新日:May 20, 2025

オブジェクトが Object Storage Service (OSS) にアップロードされた後、OSS はアプリケーションサーバーにコールバックリクエストを自動的に送信し、後続の操作を実行するように通知できます。

使用上の注意

  • リージョンに関する制限

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

  • コールバックロジック

    • OSS がリクエストを送信してから 5 秒以内にコールバックリクエストが応答を受信しない場合、OSS はリクエストがタイムアウトしたと判断します。

    • アップロードされたオブジェクトは、アップロードコールバックリクエストが成功したか失敗したかに関係なく、OSS に保存されます。

    • コールバックリクエストが失敗した場合、コールバックリクエストは再試行されません。

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

    PutObjectPostObjectCompleteMultipartUpload 操作のみがコールバックをサポートしています。

コールバックプロセス

手順:

  1. クライアントは、コールバックパラメータを指定してオブジェクトをアップロードします

    クライアントがオブジェクトをアップロードするときは、アプリケーションサーバーの URL とコールバックコンテンツを含む callback パラメータを指定します。クライアントは、callback-var パラメータを使用してカスタムパラメータを構成できます。

  2. OSS はオブジェクトを保存し、コールバックリクエストを送信します

    オブジェクトがアップロードされると、OSS はアプリケーションサーバーの URL に POST リクエストを送信します。リクエストには、バケット名、オブジェクト名、オブジェクトサイズ、オブジェクト ETag、カスタムパラメータなどのオブジェクト情報が含まれています。

  3. アプリケーションサーバーはコールバックリクエストを処理し、応答を返します

    アプリケーションサーバーは、コールバックリクエストを受信すると、リクエスト署名 (オプション) を検証してセキュリティを確保し、5 秒以内にコールバックリクエストを処理し、JSON 形式で応答を返します。 HTTP ステータスコード 200 は、呼び出しが成功したことを示します。その他の HTTP ステータスコードは、呼び出しが失敗したことを示します。

  4. OSS はアップロードとコールバックの結果を返します

    OSS はコールバック応答を受信すると、アップロードとコールバックの結果をクライアントに返します。

アップロードコールバックを構成する手順

アップロードコールバックのデバッグは、クライアントからオブジェクトをアップロードすることと、アプリケーションサーバーでコールバックリクエストを処理することの 2 つの部分で構成されます。オブジェクトのアップロードをデバッグしてから、コールバックリクエストの処理をデバッグすることをお勧めします。両方の部分がデバッグされたら、ジョイントデバッグを完了します。

オブジェクトのアップロードをデバッグする

次のセクションでは、ロジックを構築および処理し、コールバックパラメータをアップロードする方法について説明します。アップロードコールバック機能を迅速に実装するには、OSS SDK に提供されているサンプルコードを参照することをお勧めします。

オブジェクトがアップロードされた後に OSS が自動的にコールバックをトリガーするようにするには、アップロードリクエストで次のパラメータを指定する必要があります。callback と callback-var (オプション)。

  1. callback パラメータを構築します。

    callback パラメータは、アプリケーションサーバーの URL とリクエストコンテンツ形式を指定するために使用されます。JSON 形式で構築し、Base64 でエンコードする必要があります。

    1. 簡単な構成例:

      {
      "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 でサポートされているシステム変数」をご参照ください。

    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 パラメータでサポートされているフィールド」をご参照ください。

  2. (オプション) 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
  3. 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=
  4. 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

アプリケーションサーバーでコールバックリクエストを処理する

このセクションでは、アプリケーションサーバーがコールバックリクエストを処理する方法を示します。さまざまなプログラミング言語のサンプルコードの詳細については、「さまざまなプログラミング言語のサンプルコード」をご参照ください。

アプリケーションサーバーには、次の機能が必要です。

  1. 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
  2. (オプション) リクエストの署名を検証してデータセキュリティを確保する

    コールバックリクエストが OSS によって送信されたことを確認するには、アプリケーションサーバーでリクエスト署名を検証することをお勧めします。詳細については、「推奨構成」をご参照ください。

    説明

    署名の検証は必須ではありません。ビジネス要件に基づいて有効にすることができます。

  3. コールバックリクエストの応答を返す

    アプリケーションサーバーは、コールバックリクエストを受信すると、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 によって送信されたことを確認するために、コールバックリクエストの署名を検証できます。 検証手順:

  1. 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 はコールバックリクエストのメッセージ本文を指定します。

    • 署名を生成する手順:

      1. 署名する文字列を作成します。 文字列は、URL をデコードして取得したリソースパス、元のクエリ文字列、キャリッジリターン、およびコールバックメッセージ本文で構成されます。

      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

      上記のコードでは、最終的な署名は kKQeGTRccDKyHB3H9vF+xYMSrmhMZjzzl2/kdD1ktNVgbWEfYTQG0G2SU/RaHBovRCE8OkQDjC3uG33esH2t**** です。 署名は、/index.php パス、?id=1&index=2 クエリ文字列、および bucket=examplebucket 本文から生成されます。

  2. アプリケーションサーバーが署名を検証する

    アプリケーションサーバーは、リクエストの署名を検証して、リクエスト元の有効性を確認する必要があります。 手順:

    1. 公開鍵を取得する:

      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 の内容は変更されません。 ネットワークの変動によるサービスへの影響を防ぐために、公開鍵をキャッシュすることをお勧めします。

    2. 署名をデコードする。

      authorization リクエストヘッダーから署名を取得し、Base64 デコードを実行します:

      signature = base64_decode(authorization header value)
    3. 検証する文字列を作成する。

      リソースパス、クエリ文字列、改行、およびコールバックメッセージ本文を次の形式で連結します:

      sign_str = url_decode(path) + query_string + '\n' + body
    4. 署名を検証する。

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

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

    次のコードは、アプリケーションサーバーが署名を検証する方法の例を示しています。 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 です。

  • コールバックリクエストでは最大 5 つの URL を指定できます。URL はセミコロン(;)で区切る必要があります。OSS は、成功応答が返されるまで、各 URL にコールバックリクエストを送信します。

  • URL は HTTPS プロトコルをサポートしています。

  • IPv6 アドレス、または IPv6 アドレスを指すドメイン名を入力することはできません。

  • 漢字が正しく処理されるようにするには、コールバック URL をエンコードする必要があります。

callbackBody

はい

コールバックリクエストの本文。リクエスト本文の形式は、callbackType フィールドと一致している必要があります。

  • callbackType フィールドがデフォルト値 application/x-www-form-urlencoded に設定されている場合、callbackBody フィールドはキーと値の形式である必要があります。例:bucket=${bucket}&object=${object}&my_var_1=${x:my_var1}&my_var_2=${x:my_var2}

  • callbackType フィールドが application/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 フィールドを設定しない場合、ホスト値は callbackUrl フィールドの URL から解決され、callbackHost フィールドの値として指定されます。

callbackSNI

いいえ

コールバックリクエストでサーバ名表示(SNI)を指定するかどうかを指定します。

callbackUrl パラメータで HTTPS を使用する場合は、このパラメータを有効にすることをお勧めします。そうしないと、証明書が一致しないためにコールバックが失敗する可能性があります。たとえば、「502 callback failed」が返されます。有効な値:

  • true

  • false(デフォルト)

    説明

    英国(ロンドン)リージョンでコールバックリクエストが開始された場合、callbackSNI の値に関係なく SNI が送信されます。

callbackBodyType

いいえ

コールバックリクエストの Content-Type の値。これは、callbackBody データ形式です。

有効な値:

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

    callbackBodyType フィールドを application/x-www-form-urlencoded に設定すると、callbackBody フィールドのパラメータは URL エンコードされた値に置き換えられます。

  • application/json

    callbackBodyType フィールドを application/json に設定すると、callbackBody フィールドのパラメータは JSON 形式の値に置き換えられます。

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 について説明しています。

シンプルアップロード

(PutObject)

マルチパートアップロード

(CompleteMultipartUpload)

署名付き URL ベースのアップロード

(PutObject)

Java

デモ

デモ

デモ

Python V2

デモ

-

デモ

Go V2

デモ

デモ

デモ

トラブルシューティング

コールバック プロセス中にエラーが発生した場合、エラーコードを含むエラーメッセージが OSS によって返されます。トラブルシューティングには、エラーコードを使用できます。各エラーコードは特定のエラー原因に対応しています。 コールバックに関連するエラーコードについては、「07-CALLBACK」をご参照ください。

よくある質問

オブジェクトのアップロードに失敗した場合、OSS はアプリケーションサーバにコールバックリクエストを送信しますか?

いいえ。OSS は、オブジェクトがアップロードされた場合にのみ、アプリケーションサーバにコールバックリクエストを送信します。オブジェクトのアップロードに失敗した場合、OSS はアプリケーションサーバにコールバックリクエストを送信せず、エラーメッセージを返します。

「Response body is not valid json format(応答本文が有効な JSON 形式ではありません)」というエラーメッセージが返された場合はどうすればよいですか?

  • このエラーメッセージは、リクエストの処理中にアプリケーションサーバが例外をスローしたために返されます。この場合、OSS に返される応答本文は JSON 形式ではありません。次の図は、このエラーが発生したときに OSS に返される応答を示しています。callback

    解決策:

    • 次のコマンドを実行してコンテンツを確認します。

      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 バイトが応答本文に追加されたバイトであることを示しています。

    callback1

    解決策: アプリケーションサーバから OSS に返される応答本文から BOM ヘッダーを削除します。