EC2에 Spring Cloud 아키텍처 배포하기
안뇽.. 요즘 회사에서 도입중에있는 Spring Cloud 를 EC2에 구축하는 실습을 정리해보았다.. !
미리 써두었던 것에 설명만 조금 추가해서 올려봄
EC2 생성하기
EC2란?
AWS에서 제공하는 가상 컴퓨팅 환경이다. 로컬에서 서버를 가동시키려면 컴퓨터를 24시간 하루종일 가동시켜야 한다. 그럴 경우, 컴퓨터가 고장이 나거다 셧다운 될때 사용자가 서비스를 이용하지 못하는 비상 사태가 발생할 수 있다. 이런 경우를 방지해서 AWS에서 EC2 인스턴스를 빌려와 자동 증설 및 복제를 가능하게 하여 서버를 안정적이게 운영할 수 있다.
(더 많은 유용한 기능은 아래 문서 참고)
https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/concepts.html
AWS 사이트에서 EC2 콘솔로 들어가서 EC2 생성하기를 눌러주고 인스턴스를 만들어준다.
- 인스턴스 유형은 t2로 시작하는 걸로 선택해주자. 별 이유는 없고 프리티어여서 무료이기 때문임.
- 키 페어를 생성해서 등록해주자. 생성한 후 생기는 *.pem 파일은 EC2에 접속할때 필요하니 찾기 쉬운데에다가 넣어두기.
- 추후 개인키로 ssh 접속 및 사용자 관리를 할 수 있다.
- 주의할 점
- 인스턴스 타입이 프리티어 모델인 t2로 시작할 경우, 사용자가 많기 때문에 가끔 제대로 작동하지 않는 이슈가 발생할 수 있다. -> 과금 폭탄이 두렵지 않다면 t2를 제외한 다른 모델을 사용해보자.
- 인스턴스 타입이 프리티어 모델인 t2로 시작할 경우, 사용자가 많기 때문에 가끔 제대로 작동하지 않는 이슈가 발생할 수 있다. -> 과금 폭탄이 두렵지 않다면 t2를 제외한 다른 모델을 사용해보자.
- 보안 그룹 설정하기. AWS는 리전마다 디폴트로 VPC와 보안그룹등을 미리 생성해둔다. 그냥 default 찾아서 넣어주자.
- 나중에 default 보안그룹을 들어가보면 인바운드 그룹에 모든 요청을 허용되어 있을 것이다. 과금 폭탄을 받지 않기 위해서는 ssh 포트만 열어두자.
이후 다른 옵션은 무시하고 [생성하기] 클릭
탄력적 IP 연결하기
요금을 조금이라도 아끼기 위해서 퇴근시간이 되면 인스턴스를 중지하고 다음날와서 다시 시작시키곤 했는데,
그렇게하면 DNS가 계속해서 변경이 되어서 코드 쪽에 호스트도 계속 변경해주어야 하는 사태가 생긴다.
이를 방지하기 위해 탄력적 Public IP를 할당시켜서 IP를 고정시켜두자.
[할당] 버튼 눌러주면 IP가 생성이 된걸 볼 수 있고 새로 생긴 IP를 누르고 탄력적 IP 주소 연결을 누른뒤 아까 만든 EC2 인스턴스와 연결해주기
EC2에 SSH로 접속하기
Mac의 리눅스 bash 쉘과는 달리, window의 경우 ssh 접속을 위한 툴들을 이용해야 한다. 하지만 config 파일 작성을 통해 파워쉘에서 ssh 접속을 할 수 있는 방법을 찾았다!
필요한 것 : powerShell 최신버전, *.pem 파일 (개인키)
Config 파일 작성하기
- C://users/사용자/.ssh 폴더 내부에 config 파일을 작성하자. 확장자는 없다.
- 그리고 개인키 파일도 .ssh 폴더로 옮겨주자.
Host aws_ec2
HostName {DNS 이름}
User {EC2 사용자 이름}
IdentityFile ~/.ssh/{.pem 이름}
ssh 명령어로 접속하기
파워쉘에서 ssh 명령어로 Host 이름으로 지정한 EC2로 접속할 수 있다. 첫 접속시 yes를 입력해야한다.
ssh aws_ec2
EC2에 필요한 라이브러리 설치하기
- 나는 AWS ECR에 올려진 이미지를 pull 받아 도커 컨테이너로 EC2 내부에 띄울 것이기 때문에 도커를 깔아주어야하한다.
- Docker, Docker-Compose 최신버전 설치 및 권한 부여하기. (도커 컴포즈는 필요없는데 혹시 몰라서 설치.. 안해도 됨)
sudo yum update -y
# 인스턴스 모든 패키지 업데이트
sudo yum install docker -y
# Docker 설치
sudo service docker start
# Docker 실행
sudo usermod -aG docker ec2-user
# Docker 그룹에 sudo 추가
sudo chmod 666 /var/run/docker.sock
# Docker 명령어 권한 주기
sudo curl -L [https://github.com/docker/compose/releases/latest/download/docker-compose-$](https://github.com/docker/compose/releases/latest/download/docker-compose-$)(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
# Docker-Compose 최신 버전 설치
sudo chmod +x /usr/local/bin/docker-compose
# 권한 부여
docker-compose version
# 버전 확인
ECR에서 이미지 Pull 받기
도커 허브에서 이미지 풀 받듯이 하면 된다. ECR 주소는 AWS ECR 콘솔로 들어가서 확인할 수 있음.
docker pull {ECR 주소}
도커로 배포하기
원래 하던대로 배포하기..
나는 유레카 서버 -> Spring API gateway -> 유레카 클라이언트 서버 순으로 올려주었다.
docker run --name {컨테이너 이름} -d -p 8080:8080 --restart=always {이미지 이름}
주의해야할 점
1) Eureka Server에 API gateway가 등록이 안될 때
application.properties에서 eureka-client에서 유레카 서버 호스트를 localhost로 하면 등록이 안된다!
EC2 인스턴스의 퍼블릭 IP 주소를 여기다가 등록해주자.
localhost로 하면 172.*.*.* 로 private ip 주소로 매핑되는데 프라이빗이라 그런지 등록이 안되는 듯?
eureka:
client:
register-with-eureka: true
fetch-registry: true
service-url:
defaultZone: http://{ec2에 할당된 탄력적 public ip 주소}:8761/eureka
instance:
prefer-ip-address: true
2) EC2에 SSH 접속이 안되는 경우
애초에 EC2에 접속이 안되는 경우가 있다. 이럴때는 VPC로 가서 igw가 정상적으로 라우팅 테이블과 연결되어 있는지 확인해보자. 나같은 경우에는 igw가 엉뚱하게 edge에 연결이 되어있었고, 명시적 서브넷 연결이 안되있었다.
대충 아래와 같은 그림이면 합격..
접속이 안될땐 igw 잘 확인해보기 !!
[고려사항]
- 엣지 연결 해제
- 라우팅 테이블과 igw 연결하기