Tagbangers Blog

The temporary upload location [/tmp/tomcat.***] is not valid

Spring Boot のアプリでファイルアップロードの機能が突然以下のようなエラーで機能しなくなるようなことがありました。

java.io.IOException: The temporary upload location [/tmp/tomcat.4973725229945795147.5000/work/Tomcat/localhost/ROOT] is not valid

原因は以下。
https://github.com/spring-projects/spring-boot/issues/5009
https://github.com/spring-projects/spring-boot/issues/9616

Spring Boot を jar パッケージングしているときに /tmp にアップロードされたファイルを一時的に保存するが、/tmp 配下のファイルは OS 側から定期的に削除されることがあり、その際に一時ファイルが作れずエラーとなってしまいます。

今回発生した環境は AWS の Beanstalk だったので、
https://github.com/spring-projects/spring-boot/issues/5009
のコメントにあるように以下のように対処しました。

.ebextensions に以下のファイルを追加

.ebextensions/10_tmpfolder-tomcat.config

container_commands:
  01chmod:
    command: "chmod +x .ebextensions/tomcat/hooks/*"
  02mkdir_appdeploy_post:
    test: '[ ! -d /opt/elasticbeanstalk/hooks/appdeploy/post ]'
    command: "mkdir /opt/elasticbeanstalk/hooks/appdeploy/post"
  10appdeploy_post_createfolder:
    command: "cp .ebextensions/tomcat/hooks/create_tmp_dir.sh /opt/elasticbeanstalk/hooks/appdeploy/post/"

.ebextensions/tomcat/hooks/create_tmp_dir.sh

#!/usr/bin/env bash
mkdir -p /var/app/current/tmp-tomcat
chmod a+w /var/app/current/tmp-tomcat

application.properties に以下の設定を追記

spring.servlet.multipart.location=/var/app/current/tmp-tomcat