アップロードコールバック機能により、モバイルクライアントがオブジェクトをアップロードするたびに、OSS からアプリケーションサーバーへ POST リクエストが送信されます。これにより、誰がどのデバイスから何をアップロードしたかといった詳細情報をアプリケーションサーバーで把握できるため、OSS へのポーリングを行わずに、アップロードデータの追跡・処理・保存が可能です。
前提条件
開始する前に、以下の条件を満たしていることを確認してください。
モバイルアプリ向け直接データ転送の設定 を完了済みであること — Android または iOS アプリが、Security Token Service (STS) トークンを用いて既に OSS へ直接アップロードできる状態であること
POST リクエストを受信可能なパブリック IP アドレスを持つアプリケーションサーバーがあること
インターネットからアクセス可能なコールバック URL(例:
http://example.com/callback.php)が用意されていること
適用範囲/利用シーン
アプリケーションサーバーがアップロード発生時に即座に対応する必要がある場合に、アップロードコールバックが有効です。
ユーザー生成コンテンツの追跡:プロフィール写真、ドキュメント、動画などのアップロードユーザー、ファイル名、サイズ、MIME タイプを記録します。
デバイスメタデータの収集:クライアント側からの別途の API 呼び出しを必要とせず、各アップロードに伴ってアプリバージョン、OS バージョン、GPS 座標、デバイスモデルなどの情報を取得します。
アップロード後の処理:アップロードが OSS に到着した瞬間に、データベース更新、画像処理、通知送信などの下流ワークフローをトリガーします。
仕組み
このフローには、モバイルアプリ、OSS、アプリケーションサーバーの 3 者が関与します。
ステップ 1~4(図示は省略):モバイルアプリがアプリケーションサーバーと認証を行い、STS トークンを取得します。
ステップ 5:Android または iOS アプリが OSS へアップロードリクエストを送信します。このリクエストには、コールバック先の URL を指定する
callbackUrlおよびコールバックに含めるデータを定義するcallbackBodyが含まれます。ステップ 6:OSS がオブジェクトを受信した後、
callbackUrlに指定されたアプリケーションサーバーへ POST コールバックリクエストを送信します。ステップ 7:アプリケーションサーバーがリクエストを処理し、JSON 形式の応答を返します。OSS はこの応答を、アップロード結果としてモバイルアプリへ転送します。
アプリケーションサーバーがコールバックリクエストを受信できなかったり、アクセス不能な場合、OSS はモバイルアプリへ HTTP 203 を返します。ただし、オブジェクトは引き続き OSS に正常に保存されます。
コールバックの完全な仕様については、「コールバック」をご参照ください。
システム変数
OSS がアプリケーションサーバーへコールバックリクエストを送信する際、callbackBody には、以下のシステム変数の任意の組み合わせを含めることができます。これらの変数を含めるかどうかは、モバイルアプリ側でアップロードリクエストを構成する際に指定します。
| 変数 | 説明 |
|---|---|
bucket | オブジェクトがアップロードされたバケット |
object | アップロード後のオブジェクト名(キー) |
etag | アップロードされたオブジェクトの ETag |
size | アップロードされたオブジェクトのサイズ |
mimeType | アップロードされたデータの MIME タイプ |
imageInfo.height | アップロードされた画像の高さ |
imageInfo.width | アップロードされた画像の幅 |
imageInfo.format | アップロードされた画像のフォーマット(例:JPG、PNG) |
モバイルアプリでのアップロードコールバックの構成
コールバックをトリガーするには、すべてのアップロードリクエストに callbackUrl および callbackBody を含める必要があります。また、クライアント側のメタデータをサーバーへ送信するために、x: で始まるカスタム変数を渡すこともできます。
各アップロードリクエストに含めるパラメーター:
| パラメーター | 説明 | 例 |
|---|---|---|
callbackUrl | コールバックを受信するアプリケーションサーバーの URL。インターネット経由でアクセス可能である必要があります。 | http://example.com/callback.php |
callbackBody | OSS がコールバックリクエストボディに含めるシステム変数(およびカスタム変数)。 | filename=${object}&size=${size}&phone=${x:phone} |
カスタム変数の命名規則:カスタム変数は必ず x: で始める必要があります(例: x:phone、x:system、x:gps、x:version)。OSS はこれらの変数を callbackBody 内でそのままアプリケーションサーバーへ転送します。
iOS
OSSPutObjectRequest *request = [OSSPutObjectRequest new];
request.bucketName = @"<bucketName>";
request.objectKey = @"<objectKey>";
request.uploadingFileURL = [NSURL fileURLWithPath:@"<filepath>"];
// コールバック URL およびサーバーへ送信するフィールドを設定します。
request.callbackParam = @{
@"callbackUrl": @"http://example.com/callback.php",
@"callbackBody": @"filename=${object}&size=${size}&phone=${x:phone}&system=${x:system}"
};
// カスタム変数の値を設定します。
request.callbackVar = @{
@"x:phone": @"iphone6s",
@"x:system": @"ios9.1"
};Android
PutObjectRequest put = new PutObjectRequest(testBucket, testObject, uploadFilePath);
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType("application/octet-stream");
put.setMetadata(metadata);
// コールバック URL およびサーバーへ送信するフィールドを設定します。
put.setCallbackParam(new HashMap<String, String>() {{
put("callbackUrl", "http://example.com/callback.php");
put("callbackBody", "filename=${object}&size=${size}&phone=${x:phone}&system=${x:system}");
}});
// カスタム変数の値を設定します。
put.setCallbackVars(new HashMap<String, String>() {{
put("x:phone", "iPhone 6s");
put("x:system", "YunOS5.0");
}});アプリケーションサーバーの要件
アプリケーションサーバーは、以下の要件を満たす必要があります。
POST リクエストの受信対応:
callbackUrlエンドポイントで POST リクエストを受け付ける必要があります。パブリック IP アドレスの保有:OSS からアクセス可能である必要があります。例:
http://example.com/callback.php。JSON 応答の返却:OSS はこの応答を、アップロード結果としてモバイルアプリへ直接転送します。JSON ボディ内には任意のフィールドを含めることができます。
OSS からのコールバックであることを検証する
アプリケーションサーバーがインターネットに公開されている場合、OSS 以外のソースからもリクエストを受信する可能性があります。コールバックが真正なものであることを確認するには、着信した POST リクエスト内の x-oss-pub-key-url および authorization ヘッダーに対して RSA 署名検証を実行してください。署名検証を通過したリクエストのみが、OSS から送信されたものです。
次のセクションにあるサンプルプログラムには、この RSA 検証ロジックが含まれています。参考としてご活用ください。
アプリケーションサーバーが受信するコールバックリクエストの例(上記の iOS/Android の構成に基づく):
POST /index.html HTTP/1.0
Host: 203.0.113.0
Connection: close
Content-Length: 81
Content-Type: application/x-www-form-urlencoded
User-Agent: ehttp-client/0.0.1
authorization: kKQe**************/kdD1ktNVgbWE**************
x-oss-pub-key-url: aHR0**************
filename=test.txt&size=5&phone=iphone6s&system=ios9.1アプリケーションサーバーが署名検証を実行し、リクエストボディを解析した後、抽出されたデータ(ファイル名、サイズ、電話機種、OS バージョンなど)を継続的な管理のために保存できます。
OSS のサーバー応答処理動作
| シナリオ | OSS の動作 |
|---|---|
| アプリケーションサーバーがリクエストを受信できなかった、またはアクセス不能であった場合 | OSS はモバイルアプリへ HTTP 203 を返します。オブジェクトは、引き続き OSS に保存されます。 |
| アプリケーションサーバーが JSON 応答を返した場合 | OSS はモバイルアプリへ HTTP 200 および JSON 応答ボディを返します。 |
サンプルプログラムのダウンロード
以下のサンプルプログラムは、コールバックサーバー向けの RSA 署名検証を実装しています。各プログラムは着信コールバックの署名検証を実行しますが、callbackBody の解析は行っていません。構成した callbackBody のフィールドに応じて、解析ロジックを追加してください。
Java
ダウンロード:AppCallbackServer.zip
実行:
java -jar oss-callback-server-demo.jar 9000(9000 はデフォルトポートであり、必要に応じてポート番号を変更できます)> 注意: この JAR は OSS SDK for Java 1.7 を必要とします。エラーが発生した場合は、同梱の Maven プロジェクトソースを参照し、必要に応じて修正してください。
PHP
ダウンロード:callback-php-demo.zip
実行:Apache 環境へデプロイします。PHP 固有の機能により、特定のヘッダーを取得するには Apache 環境が必要です — 実際の環境に応じてサンプルコードを修正してください。
Python
ダウンロード:callback_app_server.py.zip
実行:
python callback_app_server.py— 最小限の HTTP サーバーを起動します。必要に応じて RSA 依存関係をインストールしてください。
Ruby
ダウンロード:oss-callback-server(GitHub)
実行:
ruby server.rb
よくある質問
アップロードリクエストの署名後にコールバック URL を変更できますか?
いいえ。コールバックパラメーターは署名済みのアップロードリクエストに含まれており、OSS によって検証されます。callbackUrl またはその他のコールバックパラメーターを署名後に変更すると、検証が失敗し、改ざんされたリクエストは拒否されます。