これは何?
LamdbdaでS3の署名付きURLを発行する時に、個人的につまづいたポイントを書いた記事です。
具体的なつまづいた現象としては、「Lamda上の処理で指定した有効期限に関わらず、有効期限が12時間程度になってしまう」というものでした。
「LambdaでS3の署名付きURL発行したけれど、長めに有効期限に指定したのに有効期限が切れてる~~~」でお困りの方、参考になると幸いです。
大まかな原因と解決方法
※ 私の解釈によるものが多いので、間違えていたら教えてください
原因
LambdaのIAMロールによって発行されたAWS Credentialを使用する場合、IAMロールによる一時的な認証が適用される。
※ 該当IAMロールの設定にもよるが、セッション期間は1時間~12時間で設定可能
その際に、IAMロールのセッション有効期限 < S3 署名付きURLの有効期限
とした場合、IAMロール側の有効期限が優先され、結果としてS3署名付きURLの期限がうまく機能しない状態となる。
解決策
「S3署名付きURL用のIAMユーザを発行し、署名付きURLを発行する場合にのみ、そのcredentialを用いる」という解決方法をとった。
補足
- Lambdaの環境変数と、S3用のcredentialを分けて定義する
Lambdaの環境変数では、IAMロールに応じて一時的な有効期限を持ったAWS_ACCESS_KEY
などが発行される。
AWS_ACCESS_KEY
、AWS_ACCESS_KEY_ID
、AWS_SECRET_ACCESS_KEY
、AWS_SESSION_TOKEN
– 関数の実行ロールから取得したアクセスキー。
そのため、S3用のcredentialを分けて定義したい場合は、これらと重複しないようにすべきですね。
- やってみたけれど、解決されないんだが??
別の原因があるかもです。
あとがき
S3の署名付きURLの有効期限は、リアルタイムでデバッグしていくしかないので、結構気付きにくいポイントでした。
LambdaなどでURLを発行して、「次の日にURLでダウンロードできないんだが~~~」となったら、IAMロールのcredentialを使用していることを疑うといいかもしれません。
そして、これから同様のことをしようとしている方、参考になればと思います!
ありがとうございました。