25
Jul 2018
by
小川 岳史
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