Spring boot ElasticBeanstalk 환경변수설정시 주의사항이다.

이것 때매 조금 고생을 한 적이 있다.


Spring boot에서 application.properties 작성시 대표적으로 server.port 등 이렇게 . (마침표)을 써서 사용한다

하지만 ElasticBeanstalk 에서는 아래의 사진처럼 이를 _ (언더스코어)로 구분하는데

Spring boot의  application.properties에는 - (하이픈)이 사용되는 것이 있다. 대충 이런것들 spring.aop.proxy-target-class이 있다.

이럴 경우 - (하이픈)은 . (마침표)가 아니라 그냥 두는 경향이 있는데 

이 또한 무조건 - (하이픈)을 _ (언더바)로 바꾼뒤 ElasticBeanstalk 의 환경변수설정에 입력해야 한다.

ex) SPRING_AOP_PROXY_TARGET_CLASS






Spring boot에서 AWS S3 파일업로드 하는 방법이다.




Spring boot AWS 배포 방법

2018/10/26 - [Develop/Spring Boot] - Spring Boot AWS Elastic BeanStalk을 이용한 배포


AWS Python Lambda 사용방법

2018/11/16 - [Develop/Python] - AWS Python Lambda (CloudWatch Lambda) 사용하기



1. S3에서 버킷을 하나 생성한다.




버킷을 생성할 때 주의할 점은 이름에 대문자가 들어가면 안되고 특수문자가 들어가면안된다. 또한, 이 버킷의 이름은 AWS S3의 전체 버킷 이름들과 중복이 되면 안된다. 예를들어 test라는 버킷을 한 경우 누군가 test라는 버킷을 사용중이라면 test라는 이름으로 버킷을 생성할 수 없다.


이름을 정한 후 옵션이나 권한 설정은 필요하면 설정을 하시고 그 외 그냥 다음을 눌러 생성한다. 어차피 옵션이나 권한은 S3를 생성하고 다시 설정을 할 수 있다.




2. Spring boot pom.xml에 dependency를 추가한다.


s3 dependency를 추가한다.



    com.amazonaws
    aws-java-sdk-s3
    1.11.452


그리고 Multipartfile 을 사용할 것이기 때문에 Multipartfile dependency를 추가한다.



    commons-fileupload
    commons-fileupload
    1.3.3


3. appliaction.properties 파일 설정.


리전 정보는 옆의 링크에서 확인할 수 있다.- https://docs.aws.amazon.com/ko_kr/general/latest/gr/rande.html 

cloud.aws.credentials.accessKey=IAM USER에서 확인
cloud.aws.credentials.secretKey=IAM USER에서 확인
cloud.aws.s3.bucket=buckettestgogo
cloud.aws.region.static=ap-northeast-2

추가로 Mutlipartfile의 파일 크기 범위를 정하고 싶으면 application.properties에 아래와 같이 추가한다.


spring.http.multipart.max-file-size=10MB
spring.http.multipart.max-request-size=10MB

4. 파일업로드


AmazonS3 의존성을 주입하고. bucket이름을 가져온다 굳이 @Value로 안가져와도 되고 buckettestgogo를 선언해도 된다.


ObjectMetadata를 통해 ContentType을 설정할 수 있다.

그리고 CloudFront를 사용하시는 분들이라면 metadata에 setCacheControl로 Cache설정이 가능하다.

