Elastic Beanstalk environment 

Tomcat Platform + Load balancing, auto scaling 으로 세팅하게 되면,


자동으로 Apache + Tomcat 이 EC2 에 설치되어 서비스되는데 문제는


httpd.conf 와 server.xml 설정파일등이 기본값으로 되어있어 대용량 파일 업로드할때 connection 이 끊기면서 문제가 생겼다.


그래서 ec2 의 설정 파일을 직접수정하여, 리붓하여 해결을 했는데


문제는 war 를 다시 배포하면, ec2 를 바꿔버리는 경우도 있고, auto scaling 으로 ec2 를 생성하는 것들은 기본설정으로


생성되니 일일이 생성될때마다 들어가서 고쳐줄 수 도 없는 노릇이다.



war 를 배포할때마다 설정을 자동으로 변경할 수 있으면 해결될 문제인것 같다.



검색해보니 몇가지 해결책이 있었는데, 안돼서 AWS Support 팀에 물어보고 얻은 해결책입니다.




제 환경은 Maven 으로 war 생성하여, beanstalk 에 업로드 합니다.


1.

위 이미지 처럼 WebContent root 에 .ebextensions 폴더를 생성합니다.




2. .ebextensions 폴더 아래 server-update.config 파일을 생성합니다. 내용은 아래처럼

container_commands:
00_replace-tomcat-config:
command: cp .ebextensions/tomcat8/server.xml /etc/tomcat8/server.xml
01_replace-apache-config:
command: cp .ebextensions/apache/elasticbeanstalk.conf /etc/httpd/conf.d/elasticbeanstalk.conf

** 들여쓰기를 꼭 지켜야합니다. **


라인 3은 tomcat server.xml 파일작업

라인 5는 apache httpd.conf 파일역할을 하는것같은? ;; elasticbeanstalk.conf 파일 작업입니다.


저것들의 내용은



3. server.xml - 아래 위 다 짜르고 고친부분만 올렸습니다. 제 설정이니 프로젝트에 맞게 고치세요.

<Connector port="8080" protocol="HTTP/1.1"
keepAliveTimeout="-1"
URIEncoding="UTF-8"
disableUploadTimeout="true"
connectionTimeout="7200000"
connectionUploadTimeout="7200000"
redirectPort="8443" />



4. elasticbeanstalk.conf - 전체입니다.

<VirtualHost *:80>
Timeout 7200
ProxyTimeout 7200

<Proxy *>
Order deny,allow
Allow from all
</Proxy>

ProxyPass / http://localhost:8080/ retry=0
ProxyPassReverse / http://localhost:8080/
ProxyPreserveHost on

ErrorLog /var/log/httpd/elasticbeanstalk-error_log

</VirtualHost>




5. EC2 Console - Load Balancers 에서 해당 Elastic Beanstalk 이 생성한 ELB 를 찾아야 합니다.


찾아서 아래 그림처럼 Connection Settings 값을 최대 3600까지 올려주시면 됩니다.






여기까지 한 후 war 를 생성해보면, war 파일 root 에 .ebextensions 가 존재하면 다됐습니다.


이제 war 배포가 완료되고 ec2 의 각 파일을 열어보시면, 변경되었을겁니다.


인스턴스 리붓할 필요없이 자동으로 반영되는것 같습니다..


리전이 북미라 500메가 업로드하는데 1시간정도 걸리던데 서비스 잘되고 있습니다.













YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST



가장 기본적으로 파일 업로드를 하려면 

html 문서 안에 <form> 태그에서

<form method="post" enctype="multipart/form-data">
...........
</form> 







Multipart 지원기능을 사용하려면  먼저 multipartResolver 를 스프링 설정 파일에 등록 해주어야 한다.

CommonsMultipartResolver 를 multipartResolver 로 사용하려면, 다음과 같이 

빈 이름을 반드시!!!  "multipartResolver" 로 등록해서 사용하면 된다.
다른이름으로 등록하면 안된다. 그냥 안된다. 절대안된다. 업로드를 포기하라.

<bean id="multipartResolver
class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>

참고로 프로퍼티들은

