現在着手中のプロジェクトに、新規にCSV出力機能を追加することになった。
システムの流れ、構成は以下のイメージ
〜〜〜〜〜〜〜〜〜〜
・Web画面からCSV出力依頼APIをリクエスト
↓
・APIはSQSにキューメッセージを登録
↓
・SQSのキューをトリガーにLambdaが起動。LambdaでCSVファイルをS3に配置し、署名付きURLを生成してDBにほぞん
↓
・Web画面で署名付きURLを表示し、ユーザーにダウンロードさせる
〜〜〜〜〜〜〜〜〜〜〜
この時、署名付きURLの有効期限は、S3にファイル配置してから「3日間」の想定でいた。
実装が完了し、動作確認していたところ
午前中に発行したCSVと署名付きURLが、午後になって参照してもエラーになっていることがわかった。
“`
<Error> <Code>ExpiredToken</Code> <Message>The provided token has expired.</Message>
“`
原因は「Lambdaで生成した」ことにある。
Lambdaは署名付きURLを生成するとき、
AWS Security Token Service (STS:一時的なセキュリティ認証情報) を使用している。
そしてこのSTSの有効期限が署名付きURLに設定した有効期限より早く切れた場合、生成した署名付きURLも同時に期限切れとなる仕組みらしい。
完全に盲点。。
既存の機能で、ボタン押下で一時的な署名付きURLを都度発行して参照させるものがあったが、あちらが正解だったようだ。。
そもそも署名付きURLなどは長期にDBに保存するようなものではないのだと知った。
そして今回の機能を突貫で既存同じく、都度発行形式に切り替えたのだ。
いやぁ、、メンバーの方々には大変申し訳ないことだった。設計者は私です。。本当にすみませんでしたー。