이 글은 이동욱 님의 스프링 부트와 AWS로 혼자 구현하는 웹 서비스를 읽고 정리한 글입니다.
내용보다 중요한 점, 추가적으로 알아본 것 등을 위주로 적었습니다.
http://www.yes24.com/Product/Goods/83849117
6장 AWS 서버 환경을 만들어보자 - AWS EC2
보통 AWS에서 가장 많이 쓰는 서비스는 EC2이다. 거기에 데이터베이스 RDS와 저장공간 S3까지 묶어 Elastic Beans로 많이 사용한다.
이 중 EC2를 실제로 만들고 실습한다.
EC2 인스턴스 생성
책에서는 아마존 리눅스 1 AMI를 사용했지만, 현재는 해당 AMI는 보이지 않고 아마존 리눅스 2만 보였다. 그리고 아마존 리눅스가 좋다고 나와있지만, Ubuntu를 실제에서는 더 많이 사용하는 것으로 보인다. 하지만 그러면 EC2에 접근해서 사용해야 하는 명령어 등이 책과 달라지므로 신중해야 할 것 같다.
보안 그룹
EC2에는 보안 그룹을 할당해야 한다. 다른 서비스(RDS 등)에서도 쓴다.
여기에는 인바운드 규칙과 아웃바운드 규칙이 있는데, 여기서 허용된 곳에서만 접속하거나 나갈 수 있다.
즉 인바운드 규칙에 내 IP를 써야 나의 IP에서 인스턴스에 접속할 수 있고, 아웃바운드에 내 IP를 써야 결과를 가져올 수 있다.
EC2 인스턴스 생성 후 이 서버에 접속하는 IP가 있을 것이다. 인스턴스를 생성할 때마다 IP는 변하면서 생성되게 되는데, 이것은 매우 귀찮다. 따라서 나에게 고정된 IP를 발급해줬으면 하는데, 이게 탄력적 IP (Elastic IP)이다. 이것을 발급받고 EC2 인스턴스에 연결하면 해당 퍼블릭 IP로 인스턴스에 접근할 수 있게 된다.
예전에 여기서 문제를 겪었던 적이 있다. AWS도 탄력적 IP를 무제한 공급해줄 수는 없으니 비정상적이거나 과도한 탄력적 IP에 대해서 요금을 부과한다. 예를 들어, EC2에 연결되어 있지 않거나 연결된 EC2가 실행중이지 않는 탄력적 IP는 쓰지도 않는데 어떤 사용자에게 할당되어 있는 상태인 것이다. 이에 대해서 AWS는 요금을 부과한다. 또한, 한 EC2에 여러 탄력적 IP를 연결한 경우도 요금을 부과한다. 벌금....느낌..?
만약 AWS를 처음 써 본 초심자가 실습을 마치고 인스턴스를 쓰지 않으니까 종료하고 컴퓨터를 끄면 다음날 아침 요금이 부과되고 있는 자신의 마스터/비자 카드를 볼 수 있는 것이다. 가격은 다음의 페이지에서 확인할 수 있다. https://aws.amazon.com/ko/ec2/pricing/on-demand/#Elastic_IP_Addresses
비싸진 않다... 200시간에 1달러정도 나온다.
EC2 서버에 접속하기
이제 생성한 EC2 서버로 접속을 해야 하는데 보안 그룹을 생성할 때 발급받았던 pem키를 사용한다.
Windows에서는 PuTTy 라는 프로그램을 사용한다. 다른 서버나 컴퓨터에 SSH 등의 프로토콜로 원격 접속할 때 사용하는 프로그램이다. PuTTy는 많이 써봤는데, 이번에는 PuTTygen 이라는 프로그램도 사용했다. pem 키를 ppk 파일로 변환해야 PuTTy 용 비밀키가 탄생하는 것 같다. 이를 생성하기 위한 프로그램이 PuTTygen(PuTTy generator) 이다.
여기서 접속이 안된다면 다음의 사항들을 체크해보자.
- HostName 값이 정확히 탄력적 IP로 되어있는지 확인
- EC2 인스턴스가 running 상태인지 확인
- EC2 인스턴스의 보안그룹 -> 인바운드 규칙에서 현재 본인의 IP가 등록되어 있는지 확인
서버 생성 시 꼭 해야 할 설정들
책에서는 아마존 리눅스 1 서버를 받았고, 나는 아마존 리눅스 2 서버를 받았다. 하지만 책과 다른 내용은 없었다. 해야하는 설정은 3개이다.
JAVA 설치
아마존 리눅스에 프로젝트에서 사용하던 Java를 설치해야 한다. 책에서는 Java8 을 깔았는데, 나는 Java11을 사용한다. 따라서 책과 같이 할 수 없다. 특히 아마존 리눅스 서버에서 사용하는 yum에는 설치가능한 JDK가 1.8까지만 존재하기 때문에 JDK 11을 설치하기 위해선 다른 방법을 이용해야 한다. Amazon에서 제공하는 OpenJDK인 Amazon Coretto를 다운받아 간편하게 설치할 수 있습니다.
자세한 내용은 다음 게시글을 참고하자. https://pompitzz.github.io/blog/Java/awsEc2InstallJDK11.html#jdk-%E1%84%89%E1%85%A5%E1%86%AF%E1%84%8E%E1%85%B5
타임존 변경
EC2의 기본 타임존은 UTC, 즉 세계 표준 시간이다. 따라서 시간을 맞춰야 하는데, 다음의 명령어를 수행한다.
- sudo rm /etc/localtime
- sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime
Hostname 변경
여기서 애를 굉장히 많이 먹었다. 서버가 어느 서비스인지 표현하기 위해 HOSTNAME을 변경해야 한다. 하지만 아마존 리눅스 버전의 차이인지 책과는 내용이 달랐다. 다음의 AWS 공식문서를 참고하자. https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/set-hostname.html
7장 AWS에 데이터베이스 환경을 만들어보자 - AWS RDS
이제 데이터베이스도 aws로 돌려보자. 이에 해당하는 서비스가 RDS 인데, 단순히 제공뿐만 아니라 여러 서비스를 제공한다. (근데 어렵...)
RDS는 EC2와 같이 프리티어에서 750시간을 무료로 사용할 수 있다. 한 달이 최대 744시간정도이니 하나의 EC2와 RDS에 대해서는 요금이 부과될 일이 없다.
RDS 인스턴스 생성하기
책에서는 Maria DB를 사용한다. 몇 페이지에 걸쳐 Maria DB를 사용하는 것을 설득하니, 사용 하지 않을 수가 없다. 사실 뭐를 선택하든 크게 다를 것이 없다.
인스턴스를 생성할 때 중요한 것들이 몇 가지 있다.
- DB 인스턴스 식별자 : 현재 AWS 리전의 내 계정안의 DB 끼리는 이것이 중복될 수 없다. 즉 다른 사용자와는 중복될 수 있으니 맘 놓고 원하는 식별자를 입력하자.
- 마스터 사용자 이름/암호 : 이를 통해서 DB에 접근하니 꼭 외워두어야 한다. 마스터 암호는 나중에 수정 페이지에서 변경할 수 있지만, 사용자 이름은 아무리 찾아도 보이지 않았다.
- 데이터베이스 이름 : 왜인지 처음 생성할 땐 이 옵션이 뜨지 않아서 데이터베이스를 삭제하고 다시 생성했다. 이것을 입력하지 않으면 실제 쓸 스키마가 생성되지 않으니 조심하자.
이제 2가지를 설정하면 실제로 연결해서 쓸 수 있다. 2가지는 파라미터 그룹과 보안 그룹이다.
파라미터 그룹 설정
EC2를 생성하면 해야 했었던 설정이 3가지 있었다. 여기도 마찬가지로 3가지를 설정해야 한다. 책을 보고 그대로 하면 된다. 설정해야할 것들을 설정한 파라미터 그룹을 내 RDS에 넣도록 수정해주면 첫 번째 설정은 완료이다.
보안 그룹 설정
아까 EC2를 설정했던 보안 그룹과는 다른 보안 그룹을 설정한다. 데이터베이스에 EC2 인스턴스는 접근이 가능해야 한다. 따라서 RDS에서 쓰는 보안 그룹의 인바운드 규칙에 EC2 인스턴스에서 쓰는 보안 그룹을 넣어준다. 또, 내 컴퓨터에서도 접근하면서 테스트해야 하니 내 IP도 넣어준다.
이 때, 유형은 MySQL/Aurora 로 해야 한다. (EC2는 SSH로 했었다.)
즉, EC2 보안그룹으로는 SSL로 접속할 수 있는 것이고 그 EC2에서 RDS로 접근할 수 있는 것이다. 그리고 내 컴퓨터에서 직접 RDS로 접근할 수도 있는 것이다.
내 PC에서 RDS에 접속하기
IntelliJ에 Database Navigator 플러그인을 설치하고, 이걸 이용해서 RDS에 접속한다. + 버튼을 눌러 RDS 접속 정보를 등록해야 하는데, 이 때 아까 설정했던 마스터 유저 이름과 비밀번호가 쓰인다.
SQL Console 도 사용하면서 책을 따라가며 테스트해보자. 이렇게 IntelliJ 에서 원격 DB인 RDS를 다루는 능력이 뛰어난 게 정말 중요할 것 같다.
IntelliJ에서 모두 확인하고 PuTTy에서도 RDS에 정상적으로 접속되는 것을 볼 수 있다.
'스프링부트와 AWS로 혼자 구현하는 웹 서비스' 카테고리의 다른 글
08장 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - EC2 서버에 프로젝트를 배포해 보자 (0) | 2023.02.10 |
---|---|
03장 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - 스프링 부트에서 JPA로 데이터베이스 다뤄보자 (0) | 2023.01.20 |
02장 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - 스프링 부트에서 테스트 코드를 작성하자 (0) | 2023.01.20 |
01장 스프링 부트와 AWS로 혼자 구현하는 웹 서비스 - 인텔리제이로 스프링 부트 시작하기 (0) | 2023.01.13 |