maxUploadSize(최대업로드 가능한 바이트크기)
maxInMemorySize(디스크에 임시 파일을 생성하기 전에 메모리에 보관할수있는 최대 바이트 크기)
defaultEncoding(요청을 파싱할 때 사용할 캐릭터 인코딩. 기본값 ISO-8859-1)





이제 컨트롤러 파일에서 업로드가 되는 파일에 접근을 해야하는데, 

빈객체를 이용해서 받는 방법(커맨드 객체), 
@RequestParam 어노테이션을 이용하는 방법,
MultipartHttpServletRequest 를 이용하는 방법,

머 편한 방법을 택하면 된다.

주의 할 점은 <input type="file" name="file" size="50">
폼에서 파일프로퍼티 이름을 "file"로 썼다면, 
업로드될 파일에 접근 프로퍼티도 항상 무조건 네버! "file" 이 되어야 한다.


빈객체를 이용하는 방법은
public class ItemBean {

	MultipartFile file;
	

	public MultipartFile getFile() {
		return file;
	}

	public void setFile(MultipartFile file) {
		this.file = file;
	}

	
자바빈 파일에 set,get을 등록해주면 자동으로 들어간다. 



다음은 @RequestParam 어노테이션을 이용한 방법
	

	@RequestMapping(method = RequestMethod.POST)
	public ModelAndView process(HttpSession session, ItemBean itemBean,
								@RequestParam("file")MultipartFile file) {



나머지는 귀찮아서....

일단 이렇게 하면 MultipartFile 타입으로 file 에 업로드된 파일이 들어오게된다.


여기까지 했으면 다 끝난거다. 이제 쓰기만 하면 된다.

쓰는법은 하고싶은데로 하면되는데, 

MultipartFile 의 주요 메소드는

 String getName() 파라미터 이름을 구한다. 
 String getOriginalFilename()  업로드 한 파일의 실제!! 이름을 구한다.
 boolean isEmpty()  업로드 한 파일이 존재하지 않는 경우 true를 리턴한다.
 long getSize()  업로드한 파일의 크기를 구한다.
 byte[] getBytes() throws IOException  업로드 한 파일 데이터를 구한다. --> 이걸로 파일 쓰면된다.
 InputStream getInputStream()  InputStrem을 구한다.
 void transferTo(File dest)  업로드 한 파일 데이터를 지정한 파일에 저장한다. --> 요고도 파일쓰는거다.




걍 쉽게 MultipartFile.getBytes() 를 이용해서 쓰는게 편하다.
package Spring;

import java.io.FileOutputStream;

import org.springframework.web.multipart.MultipartFile;

public class FileWriter {

	private FileOutputStream fos;
	
	public void writeFile(MultipartFile file, String path, String fileName){
		
		try{
		
			byte fileData[] = file.getBytes();
			
			fos = new FileOutputStream(path + "\\" + fileName);
			
			fos.write(fileData);
		
		}catch(Exception e){
			
			e.printStackTrace();
			
		}finally{
			
			if(fos != null){
				
				try{
					fos.close();
				}catch(Exception e){}
				
				}
		}// try end;
		
	}// wirteFile() end;
}




업로드한 파일을 특정파일로 저장하고 싶다면 MultipartFile.transferTo() 를 쓰면 편하다.

File file = new File(filePath + fileName);

multipartFile.transferTo(file); 





YOUR COMMENT IS THE CRITICAL SUCCESS FACTOR FOR THE QUALITY OF BLOG POST
  1. 탐구생활 2012.10.16 12:07 신고  댓글주소  수정/삭제  댓글쓰기

    '그냥 안된다. 절대안된다. 업로드를 포기하라.'

    웃겨서 댓글답니다. ㅋㅋㅋ

  2. 휴렛 2014.11.20 10:56 신고  댓글주소  수정/삭제  댓글쓰기

    감사합니다. 덕분에 놓친부분 찾고 갑니다^^

  3. 방문객 2015.01.07 15:25 신고  댓글주소  수정/삭제  댓글쓰기


    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"/>
    설정덕분에 해결하고 지나갑니다 ^^