Series/내가 해본

Elastic Beanstalk 구성 삽질기 - 글쑤시개

Hyunec 2021. 8. 14. 17:46

개발 초기에는 AWS 구성을 하는 것도 일이기에, 지금까지는 프론트 개발자가 백엔드 소스를 받아서 local에서 서버를 띄우는 방식으로 진행했습니다. 물론 매번 DB를 올리지 않아도 되도록 local h2 구성을 해주고, 실행 편의 방법과 README를 제공해줬지만 프론트 개발자 입장에서는 불편한 게 현실이었습니다.

그러던 중 슬슬 목표한 앱의 한바퀴가 성공했기에 AWS 구성을 해보았고 그 기록을 남겨봅니다.

⚠️ 주의!

이 글은 사이드 프로젝트 구성을 위한 삽질기이기에 접근 제어 및 보안이 실무 수준에 미치지 못합니다.
실무에서 고려해야될 사항이나 도움이 될만한 내용은 코멘트했지만,
개인적인 경험에서 나온 기록이기에 선별적으로 이해해주시면 감사하겠습니다.

# 계획

작업 전 배경 지식

  • 실물 장비 기반의 인프라 구성/운영 경험 (IDC)
  • 이미 구성된 AWS 시스템의 운영 경험
  • EC2 - RDS 의 단일 구성 및 배포 경험
  • VPC - 보안그룹 - 라우팅 테이블 등 네트워크에 대한 포괄적인 이해

목표

  • Elastic Beanstalk 으로 EC2 - RDS 로 구성하자
  • 개발 편의성을 우선하며, 고가용성과 보안 등은 차후 과제로 남겨둡니다

AWS 알기 전에는 기초적인 파티션 나누기와 웹 서버 설정부터 심지어 자바 설치까지 직접 했었는데요.
AWS에서는 이런 기본적인 것들은 디폴트 설정으로 제공하거나 GUI 환경에서 간단히 수정할 수 있게 도와줍니다.

공부할 때는 EC2 - RDS를 각각 구성했었지만, 이번 기회에 Elastic Beanstalk을 설정해보려고 합니다.

# Elastic Beanstalk

바로 진행해도 되지만, 저는 서버에 들어가는 것을 좋아하기에 서버에 들어갈 수 있는 '키 페어' 생성을 먼저 해보겠습니다.

1. EC2 키 페어 만들기

모든 서비스 > 컴퓨팅 > EC2 > > 네트워크 및 보안 > 키 페어

저는 EC2 에 직접 연결하는 몇 가지 방법 중 'SSH 클라이언트'로 접근하는 방법을 선호합니다.
익숙한 환경이기도 하고 제일 빠르게 작업할 수 있기 때문이죠.

서버로 직접 연결할 일이 없다면 사용하지 않아도 좋지만 사용을 적극 권장합니다.

2. Elastic Beanstalk 웹 앱 생성하기

AWS 에 로그인하면 바로 첫 화면에 있는  웹 앱 구축  을 따라가서
기본적인 애플리케이션 정보를 입력하고 하단의  추가 옵션 구성  을 선택합니다.

추가 옵션 구성에서 신경 써야 하는 것은 총 4개 입니다.

  • 용량 - EC2
  • 보안 - 키 페어 설정 (중요!)
  • 알림 - 선택 사항으로 추후 Cloudwatch Alert 를 구성해도 됩니다.
  • 데이터베이스 - 데이터베이스는 분리해서 관리하는게 좋다고 생각합니다. 

하나의 애플리케이션에는 복수개의 환경을 구성할 수 있습니다. dev/prod 가 분리되어야 하는 시점에 추가 환경을 구성 예정입니다.
Beanstalk 상태 확인
샘플 페이지 접속 성공!

3. EC2 확인 & 접속

탄력적 IP 사용 확인
모든 서비스 > 컴퓨팅 > EC2 > 인스턴스 > 연결

> chmod 700 Gssg-prod.pem
> ls -lrt Gssg-prod.pem
-rwx------@ 1 choibyunghyeon  staff  1678  8 14 12:18 Gssg-prod.pem

pem의 권한은 700으로 설정합니다.

> ssh -i "Gssg-prod.pem" ec2-user@{'인스턴스 연결' 의 캡쳐 참조}

설정한 키 페어가 있는 경로에서 ssh 명령을 통해 서버에 접속할 수 있습니다.

서버 접속 성공!

# RDS

실무라면

  1. 마스터 사용자 이름과 port를 변경해주는 것이 좋습니다.
  2. private zone에 DB를 위치시키고 ec2를 통해서만 접근 가능하게 포트 포워딩할 것을 권장합니다.
    AWS DocumentDB에서는 Cloud9를 사용할 것을 권장하기도 합니다.

1. 데이터베이스 생성

모든 서비스 > 데이터베이스 > RDS > 데이터베이스 생성

2. 추가 구성 설정

추가 구성에서  '퍼블릭 엑세스 가능' 을 설정해줍니다.

3. 보안 그룹 설정

ec2 에서의 접근 외에도 개발 편의상 내 집에서는 바로 접근할 수 있게 설정합니다.

4. RDS 확인 & 접속

datagrip 등의 툴로 접속 여부를 확인할 수 있습니다.

# 애플리케이션 배포

1. jar(or war) 준비

Beanstalk 은 환경별로 외부 환경 변수를 편리하게 관리할 수 있습니다.
저는 Spring Boot를 사용하기에 yml로 local/prod profile을 구분하고 외부 환경 변수를 주입받게 구성했습니다.

2. 모니터링

> cd /var/log
> tail -f web.stdout.log

AWS의 이벤트나 기본 모니터링이 존재하긴 하지만 콘솔이 더 익숙하기에 서버에서의 모니터링을 준비합니다.

3. Beanstalk 외부 환경 변수 설정

Elastic Beanstalk > 환경 > {환경 이름} > 구성 > 소프트웨어 수정

Beanstalk 환경별로 서로 다른 외부 환경 변수를 운영할 수 있습니다.
위에서는 JDBC 연결을 외부 환경 변수로서 설정했습니다.

서버 기동 성공! 'Started GssgBeApplication in 19.228 seconds'
Swagger 접속 성공!

# 마무리

이전까지는 공통된 서버가 없었으니 에러 대응하기가 참 힘들었는데 이제는 서버가 올라갔으니 편리하게 에러를 봐줄 수 있을 것 같습니다. AWS 덕분에 인프라 작업이 많이 편해지긴 했는데, 그래도 헷갈리는 건 어쩔 수 없네요. 인프라도 디버그가 됐으면 좋겠다

구성도와 다음 계획을 마지막으로 기록하며 글을 마칩니다.

구성도

DB 는 private subnet 에 위치 시켜야겠지만 이번 버전에서는 보안 그룹으로만 제어 합니다.

다음 인프라 작업들..

  • CI/CD 구성 - git branch에 대응하는 CodePipeline
    • 현재는 circleCI로 CI  만 구성
  • 관제 구성 - slack webhook, Cloudwatch Alert
  • 접근 제어 - 지정된 자사 앱에서만 접근할 수 있도록 제어
  • TimeZone 관리
  • HTTPS 설정
  • 코드 품질 관리 - SonarQube 적용
    • 현재는 Codecov로 구성
  • DB 형상 관리 - flyway