또한. 파일의 권한을 지정할 수 있다. 아래 소스에는 읽기를 Public으로 설정하였다.

	@Autowired
	private AmazonS3 amazonS3;

	@Value("${cloud.aws.s3.bucket}")
	private String bucket;

	public void s3Test(MultipartFile file, String fname) {
		TransferManager tm = TransferManagerBuilder.standard().withS3Client(amazonS3).build();


		PutObjectRequest request;
		try {
	
			ObjectMetadata metadata = new ObjectMetadata();
			metadata.setCacheControl("604800"); // 60*60*24*7 일주일
			metadata.setContentType("image/png");
			request = new PutObjectRequest(bucket, fname, file.getInputStream(), metadata)
					.withCannedAcl(CannedAccessControlList.PublicRead);
			// amazonS3.putObject(request);
			Upload upload = tm.upload(request);

			upload.waitForCompletion();

		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (AmazonServiceException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (AmazonClientException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (InterruptedException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
       }


기본적인 예제를 활용하여 만들어 보았다 그 외에는 AWS에서 상세히 잘 설명되어 있다.

AWS 객체업로드 - https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/dev/HLuploadFileJava.html

AWS 리전정보 - https://docs.aws.amazon.com/ko_kr/general/latest/gr/rande.html


 

AWS의 Lambda 서비스와 Cloudwatch 이용하면 Batch job 역할을 할 수 있다.

덧 붙여 Python Lambda Python Package 배포 하는 방법을 해보자.



AWS ElasticBeanStalk을 이용한 배포(Spring boot) 바로가기

1. 2018/10/26 - [Develop/Spring Boot] - Spring Boot AWS Elastic BeanStalk을 이용한 배포




1. 먼저 AWS Lambda서비스를 생성합니다.






2. 그리고 AWS CloudWatch 서비스의 규칙에서 규칙생성을 합니다.




3. 이벤트 소스의 일정에 들어가 고정비율 또는 Cron식을 이용하여 시간을 선택합니다.

그리고 대상에서 아까 만든 Lambda 함수를 선택하고 생성을 합니다.


(저의 크론식은 Batchjob을 위해 매일 하루 자정마다 실행을 하는 것입니다.)

Cron식은 아래 링크의 AWS CloudWatch 레퍼런스에서 확인 할 수 있습니다. 

https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/tutorial-scheduled-events-schedule-expressions.html



 


4. 다시 Lambda로 들어와  아까만든 것의 편집합니다.

왼쪽 Designer 창에서 CloudWatch Events를 클릭하고

트리거 구성에 방금 만든 CloudWatch 규칙을 입력하고 추가합니다.




5. 규칙을 추가하였다면 생성한 함수의 이름을 클릭하여 함수코드 적는 란으로 돌아옵니다.




6. 직접 코드를 입력할 수도 있고, zip파일로 추가와 s3에 있는 것을 사용할 수 있습니다. 저는 .zip파일을 추가해보겠습니다.


.zip 파일을 업로드하고 저장을 하면




아래와 같이 Find not found 경고와 코드편집기가 나옵니다. 이 경고 메세지는 실행할 수 있는 핸들러(파이썬 메소드) 이름을 못찾아서 입니다. 이제 곧 수정할 예정입니다.


7. 저의 프로젝트 같은 경우는 app.py에서 실행하므로 app.py에 클릭합니다.

또한 저는 def main 메소드에서 프로그램이 실행됩니다.


이제 핸들러 정보에서 핸들러(파이썬 메소드)를 입력합니다. 

먼저 실행할 메인 파이썬파일의 이름을 적고 뒤엔 실행할 메소드 이름을 적습니다

(ex app.py 의 main() 메소드를 실행한다면 app.main 이라고 적음)

그리고 가장 중요한 실행하는 메인 메소드의 인자에 (event, context)라고 적어주어야 합니다. 

Lambda 레퍼런스에 따르면  아래와 같습니다.

  • event - AWS Lambda는 이 파라미터를 사용하여 이벤트 데이터를 핸들러에 전달합니다. 이 파라미터는 일반적인 Python dict 유형입니다. 또한 liststrintfloat 또는 NoneType 유형이 될 수 있습니다.

  • context - AWS Lambda는 이 파라미터를 사용하여 실행 시간 정보를 핸들러에 제공합니다. 이 파라미터는 LambdaContext 유형입니다.




8. 그리고 가장중요한 Python Package 추가하는 방법입니다. 

저는 사진에 이미 위 사진들에 추가가 되어있습니다.(pymysql)


저는 venv를 사용하기 때문에.

윈도우 기준

 %VIRTUAL_ENV%\Lib\site-packages


리눅스/mac 기준

$VIRTUAL_ENV/lib/python3.6/site-packages


site-packages 안에 있는 패키지 폴더들을 전부 복사하여 최상위 폴더에 붙여넣습니다. 그리고 배포할땐 압축파일에 venv파일을 제외하면 됩니다.

저 같은 경우는 mysql패키지만 사용하므로 site-packages안에 있는 mysql패키지(pymysql, PyMySQL-0.8.0.dist-info, pip-10.0.1-py3.7.egg)를 아래와 같이 최상위 폴더에 붙여놓고 venv폴더를 제외하고 .zip파일로 압축을 하였습니다.



9. 환경 변수 설정. (필요하신 분들만 사용안하시는 분들은 그냥 저장하셔도 무관함.)

저의 config.py 파이썬 파일입니다.



아래와 추가하시면 됩니다.



10. 위의 설정을 다 하셨으면 저장하시면 끝이납니다.

그리고 CloudWatch의 로그에서 필터에 아래와 같이 검색하시면 로그가 나옵니다. 그 로그를 보고 지정한 시각에 실행이 정상적으로 되었는지 확인하시면됩니다.




마지막으로. 파이썬파일에 외부 파일을 저장하는 소스가 있으면 READ_ONLY에러가 나오면서 되지않습니다. 예를 들어 log를 파일로 남기기 위해 파일 저장하는 소스가 있는데. 이는 Lambda에서 파일 저장을 제공하지 않으므로 에러가 발생합니다. 

사실 Lambda의 /tmp폴더에 경로를 지정하여 저장되게 하면, 저장되나 /tmp폴더를 확인할 수 있는 방법이 없습니다. 물론 S3를 이용하여 확인 할 수 는 있습니다.

그러므로 로그를 많이 확인하셔야 한다면 로그파일이 S3에 저장되게 할 수 있습니다. 물론 여기선 다루지 않습니다.(레퍼런스에서 확인)


또한, Lambda의 IP가 동적이므로 데이터베이스에서 IP 허용제한을 걸어 뒀을 경우. Lambda 파이썬 프로젝트에서 데이터베이스에 접근할 경우 동적ip로 인해 접근이 안 될 수 도있습니다. 그럴경우 VPC라는 것을 통해 허용할 수있습니다. 이것 또한 여기서 다루진 않습니다.(레퍼런스에서 확인)



참고

파이썬배포- https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/python-programming-model-handler-types.html

파이썬배포 - https://docs.aws.amazon.com/ko_kr/batch/latest/userguide/batch_cwet.html

파이썬배포 - https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/lambda-python-how-to-create-deployment-package.html

파이썬배포 - https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/with-s3-example-deployment-pkg.html#with-s3-example-deployment-pkg-python

CRON 시간 -https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/tutorial-scheduled-events-schedule-expressions.html

VPC구성- https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/logs/DocumentHistory_cwl.html

VPC구성 - https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/vpc.html

S3로그 - https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/logs/S3ExportTasksConsole.html

S3로그 - https://docs.aws.amazon.com/ko_kr/AmazonCloudWatch/latest/logs/S3ExportTasks.html


AWS Elastic BeanStalk를 이용한 Spring boot의 Jar파일 배포를 할 것이다. War파일도 다를게 없지만, 조금 다르긴하다.

차이점으로는 Java플랫폼을 사용한 Jar파일 배포는 JVM 커맨드라인을 사용할 수 없지만 대신 .ebextensions/ 의 Procfile을 통해 사용할 수 있지만, 이 글에서는 다루지 않는다. (바로 아래에 경로가 있다)

Tomcat 플랫폼을 사용한 War파일 배포는 JVM 커맨드 라인을 사용할 수 있다. 


1. Elastic beanstalk 환경변수설정시 주의사항

2019/02/12 - [Develop/Spring Boot] - Spring boot ElasticBeanstalk 환경변수설정시 주의사항


2. .ebextensions 와 Procfile

2019/02/12 - [Develop/Spring Boot] - Spring boot .ebextensions nginx 및 기본 사용방법 (AWS Elastic Beanstalk)




1. 먼저 AWS의 Elastic BeanStalk에 들어간다.

지금 같은 경우는 애플리케이션이 하나 생성되어 있어서 맨처음 화면이 아래와 같이 나타나게 되지만. 처음에는 시작하기라는 화면이 나올텐데

크게 다르지 않다. 어쨌든 생성하는 방식은 같다.


※ 주의 Jar파일 빌드전 appliaction.properties에서 server.port=5000으로 설정한다. 안하신 분들을 밑에 환경변수 설정부분을 보시면 됨. War파일은 안해도 됨. Jar파일은 ngnix가 port를 5000번으로 잡기때문




2. 화면 상단의 새 애플리케이션 생성에서 새 애플리케여신을 생성한 다음. 아래의 사진 처럼 작업의 환경 생성에 들어간다.



3. 환경 생성에 들어오면 아래와 같이 환경 티어 선택이있는데, 웹 서버 환경을 선택한다.


4.  환경이름과 도메인은 본인들이 쓸 이름을 적으면된다. 그리고 플랫폼에 Java라고 선택한다.(Jar파일을 사용할거기 때문)

War파일을 배포할 분들이라면 플랫폼에 Tomcat을 선택한다.

그리고 Jar파일을 처음 배포하는 것이기 때문에 애플리케이션 코드에서 코드업로드를 선택한다.




5. 코드 업로드를하게 되면 기존 컴퓨터에 저장되어있는 Jar파일 또는 War파일을 선택할 수 도있으며, S3를 사용하시는 분들이라면 S3에있는 파일을 사용할 수도 있다.  



6. 파일 업로드 후 추가 옵션 구성에서 본인이 필요한 옵션들을 설정할 수 있다. 특히 appliaction.properties에 들어가는 환경변수라던지

War파일 배포하는 분들이라면 JVM Command Line 명령어 등 과 로드밸런싱을 설정할 수 있다.

7. application.properties나 War파일 배포하시는 분들이라면 위 사진의 소프트웨어를 클릭하고 수정버튼을 누르고 아래와 같이 사용할 수 있다.

주의할 점으로는 application.properties파일과는 달리 예를들어 server.port 이면 SERVER_PORT 밑에 점 대신 언더바 _ 를 사용해야 한다.


※ 주의 Jar파일 빌드전 appliaction.properties에서 server.port=5000으로 설정안하신 분들은 밑에 사진의 SERVER_PORT부분을 추가하면 됨. War파일은 안해도 됨. Jar파일은 ngnix가 port를 5000번으로 잡기때문



8. 이후 저장하면 생성중이라는 콘솔화면이 나타나며 생성이 되면 대시보드가 나오게 될 것이다.

에러가 난다면 옆의 Log메뉴에서 Log를 호출하여 보면 된다.


참고 : https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/GettingStarted.html

+ Recent posts