안녕하세요~ 배포 관련하여 문의 하나만 드리겠습니다. AWS 구성은 아래와 같습니다….

안녕하세요~
배포 관련하여 문의 하나만 드리겠습니다.

AWS 구성은 아래와 같습니다.

1. EC2 인스턴스 두대로 이중화 되어 있습니다.

2. 각 EC2 에는 Nginx 서버 아래에
API, WEB 두개의 Tomcat 이 띄워져 있습니다.

3. API 서버용 ELB, WEB 서버용 ELB 가 존재하고
api.domain.com 의 CNAME 은 API ELB 의 DNS로,
web.domain.com 의 CNAME 은 WEB ELB 의 DNS 로 설정하였습니다.

우선 1차적으로 위처럼 구성을 하는게 올바른건지, 다른 방법이 있는건지 궁금합니다.

배포 할 때는 아래와 같이 합니다.
1.JENKINS 에서 API 프로젝트 빌드 하고 빌드 후처리로 빌드된 WAR 파일을 EC2 1번서버로 전송한 후 톰캣 서버 STARTUP 합니다.

2.JENKINS 에서 API 프로젝트 빌드 하고 빌드 후처리로 빌드된 WAR 파일을 EC2 2번서버로 전송한 후 톰캣 서버 STARTUP 합니다.

3. 위 과정이 끝나면 aws Load Balancer 메뉴에서 api elb 의 헬스 체크 interval 을 변경합니다.
이 과정에서 의문이 있는데요..

헬스체크 인터벌을 10초로 잡아놔도
인스턴스 Status가 한참 후에나 Inservice 로 바뀝니다. Health Check 의 Interval 을 바꿔줘야만, OutService 에서 Inservice 로 바뀝니다.. 이과정이 너무 귀찮습니다.

4. JENKINS 에서 WEB 프로젝트 빌드 하고 빌드 후처리로 빌드된 WAR 파일을 EC2 1번서버로 전송한 후 톰캣 서버 STARTUP 합니다.

5. JENKINS 에서 WEB 프로젝트 빌드 하고 빌드 후처리로 빌드된 WAR 파일을 EC2 2번서버로 전송한 후 톰캣 서버 STARTUP 합니다.

6. 다시 aws Load Balancer 메뉴에서 web elb 의 헬스 체크 interval 을 변경합니다.

이 과정이 너무 길고 번거롭습니다.
codeCommit, codeDeploy 같은 서비스를 쓰면 자동화가 될 거같긴한데 서울리전에서는 사용할 수 없더라구요~

어떻게 자동화 할 수 있는 방법이 없을까요??

여러분들은 어떻게 하고 계신가요?

beansTalk 도 한번 생각해보고 있긴한데, beansTalk 을 새롭게 구성하려면 ec2 를 새롭게 생성해야하나요?
기존 ec2 를 beansTalk 에 추가시킬수 있는 방법은 없는가요~!?

그리고 beansTalk 이 위와같은 상황의 자동화에 적합한 선택인건가요?

질문이 너무 많아졌네요~ 긴글 읽어주셔서 감사합니다.

