개인 블로그 프로젝트를 진행하면서 어느정도 API개발을 완성하고
한번 AWS를 이용해 배포를 해보기로 했다.
Elastic BeanStalk
의 경우 코드를 제공해주는 것만으로도 쉽게 앱을 배포할 수 있다는 장점이 있어서 이용했다.
(배포가 처음이어서 추후 EC2 공부 후에 재배포 해보려고 합니다.)
3일간의 삽질을 통해 얻은 팁들이 누군가에겐 좋은 경험이 되었으면 합니다.
먼저 AWS 콘솔에서 Elastic BeanStalk
을 검색 후
좌측의 애플리케이션
을 선택해줍니다.
이후 애플리케이션 생성
버튼을 눌러줍니다.
그리고 원하는 애플리케이션 이름을 지어줍니다.
방금 만든 애플리케이션의 이름에 하이퍼링크
가 걸려있을 거에요.
클릭해서 들어가줍니다.
이후 새 환경 생성
버튼을 클릭해줍니다. (제 애플리케이션 이름이 klog에요)
환경정보도 원하는대로 작성해줍니다.
플랫폼 정보가 중요합니다.
저는 SpringBoot를 이용해 만든 프로젝트를 배포할 것이기 때문에
Java
를 선택하고 플랫폼 브랜치로 자바 17버전인
Corretto 17 running...
을 선택했습니다.
플랫폼 버전은Recommended
된 걸로 이용하면 됩니다.
애플리케이션 코드의 경우 일단은 샘플 애플리케이션으로 해줍니다.
추후 환경 설정을 완료하고 업로드 해줄거에요.
서비스 역할의 경우 처음 배포를 하시는 거면 아무것도 없을거에요.
새 서비스 역할 생성 및 사용
을 클릭해줄게요.
EC2 키 페어를 발급해보겠습니다.
아래의 링크를 클릭해주세요.
https://ap-northeast-2.console.aws.amazon.com/ec2/home?region=ap-northeast-2#Home:
아래의 화면에서 키 페어를 클릭하고, 키 페어 생성
버튼을 눌러주세요.
아래와 같이 이름
을 입력 후 RSA
, .pem
을 체크해주고 키 생성을 해주면 됩니다.
Ed25519
의 경우 윈도우에서는 이용이 불가능하기 때문에RSA
를 선택해 줍시다.
추후 Linux를 이용할 것이기 때문에
.pem
을 선택해 줬습니다.
콘솔에 IAM
을 검색 후 들어와주세요.
아래의 화면에서 역할
을클릭해줍니다.
(우리가 새 서비스 역할 생성을 클릭해서 아래의 역할이 만들어 진 것을 확인할 수 있네요.)
이제 EC2 인스턴스를 만들어봅시다. 역할 생성
버튼을 눌러주세요.
AWS 서비스를 체크해주고, 사용사례에서 EC2
를 선택해주세요.
우리는 EC2 인스턴스를 만들어야합니다.
이후 정책을 추가해야하는데 이부분 정말 중요합니다
꼭 3가지의 정책을 추가해주세요. 안그러면 정책이 없어서 나중에 배포 시 에러 발생합니다.
원하는 이름을 정하고 역할을 생성해주면 됩니다.
다시 돌아와서 아래의 반시계 화살표 모양
새로고침 버튼들을 눌러
EC2 키 페어와 EC2 인스턴스 프로파일을 선택해주세요.
그리고 검토 단계로 건너뛰기를 해줍니다.
나머지 설정은 이제 차근차근 해볼거에요.
Elastic Beanstalk에서 구성 > 네트워킹 및 데이터베이스 > 편집을 누릅니다.
데이터베이스 활성화
토글을 클릭해 주고 아래와 같이 설정 해줍니다.
반드시
db.t3.micro
로 설정해주셔야합니다..
프리티어의 경우micro
옵션은 무료라고 하니 꼭 제대로 설정해주세요.
저는 생각없이 기본 옵션인 db.t3.small로 했다가 3일간 3달러가 부과됐습니다.
요즘 달러 1400원입니다...
사진 보이죠?
심지어Tax
도 부과됩니다... 미국은 국세청의 나라인거 아시죠?? 돈 안내면 큰일납니다...
사용자이름, 암호도 설정해줍니다.
DB 삭제 정책의 경우 별도의 요금이 부과될 수 있기 때문에 삭제
상태 그대로 둡니다.
이렇게 DB를 생성합니다.
이후 콘솔에서 RDS
를 검색하고 왼쪽 사이드바의 데이터베이스
를 클릭합니다.
DB 식별자를 클릭해주세요.
그리고 엔드포인트를 반드시 복사해주세요.
아래의 인스턴스 트래픽 및 크기 조정
탭의 편집
버튼을 클릭해주세요.
환경 유형을 밸런싱된 로드
로 설정해주세요.
그래야 로그파일을 받아서 어느 부분에서 오류가 났는지 확인할 수 있습니다.
t2.nano
로 해주세요. 가장 비용이 적게 듭니다!아래의 업데이트, 모니터링 및 로깅
탭의 편집
버튼을 눌러주세요.
환경 속성을 변경해야합니다.
jdbc:mysql://엔드포인트:포트/DB이름
rds엔드포인트 : 앞서 복사한 엔드포인트를 입력
포트 : 3306
DB이름 : 기본 DB이름은ebdb
입니다.
SERVER_PORT는 왜 5000일까요?
Elastic Beanstalk는 nginx를 역방향 프록시로 사용하여 애플리케이션을 포트 80의 Elastic Load Balancing 로드 밸런서에 매핑합니다. Elastic Beanstalk는 확장하거나 자체 구성으로 완전히 재정의할 수 있는 기본 nginx 구성을 제공합니다.
기본적으로 Elastic Beanstalk는 요청을 포트 5000의 애플리케이션에 전달하도록 nginx 프록시를 구성합니다. PORT 환경 속성을 기본 애플리케이션이 수신 대기하는 포트로 설정하여 기본 포트를 재정의할 수 있습니다.
참고 : https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/java-se-nginx.html
로컬에서 DB에 접근할 수 있도록 로컬의 ip를 허용해야 합니다.
RDS -> 데이터베이스 -> 식별자 클릭
아래의 VPC 보안 그룹 하이퍼링크를 클릭합니다.
보안 그룹 ID 하이퍼링크
를 클릭해줍니다.
인바운드 규칙 편집
을 클릭해줍니다.
유형 : MYSQL/Aurora
소스 : 내 IP를 선택하고 저장을 누릅니다.
★★ 기존의 EC2 보안그룹이 선택되어 있는 것을 삭제하지 마세요!
(아래의 화면을 보면모든 TCP
는 기존에 존재했던 규칙이고,MYSQL/Aurora
는 제가 추가한 규칙입니다.)
이제 MySQL Workbench를 켜고 아래의 MYSQL Connections
의 추가버튼을 누릅니다.
그럼 아래와 같은 창이 뜰텐데 아래의 규칙을 따라 천천히 정보를 입력하고 OK
버튼을 눌러 Connection을 생성해줍니다.
1. Connection Name : 원하는 이름을 적어주면 됩니다.
2. Hostname : 앞서 복사했던 엔드포인트를 붙여넣어줍니다.
3. Username : 앞서 DB설정에서 입력한 사용자 이름을 넣어줍니다.
4. Password :Store in Vault...
버튼을 클릭 후 비밀번호를 입력해줍니다.
만약 application.yml
파일에서 ddl-auto 옵션이 create
또는 create-drop
의 경우 DDL을 직접 입력하지 않아도 됩니다.
참고하면 좋을 글 : hibernate.hbm2ddl.auto 설정
jpa:
hibernate:
ddl-auto: create
Mysql 연동을 위해 아래의 코드를 입력해주세요.
implementation 'com.mysql:mysql-connector-j'
아래의 예시를 따라 url
, username
, password
, driver-class-name
을 datasource에 추가해주세요.
datasource:
url: jdbc:mysql://엔드포인트:3306/ebdb
username: 앞서 설정한 이름
password: 앞서 설정한 비밀번호
driver-class-name: com.mysql.cj.jdbc.Driver
앞서 설명했던 것과 같이 자바 프로젝트에서도 포트를 5000으로 맞춰줍니다.
인텔리제이의 경우 기본 포트가 8080으로 맞춰져 있어 수정해야해요.
그리고 아래의
spring.jpa.properties.hibernate.dialect
의 경우 JPA는 연결되는 DB에 맞게 DB 방언을 설정합니다.
따라서 DB가 바뀔 경우 오류가 발생할 수 있기 때문에 작성하는 것을 권장하지는 않습니다.
server.port=5000
spring.jpa.properties.hibernate.dialect=org.hibernate.dialect.MySQLDialect
Intellij에서 Gradle -> Tasks -> build -> build
경로를 통해 프로젝트를 build해줍니다.
(./gradlew build
로도 빌드 가능)
프로젝트 디렉토리 -> build -> libs -> 프로젝트명-0.0.1SNAPSHOT.jar
경로의 jar파일을 복사해줍니다.
아래의 화면을 따라하면 탐색기에서 파일을 복사할 수 있습니다.
자 이제 업로드를 해봅시다.
업로드 및 배포
버튼을 클릭해 줍니다.
우리가 방금 복사해둔 Jar 파일을 업로드하면 됩니다.
(버전 레이블의 경우 자동으로 설정해주는 값을 이용해도 되고, 본인이 원하는 값으로 변경해도 됩니다.)
EC2의 인바운드 규칙 편집에서 HTTP, HTTPS를 IPV4 0.0.0.0/0
으로 설정하여 누구든 접속이 가능하도록 해야겠죠.
콘솔에 EC2
를 검색 후 보안 그룹
을 선택해줍니다.
설명 index를 보시고, database
가 아닌 것의 보안 그룹 ID 하이퍼링크
를
클릭해주면 됩니다.
이후 인바운드 규칙 편집
버튼을 눌러주세요.
그리고 아래와 같이 SSH
는 본인만 조작이 가능하게 내IP
로 설정을 해주고
HTTP, HTTPS
는 Anywhere-IPv4
로 설정해줍니다.
(저는 이미 완료된 상태에서 다시 선택을 하니 빨간 박스가 뜨네요. 신경 쓰지 않으셔도 됩니다.)
짜잔 공들여? 만든 Index.html
이 잘 출력되는 것을 확인할 수 있네요.
postman을 이용해 api도 작동해보겠습니다.
정말 눈물겹습니다...
마지막으로 Workbench에서 DB도 확인해 볼까요??
이 단순한 쿼리를 실행하려고 하는데 왜이렇게 무서울까요?? 과감하게 실행합니다.
아... 눈물겹습니다... 정말 잘되네요 ㅠㅠ
aws 배포를 하면서 정말 많은 블로그를 봤지만 예상치도 못한 곳에서 엄청 해멨습니다.
저같은 사람이 다시는 생기지 않길 바라면서? 이 글을 씁니다.
반드시 도움이 됐으면 좋겠네요!
그럼 이만 총총...