期限内にアクセスしているが、データのアップロード中に期限切れになってしまって困った話です。
手順
1.Pre-signed URL生成
2.データのアップロード開始 ※クライアント側
3.データの送信中...
4.データのアップロード完了
5.期限切れ(403 Request has expired)発生
データ送信に時間が掛かって期限が切れてしまって、エラーになったという話です。
データのアップロード開始は期限内に行っているので、リクエストタイムアウトでない限り成功して欲しい。
結論
HTTPリクエストヘッダにExpect: 100-continueを入れれば良い。
これにより通信が2度行われ、最初のタイムスタンプで期限切れの認証が行われるので問題が無くなる。
改善後の手順
1.Pre-signed URL生成
2.データのアップロード開始準備(Expect: 100-continue) ※クライアント側
3.サーバーから100 Continue応答 ここの時間がPre-signed URLの期限判定に使われる
4.データのアップロード開始 ※クライアント側
5.データの送信中...
6.データのアップロード完了
7.通信成功
感想
知ってれば当たり前の話かもしれないですが、明示的にこういう情報が書いてないと
私の様にハマる人はハマると思います。同じことで困ってる方がいらっしゃいましたらお試しください。
HTTPはリクエスト(クライアントからデータ送信)完了まで、サーバーのプログラムは動かないと思っていたので
思っていた通りの動きでした。別の通信を挟むことで、この問題を解決しているのは私の中でスッキリです。
Expect: 100-continueの仕様だけ見ると何の意味があるねんって内容だったので目から鱗でした。