14 thoughts on “안녕하세요~ 배포 관련하여 문의 하나만 드리겠습니다. AWS 구성은 아래와 같습니다….

  1. 1차 질문에 대해서 그냥 작은 의견입니다. 너무 신경쓰지 않으셔도 됩니다. 상황에 따라 다를테니까요. 🙂
    인스턴스 각 1대마다 API용과 Web 서비스용 war 2개가 같은 톰캣에 배포되는 상황이라면, 서로 부하에 영향을 주지 않을까요?
    괜찮다면 좀 더 작은 인스턴스 타입을 2개씩 각각 API용, Web용으로 써서 4대로 구성할 것 같습니다.
    성능을 고려해서 구성하셨을테니 그냥 의견 참고만 부탁 드립니다.

  2. Health check interval 관련해서는 Setting 을 새로 고치시면 새로운 setting이 적용되니 당연히 빠르게 InService 상태로 변경이 됩니다.

    Health check setting을 변경 안하신다면 Healthy Threshold 값 만큼 health check가 성공적으로 응답을 받아야 InService로 변하니 시간이 좀 거리는 것 같습니다

  3. 1~2번 과정과 4~5번 과정은 서버를 1차 의견 처럼 분리하신다면 tomcat server를 두번씩 restart 하지 않아도 될 것 같습니다.
    내용을 보고 추측컨데 혹시 Instance 1대에 tomcat 서버가 2개씩 설치되어 있는지요?

  4. 배포 관련해서 정지배포가 가능하다면 위 방법대로 손쉽게 배포 하실 수 있습니다. 만약 항상 InService의 무정지 배포를 하고 싶으시다면, 다른 방법을 구상해야 할 것 같습니다.

  5. 위 같은 상황이라면 아래처럼 배포할 것 같습니다. 아래 과정을 자동화한다면 좋지 않을까요?
    1. 2대중 1대(편의상 A서버)를 ELB에서 제거
    2. A서버에 새 바이너리 배포
    3. A서버 테스트
    4. A서버 ELB에 다시 연결, InService 될 때까지 대기
    5. 나머지 1대(B서버)를 ELB 에서 제거
    6. 2~4번 과정 동일

    물론 위 과정은 어디까지나 간단한 샘플일 뿐이고, 적용하시려는 프로젝트 성향에 맞을지는 검토하셔야 할 것 같습니다.

    예를들어 무조건 동시에 2대가 업데이트 되야 한다면, 위 과정보다 신규 EC2를 2대(C서버 D서버) 생성해서 배포를 한 뒤, ELB에 신규 서버를 붙인 뒤 InService 확인 후 바로 A서버 B서버를 ELB에서 제거할 것 같습니다.

  6. Beanstalk에 기존 ec2를 바로 추가하는건 불가능 한 것 같습니다 ^^; (제가 틀리면 지적해주세요)
    대신, Configuration에서 Custom AMI로 EC2를 구성하게 만들 수 있습니다. Java, Tomcat 이외 별도로 설치되야할 패키지 등이 있다면 일반 EC2에서 셋팅을 마친 후 AMI로 만들고, 해당 AMI를 Beanstalk에 지정하여 사용하시면 될 것 같습니다.

    여담이지만, Beanstalk 기능이 엄청 좋아졌네요….우와.

  7. 이미 그렇게 하실거라 생각하지만,
    배포해야할 서버가 많아지만 많아질 수록, 바이너리를 local pc(or jenkins 서버) -> 각 ec2로 파일전송 하는 시간보다,
    바이너리를 s3에 업로드 하고, 각 ec2에서 내려받아 설치하시는 편이 조금 더 낫습니다. 자동화 하기도 좋구요.

  8. 우선 ELB의 HealthCheck 때문에 문제가 발생하고 있는데요. API WAS건 WEB WAS건 앞단에 ELB가 항상 HealthCheck해도 문제가 없는 Web Server나 HAProxy 등을 설치하는 방법이 있습니다. ELB가 있는데도 구지 왜 Web Server 등을 설치하냐고 할 수 있습니다만 Web Server에 Virtual Host 등을 설정하여 사용하면 구지 코딩하지 않아도 해결할 수 있는 것들이 꽤 많습니다.
    또 하나는 RightScale이라는 회사에서 오신 분들에게 교육을 받은 내용입니다만 신규 Deploy 할 것을 한벌 더 만들어서 테스트 후, ELB에 붙이는 방법입니다. 이럴 경우, 무중단으로 구성이 가능하고 기능 이상이 있을 경우, 이전 인스턴스로 ELB에 Attach 하면 원복도 되므로 무중단으로 Deploy가 가능해 집니다.

  9. 헬스체크에 관해 참고삼아 말씀드리자면,
    전체 헬스 체크시간은 Interval x (Threshold -1)입니다.
    여기에서 특이한점은 첫번째 체크가 Healty상태라면 Threshold값은 무시되고 바로 두번째 체크시 성공하면 ServiceIn이 됩니다. (결국 Threshold 2와 동일)

    Threshold 값이 혹시 너무 크지 않는지도 확인 해보시고,
    타임을바꾸면 바로 되는게… 체크를 다시하기 때문에 첫번째 체크가 성공하는 것이기 때문이 아닐까 싶습니다.

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.