[AWS] AWS Beanstalk를 이용한 웹 어플리케이션 배포 및 beans-maven-plugin 소개
Automating Maven Project Deployments on AWS Beantalk
참고글 http://www.newvem.com/automating-maven-project-deployments-on-aws-elastic-beanstalk/
가독성 측면에서 난 evernote가 낫다는 생각을...
https://www.evernote.com/shard/s216/sh/729d1c3c-a639-4464-8af3-1b5d95bc0798/811867530a317d57432dd7c5512bfd91
AWS Beanstalk 를 사용하여 웹 어플리케이션 배포
1. Beanstalk 란 무엇인가?
- AWS Elastic Beanstalk는 PaaS로서, 웹 어플리케이션을 빌드/배포하는데 필요한 환경을 제공해주는 PaaS 이다. 이 뿐만 아니라, 모니터링(CloudWatch), 확장성(Auto Scaling)도 자동으로 지원한다.
- 현재 Tomcat, IIS, Node.js, Ruby, Python 등 여러 언어 및 환경으로 제공하고 있다.
2. Beantalk 를 어떻게 사용할 수 있을까?
- 샘플 프로젝트로서 여기에서는 Java 프로젝트를 사용하였다.
- tomcat 위에 war 파일을 배포할 수 있도록 모든 플랫폼을 제공해준다고 보면 된다.
- 실제 배포는 손으로 해야 함!
- maven 을 사용하고 있으므로 maven의 war package 사용
- maven 에 beanstalk-maven-plugin 사용하면 직접 배포 “준비” 가능.
2-1. beanstalk 설정을 해볼까?
1) Amazon Command Line Tool 사용
2) https://console.aws.amazon.com/elasticbeanstalk/ 에서 처리
여기에서 알고 가야 할 용어 두 가지를 짚고 넘어간다.
Application과 Environment
1. Application의 개념
- Applicaton은 모든 것을 포함하는 개념이다. 환경, 버전, 저장된 설정 등.
2. Environment
- 배포 및 서버 구동을 위해 필요한 AWS 자원들을 한 데 감싼 것(wrapping) 이다.
3. Application은 여러 개의 Environment를 가질 수 있다.
elastic beanstalk를 설정하였을 때 구조도.
2-2) 설정 방법
- 사실 매뉴얼이 너어어어어무 잘 나와 있어서 굳이 넣을 필요 없지만, 그래도 한국말로 써놓는게 훨씬 좋으니.
여기서 간단히 설정만으로 application을 생성할 수 있다. 더 자세한 옵션을 선택할 수도 있다.
선택 후 Get Started 버튼을 클릭하면 아래와 같이 나타난다.
이번 예제는 Tomcat을 선택하였다. Default로 설치되는 버전은 Tomcat 7, Java 7이다.
선택하면 아래와 같은 대시보드가 나타나고, Application에서 필요한 Environment가 순서대로 생성되는 걸 바로 확인할 수 있다.
순서는 아래와 같다.
1. CloudWatch Alarm 생성 (High/Low)
2. EC2 instance 생성 (default는 t1.micro)
Load Balancing, auto scaling 및 80 port forwarding도 자동으로 생성해주고,
applicaiton-name.elasticbeanstalk.com 이라는 도메인도 자동 생성해줘서 웹 어플리케이션을 배포하면 바로 URL로 접근할 수 있다.
CloudWatch 설정 및 EC2 설정은 각자 서비스 console web 에서 하면 된다.
Load Balancing, Auto Scaleing 설정 페이지는 beanstalk 설정 페이지에 포함되어 있다.
3. 배포는 어떻게 하면 되는가?
몇 가지 방법이 있다.
1) Amazon Command Line Tool 이용
- http://aws.amazon.com/code/6752709412171743
- PATH에 넣고 eb 커맨드를 실행하여 설정할 수 있다.
2) Console 웹에서 직접 업로드
- war 파일 직접 업로드가 가능하다.
3) maven plugin 사용
- beanstalk-maven-plugin 을 설정하면 가능하다.
- Amazon Beanstalk API 를 wrapping한 maven plugin 이다. http://beanstalker.ingenieux.com.br/beanstalk-maven-plugin/
아, 물론 ant/grails에서도 사용 가능하다.
http://beanstalker.ingenieux.com.br/beanstalk-maven-plugin/dependency-info.html
4. beanstalk-maven-plugin 이 어디까지 지원해주는가?
- 사용 가능한 dns 이름 체크
- application 생성/업데이트/삭제
- environment 업데이트
등 설정 뿐만 아니라 실제로 web application 파일을 배포하는 데 사용하는 명령어를 제공하고 있다.
- upload resource : S3 bucket 으로 war 파일 업로드
- application version 정보 생성
- environment 업데이트
[주의] 업데이트 된 환경을 deploy하지는 않는다. deploy는 console에서 하거나 CLI 를 이용해서 따로 해야한다.
5. beanstalk-maven-plugin 설정 예제
~/.m2/settings.xml
pom.xml에서 해도 되지만 권장하지 않는다.
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0
http://maven.apache.org/xsd/settings-1.0.0.xsd">
<profiles>
<profile>
<id>default</id>
<properties>
<aws.accessKey>YOUR_AWS_ACCESS_KEY</aws.accessKey>
<aws.secretKey>YOUR_AWS_SECRET_KEY</aws.secretKey>
</properties>
</profile>
</profiles>
<activeProfiles>
<activeProfile>default</activeProfile>
</activeProfiles>
</settings>
pom.xml
global 설정과 plugin 설정이 있다.
<properties>
<maven.build.timestamp.format>yyyyMMddHHmmss</maven.build.timestamp.format>
<beanstalk.versionLabel>${maven.build.timestamp}</beanstalk.versionLabel>
</properties>
<plugin>
<groupId>br.com.ingenieux</groupId>
<artifactId>beanstalk-maven-plugin</artifactId>
<version>1.1.1</version>
<configuration>
<applicationName>glance-was-20140113</applicationName>
<cnamePrefix>glance-was-20140113</cnamePrefix><!-- cnamePrefix.elasticbeanstalk.com -->
<environmentName>glanceWas20140113-env</environmentName>
<region>us-west-1</region>
<s3Bucket>elasticbeanstalk-glance-was-20140113</s3Bucket>
<s3Key>${project.artifactId}/${project.build.finalName}-${maven.build.timestamp}.war</s3Key>
</configuration>
</plugin>
6. 사용 방법
- mvn beanstalk:upload-source-bundle beanstalk:create-application-version beanstalk:update-environment
- 이렇게 하면 아래와 같이 동작한다.
beanstalk:upload-source-bundle : war upload
beanstalk:create-application-version : 버전 정보 기록
beanstalk:update-environment : 기존에 만들어놓은 환경 설정
[INFO] [beanstalk:upload-source-bundle {execution: default-cli}]
[INFO] Target Path: s3://elasticbeanstalk-glance-was-20140113/glance/glance-was-snapshot-20140114144704.war
[INFO] Uploading artifact file: /Users/neigie/Dev/works/glance_was/target/glance-was-snapshot.war
100.00% 33 MiB/33 MiB Done
[INFO] Artifact Uploaded
[INFO] [beanstalk:create-application-version {execution: default-cli}]
[INFO] SUCCESS
[INFO] * sourceBundle: {S3Bucket: elasticbeanstalk-glance-was-20140113, S3Key: glance/glance-was-snapshot-20140114144704.war, } [class: S3Location]
[INFO] * versionLabel: 20140114144704 [class: String]
[INFO] * description: Update from beanstalk-maven-plugin [class: String]
[INFO] * applicationName: glance-was-20140113 [class: String]
[INFO] * dateCreated: Tue Jan 14 14:47:32 KST 2014 [class: Date]
[INFO] * dateUpdated: Tue Jan 14 14:47:32 KST 2014 [class: Date]
[INFO] [beanstalk:update-environment {execution: default-cli}]
[INFO] Looking up for glance-was-20140113.elasticbeanstalk.com
[INFO] Will wait until Tue Jan 14 14:49:33 KST 2014 for environment e-3amtfsmdxp to get into !Updating
[INFO] ... as well as having domain glance-was-20140113.elasticbeanstalk.com
[INFO] Environment Detail:com.amazonaws.services.elasticbeanstalk.model.EnvironmentDescription@73c2a0d9[environmentName=glanceWas20140113-env,environmentId=e-3amtfsmdxp,applicationName=glance-was-20140113,versionLabel=20140113125505,solutionStackName=64bit Amazon Linux 2013.09 running Tomcat 7 Java 7,templateName=<null>,description=glanceWas20140113-env,endpointURL=awseb-e-3-AWSEBLoa-1CLLKCE71CTNA-2019779659.us-west-1.elb.amazonaws.com,cNAME=glance-was-20140113.elasticbeanstalk.com,dateCreated=Mon Jan 13 11:47:39 KST 2014,dateUpdated=Tue Jan 14 14:43:08 KST 2014,status=Ready,health=Green,resources=<null>]
[INFO] SUCCESS
요약
[INFO] * versionLabel: 20140113125505 [class: String]
[INFO] * status: Updating [class: String]
[INFO] * applicationName: glance-was-20140113 [class: String]
[INFO] * endpointURL: awseb-e-3-AWSEBLoa-1CLLKCE71CTNA-2019779659.us-west-1.elb.amazonaws.com [class: String]
[INFO] * health: Grey [class: String]
[INFO] * dateUpdated: Tue Jan 14 14:47:34 KST 2014 [class: Date]
[INFO] * environmentId: e-3amtfsmdxp [class: String]
[INFO] * solutionStackName: 64bit Amazon Linux 2013.09 running Tomcat 7 Java 7 [class: String]
[INFO] * CNAME: glance-was-20140113.elasticbeanstalk.com [class: String]
[INFO] * description: glanceWas20140113-env [class: String]
[INFO] * dateCreated: Mon Jan 13 11:47:39 KST 2014 [class: Date]
[INFO] * environmentName: glanceWas20140113-env [class: String]
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESSFUL
[INFO] ————————————————————————————————————
반영된 화면
- 화면을 보면 알수 있듯이 특정 버전을 찍어서 deploy 버튼을 누르면 반영된다.
- 반영되는데 대략 5~10분 정도 걸리는 듯 하다.
7. 추가로 할 것은 무엇인가?
- DB가 필요하다면 RDS 를 생성하면 된다.
- DB의 경우는 프로젝트 별로 워낙 상이하여 default환경에는 포함하지 않았다고 기술되어 있다.
- 실제로 auto scaling이 되는지, CloudWatch는 동작하는 지 서비스를 계속 써봐야 알 듯 하다.
8. 도메인을 당연히 바꿔야 할텐데?
- AWS Route 53을 써서 forwarding 가능.
- http://aws.amazon.com/ko/route53/
http://docs.aws.amazon.com/elasticbeanstalk/latest/dg/customdomains.html 에 더 잘 나와 있음. 어차피 나도 써야 하니 또 올리겠지만, 실제 예제가 필요하다고 하는 사람 많으면 또 올리는 걸로!













