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

Object Storage Service:コールバック

最終更新日:Mar 12, 2026

ファイルがアップロードされると、OSS は自動的にコールバックをトリガーしてアプリケーションサーバーに通知し、後続の操作を実行させることができます。

制限事項

  • リージョンの制限

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

  • コールバックの動作

    • アプリケーションサーバーは、コールバックリクエストに 5 秒以内に応答する必要があります。応答がタイムアウトした場合、コールバックは失敗したと見なされます。

    • コールバックが失敗しても、ファイルアップロードの成功ステータスには影響しません。

    • 失敗したコールバックは自動的に再試行されません。

  • インターフェースのサポート

    コールバック機能は、PutObjectPostObject、および CompleteMultipartUpload 操作でのみサポートされています。V2 SDK によってカプセル化され、これらの基本操作に基づいているファイルアップロードマネージャーや署名付き URL も、コールバック機能をサポートしています。

コールバックプロセスの概要

image

OSS のコールバックプロセスは次のとおりです:

  1. クライアントがコールバックパラメーター付きでファイルをアップロードする

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

  2. OSS がファイルを保存し、コールバックリクエストを送信する

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

  3. サーバーがコールバックを処理し、応答を返す

    サーバーがコールバックリクエストを受信した後、セキュリティ目的でリクエスト署名を検証できます。サーバーは 5 秒以内にリクエストを処理し、JSON 形式で応答を返す必要があります。HTTP ステータスコード 200 はコールバックが成功したことを示します。その他のステータスコードは、コールバックが失敗したことを示します。

  4. OSS がアップロード結果を返す

    OSS がアプリケーションサーバーから成功したコールバック応答を受信した後、OSS は最終的な処理結果をクライアントに返します。

開発ガイド

アップロードコールバックのデバッグには、クライアントのアップロードとサーバー側のコールバック処理の 2 つの部分が含まれます。まずクライアントのアップロードをデバッグし、次にアプリケーションサーバーをデバッグできます。両方の部分がデバッグされた後、完全な統合テストを実行できます。

クライアント側の実装

このセクションでは、アップロードコールバックパラメーターを構築するためのロジックとプロセスについて説明します。アップロードコールバック機能を迅速に実装するには、SDK が提供するサンプルコードをご参照ください。

