概要
AudioPlayerで最大60分のサウンドを流すAlexaスキルで、10分過ぎたあたりで無音になるという問題に遭遇しました。
その原因の調査と対応についてのメモです。
結論
AudioPlayerで署名付きURLを使うときのExpireは、サウンドの長さ程度にしておいたほうが良い。
調査
まずは、mp3自体に問題がないかを確認しましたが特に以上はありません。
次に怪しい箇所としては、署名付きURLだったので、S3のアクセスログを有効にして眺めてみます。
※1 hogehoge.mp3
は60分のサウンド
※2 署名付きURLのExpireは60秒
$ cat 2020-07-14-* | sort -k3 | grep hogehoge.mp3 | awk '{print $3, $9, $10, $12, $13}'
[14/Jul/2020:13:10:51 ${BUCKET}/hogehoge.mp3 "HEAD HTTP/1.1" 403
[14/Jul/2020:13:10:51 ${BUCKET}/hogehoge.mp3 "GET HTTP/1.1" 200
[14/Jul/2020:13:10:52 ${BUCKET}/hogehoge.mp3 "GET HTTP/1.1" 200
[14/Jul/2020:13:10:52 ${BUCKET}/hogehoge.mp3 "GET HTTP/1.1" 206
[14/Jul/2020:13:16:23 ${BUCKET}/hogehoge.mp3 "GET HTTP/1.1" 403
[14/Jul/2020:13:16:25 ${BUCKET}/hogehoge.mp3 "GET HTTP/1.1" 403
[14/Jul/2020:13:16:27 ${BUCKET}/hogehoge.mp3 "GET HTTP/1.1" 403
[14/Jul/2020:13:16:30 ${BUCKET}/hogehoge.mp3 "GET HTTP/1.1" 403
[14/Jul/2020:13:16:34 ${BUCKET}/hogehoge.mp3 "GET HTTP/1.1" 403
[14/Jul/2020:13:17:34 ${BUCKET}/hogehoge.mp3 "GET HTTP/1.1" 403
[14/Jul/2020:13:18:35 ${BUCKET}/hogehoge.mp3 "GET HTTP/1.1" 403
[14/Jul/2020:13:19:35 ${BUCKET}/hogehoge.mp3 "GET HTTP/1.1" 403
[14/Jul/2020:13:20:35 ${BUCKET}/hogehoge.mp3 "GET HTTP/1.1" 403
どうやら最初は200を返しているが、途中から403(URLの期限切れ)を返している。
約6分後に403を返しているが、無音になるのは10分過ぎなので、ある程度バッファリングして、足りなくなったら随時取りに行く実装の様子。
エラーになったら1分ごとにリトライしてるのも良いですね。
対応
署名付きURLのExpireをサウンド長(60分)にしてリトライ
$ cat 2020-07-14-* | sort -k3 | grep fugafuga.mp3 | awk '{print $3, $9, $10, $12, $13}'
[14/Jul/2020:13:48:53 ${BUCKET}/fugafuga.mp3 "HEAD HTTP/1.1" 403
[14/Jul/2020:13:48:53 ${BUCKET}/fugafuga.mp3 "GET HTTP/1.1" 200
[14/Jul/2020:13:48:53 ${BUCKET}/fugafuga.mp3 "GET HTTP/1.1" 206
[14/Jul/2020:13:48:53 ${BUCKET}/fugafuga.mp3 "GET HTTP/1.1" 200
[14/Jul/2020:13:55:15 ${BUCKET}/fugafuga.mp3 "GET HTTP/1.1" 206
[14/Jul/2020:14:00:42 ${BUCKET}/fugafuga.mp3 "GET HTTP/1.1" 206
[14/Jul/2020:14:06:10 ${BUCKET}/fugafuga.mp3 "GET HTTP/1.1" 206
6分後以降のアクセスも2XXを返していて、サウンドも無音にならず長時間流れるようになりました。
備考
wikipediaのステータスコード206の説明
部分的内容。部分的GETリクエストを受理したときに、返される。
例: ダウンロードツール等で分割ダウンロードを行った場合や、レジュームを行った場合に返される。
部分取得してくれてるみたいですね。転送量的にもお優しそう。
公式ドキュメントの説明
Alexa hosted skillsの署名付きURLを利用する場合
URLの有効期間は60秒です。また、ユーティリティ関数から有効期間を上書きすることはできません。
という制約があります。
つまり長いサウンドを流そうとすると、途中で無音になる可能性があるので注意したほうが良いかもですね。
(データサイズにもよるかもしれない)