ファイルがアップロードされた後に OSS が自動的にコールバックをトリガーするようにするには、アップロードリクエストに `callback` パラメーターとオプションの `callback-var` パラメーターを渡す必要があります。

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

    このパラメーターは、アプリケーションサーバーのアドレス、リクエストコンテンツの形式、およびその他の情報を定義します。このパラメーターを 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 は、コールバック中にこれらのプレースホルダーを実際の値に置き換えます。利用可能なパラメーターの詳細については、「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
      }

      フィールドの詳細については、「コールバックパラメーターの詳細」をご参照ください。

  2. `callback-var` パラメーターを構築します (オプション)。

    重要

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

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

    {
      "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` パラメーターのエンコーディング

      元の `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-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****************
    Test

    POST リクエストボディのフォームフィールドを使用してパラメーターを渡す

    この方法は、PostObject 操作にのみ適用されます。POST リクエストボディのフォームフィールドを介してのみコールバックパラメーターを渡すことができます。

    • `callback` パラメーター:このパラメーターは、別のフォーム項目として渡すことができます。値は Base64 エンコードされた JSON 構成です。

      --9431149156168
      Content-Disposition: form-data; name="callback"
      eyJjYWxsYmFja0hvc3QiOiAieW91ci5jYWxsYmFjay5jb20iLCAiY2FsbGJhY2tVcmwiOiAiaHR0cDovL29zcy1kZW1vLmFsaXl1bmNzLmNvbToyMzQ1MCIsICJjYWxsYmFja0JvZHkiOiAiYnVja2V0PSR7YnVja2V0fSZvYmplY3Q9JHtvYmplY3R9JnVpZD0ke3g6dWlkfSZvcmRlcj0ke3g6b3JkZXJfaWR9IiwgImNhbGxiYWNrQm9keVR5cGUiOiAiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIiwgImNhbGxiYWNrU05JIjogZmFsc2V9
    • `callback-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` パラメーターの検証 (オプション):ポリシーで `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 パラメーターはオプションです。署名を計算する際、これらのパラメーターは正規化クエリ文字列に含める必要があります。詳細については、「署名バージョン 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

サーバー側の実装

このセクションでは、サーバー側の処理フローについて説明します。さまざまな言語でのコード例については、「サーバー側のコード例」をご参照ください。

アプリケーションサーバーは、次の機能をサポートする必要があります:

  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 からのものであることを確認するために、アプリケーションサーバーで署名を検証します。検証手順については、「推奨構成」をご参照ください。

    説明

    署名検証はオプションです。必要に応じて有効にできます。

  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 は、RSA 非対称暗号化アルゴリズムと MD5 ハッシュアルゴリズムを使用してリクエストコンテンツの署名を生成し、その署名をリクエストヘッダーの `authorization` フィールドに追加します。

    • 署名は次のように計算されます:

      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. コールバックサーバーが署名を検証する

    アプリケーションサーバーは、リクエストソースの正当性を確認するために、OSS からのリクエストの署名を検証する必要があります。次の手順に従うことができます:

    1. 公開鍵を取得する:

      リクエストヘッダーの `x-oss-pub-key-url` フィールドから Base64 エンコードされた公開鍵 URL を取得し、その URL をデコードします。

      public_key = urlopen(base64_decode(x-oss-pub-key-url header value))

      デコード前の値の例:

      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(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. 署名検証の例

    次の 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)
                # 公開鍵アドレスに基づいて公開鍵の内容をキャッシュします。
                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)
            # 権限付与を検証します。
            auth_md5 = hashlib.md5(auth_str.encode()).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('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()

    他のプログラミング言語でのサーバー側コード例については、次の表をご参照ください。

    SDK 言語

    説明

    Java

    • ダウンロードリンク:Java

    • 実行方法:パッケージを解凍し、java -jar oss-callback-server-demo.jar 9000 を実行します。9000 は別のポート番号に置き換えることができます。

    Python

    • ダウンロードリンク:Python

    • 実行方法:パッケージを解凍し、python callback_app_server.py を実行します。このプログラムには RSA の依存関係が必要です。

    PHP

    • ダウンロードリンク:PHP

    • 実行方法:Apache 環境にデプロイします。PHP では、一部のヘッダーの取得は環境に依存します。ご利用の環境に合わせてサンプルコードを修正してください。

    .NET

    • ダウンロードリンク:.NET

    • 実行方法:パッケージを解凍し、README.md の指示に従ってください。

    Node.js

    • ダウンロードリンク:Node.js

    • 実行方法:パッケージを解凍し、node example.js を実行します。

    Ruby

    • ダウンロードリンク:Ruby

    • 実行方法:ruby aliyun_oss_callback_server.rb を実行します

コールバックパラメーターの詳細

次の表は、ファイルが OSS に正常にアップロードされた後のコールバックリクエストの内容と動作を設定するために使用される `callback` パラメーターの詳細な説明を提供します。

フィールド

必須

説明

callbackUrl

はい

ファイルアップロードが成功した後、OSS はこの URL に POST コールバックリクエストを送信します。

  • 同時に最大 5 つの URL を設定でき、セミコロン (;) で区切ります。OSS は、最初のコールバックリクエストが正常に返されるまで、順次リクエストを送信します。

  • HTTPS プロトコルアドレスをサポートします。

  • 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

はい

コールバックを開始する際のリクエストボディの内容。その形式は `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 (サーバー名表示) を含めるかどうか (HTTPS リクエストでドメインを識別し、正しい証明書を返すために使用されます)。

`callbackUrl` が HTTPS を使用する場合、このパラメーターを有効にします。そうしないと、証明書の不一致によりコールバックが失敗する可能性があります (例:「502 callback failed」エラー)。値は次のとおりです:

  • true:SNI を送信します。

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

    説明

    イギリス (ロンドン) リージョンは、このパラメーターに関係なく常に SNI を送信します。

callbackBodyType

いいえ

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

次の 2 つのタイプをサポートしています:

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

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

  • application/json

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

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

`callback` パラメーターの `callbackBody` フィールドは、コールバックリクエストでアップロードされたファイルに関する情報を渡すために参照できる複数のシステムパラメーターをサポートしています。サポートされているシステムパラメーターは次の表にリストされています。

システムパラメーター

意味

bucket

バケット名。

object

オブジェクト (ファイル) の完全なパス。

etag

ファイルの ETag。ユーザーに返される ETag フィールドです。

size

オブジェクトのサイズ。`CompleteMultipartUpload` を呼び出すとき、`size` はオブジェクト全体のサイズです。

mimeType

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

imageInfo.height

イメージの高さ。この変数はイメージ形式にのみ適用されます。イメージ形式以外の場合、この変数の値は空です。

imageInfo.width

イメージの幅。この変数はイメージ形式にのみ適用されます。イメージ形式以外の場合、この変数の値は空です。

imageInfo.format

JPG や PNG などのイメージ形式。この変数はイメージ形式にのみ適用されます。イメージ形式以外の場合、この変数の値は空です。

crc64

ファイルアップロード後に返される `x-oss-hash-crc64ecma` ヘッダーの内容と一致します。

contentMd5

MD5 値。このパラメーターの値は、オブジェクトがアップロードされた後に返される Content-MD5 ヘッダーの値と同じです。

重要

この変数は、PutObject または PostObject 操作を呼び出してオブジェクトをアップロードした場合にのみ値を持ちます。

vpcId

リクエストを開始したクライアントの `VpcId`。リクエストが VPC 経由で開始されていない場合、この変数の値は空です。

clientIp

リクエストを開始したクライアントの IP アドレス。

reqId

開始されたリクエストの `RequestId`。

operation

`PutObject` や `PostObject` など、リクエストを開始した操作の名前。

SDK

以下は、クライアント実装の例です。

単純なアップロード

(PutObject を使用)

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

(CompleteMultipartUpload を使用)

署名付き URL アップロード

(PutObject を使用)

Java

デモ

デモ

デモ

Python V2

デモ

-

デモ

Go V2

デモ

デモ

デモ

トラブルシューティング

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

よくある質問

アップロード失敗後、OSS はアプリケーションサーバーにコールバック通知を送信しますか?

いいえ。OSS はファイルが正常にアップロードされた後にのみコールバックを実行します。ファイルのアップロードが失敗した場合、OSS はコールバックを実行せず、代わりにエラーメッセージを返します。

「Response body is not valid json format」エラーの対処法

  • 処理中にアプリケーションサーバーが例外をスローします。これにより、OSS に返されるボディが JSON 形式ではなくなります。次の図に示します:callback

    解決策:

    • 次のコマンドを実行して内容を確認できます。

      curl -d "<Content>" <CallbackServerURL> -v
    • パケットをキャプチャして内容を確認できます。

      Windows では、Wireshark を使用してパケットをキャプチャできます。Linux では、tcpdump コマンドを実行できます。

  • アプリケーションサーバーから OSS に返されるボディにバイトオーダーマーク (BOM) ヘッダーが含まれています。

    このエラーは、PHP SDK を使用して記述されたアプリケーションサーバーでよく発生します。PHP SDK は BOM ヘッダーを返すため、OSS が受信するボディには 3 バイト余分に含まれます。これにより、ボディが JSON 形式ではなくなります。次の図に示すように、`ef bb bf` バイトが BOM ヘッダーを構成します。

    callback1

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