
1. VPC 및 서브넷 구성
- vpc: 최소 10.0.0.0/16
- subnet
- public subnet
- 10.0.0.0/24
- 10.0.10.0/24
- private subnet (web)
- 10.0.1.0/24
- 10.0.11.0/24
- private subnet (was)
- 10.0.2.0/24
- 10.0.12.0/24
- private subnet (db)
- 10.0.3.0/24
- 10.0.13.0/24
- - nat gateway
- 10.0.10.0/24에 위치
- ex-alb
- public에 위치
- ex-alb 타겟: apache2.4 ASG
- private subnet (web)에 위치
- in-alb
- private에 위치
- in-alb 타겟: tomcat8.5 ASG
- private subnet (was)에 위치
- aurora db
- private subnet (db)에 위치
2. NAT 게이트웨이 설정
- 퍼블릭 서브넷에 NAT 게이트웨이를 배치하고, 사설 서브넷의 라우팅 테이블을 업데이트하여 퍼블릭 인터넷을 통한 아웃바운드 트래픽을 NAT 게이트웨이로 라우팅
2-2. 라우팅테이블
- 대상: vpc cidr, 대상: local (= 이 트래픽은 같은 VPC 내에서 유지)
- 대상: 0.0.0.0/0, 대상: nat게이트웨이 id (= 0.0.0.0/0은 인터넷을 의미하는데, nat만이 인터넷으로부터의 통로가 되어 프라이빗 쪽으로 인터넷 트래픽을 보내주겠다는 의미)
3. 보안 그룹 및 NACL 설정: 각 서브넷과 연관된 보안 그룹과 네트워크 ACL을 설정합니다. 이는 서브넷의 리소스에 대한 액세스를 제어합니다.
4. EC2 인스턴스 설정
- EC2 인스턴스를 생성하고 적절한 서브넷과 보안 그룹에 연결
5. ASG 및 Launch Configuration 설정
- 웹과 WAS 계층을 위한 Auto Scaling Group을 설정. ASG를 생성하기 전에 Launch Configuration을 생성하여 ASG가 사용할 인스턴스를 정의해야함.
6. RDS 설정
7. ALB 설정
- 두 개의 ALB를 설정. 하나는 퍼블릭 서브넷에 위치한 외부 ALB이며, 이는 인터넷에서 들어오는 트래픽을 웹 계층의 인스턴스로 라우팅하고, 다른 하나는 사설 서브넷에 위치한 내부 ALB이며, 이는 웹 계층에서 WAS 계층으로의 트래픽을 라우팅.
- https://docs.aws.amazon.com/ko_kr/autoscaling/ec2/userguide/attach-load-balancer-asg.html
8. Target Group 설정
- ALB의 각 타겟 그룹을 설정. 이는 ALB가 트래픽을 전달할 인스턴스를 결정하는 데 사용.
9. Application Deployment
- 마지막으로, 웹과 WAS 계층에 애플리케이션 코드를 배포. 이 경우 Apache 서버와 Tomcat 서버에 mod_jk 또는 mod_proxy를 설정하여 WAS 계층으로의 트래픽 라우팅을 구성.
# 그 외 읽어볼만한 글
- https://sweetysnail1011.tistory.com/57
- https://sweetysnail1011.tistory.com/59
- https://hanrabong.com/entry/AWS-Public-Subnet-Private-Subnet-ALB-ASG-%EB%A5%BC-%EC%9D%B4%EC%9A%A9%ED%95%9C-%EC%84%9C%EB%B2%84-%EC%95%84%ED%82%A4%ED%85%8D%EC%B3%90-%EA%B5%AC%EC%B6%952-AutoScaling-Group-%EB%A7%8C%EB%93%A4%EA%B8%B0
- https://aws.amazon.com/ko/blogs/compute/re-platform-java-web-applications-on-aws/
- gcp로 같은 작업한 사례: https://seonggi.kr/148
# 추가 첨부사항
## 메이븐 배포가 뭔지 java로 jar을 실행하는게 맞는지
- Maven이란?
Apache Maven은 자바용 프로젝트 관리 도구입니다. 자바 프로젝트의 라이프사이클에 포함되는 테스트들을 관리 및 지원해 주고, Build를 자동화 해 주는 일종의 빌드 툴을 말합니다.
쉽게 말하면 라이브러리의 관리(의존성 관리)를 용이하게 해 주고, 빌드 절차를 간소화 시켜주는 역할을 합니다.
예를 들어, pom.xml 파일에 필요한 라이브러리를 정의할 경우 Maven이 네트워크상에서 알아서 라이브러리를 자동으로 다운받아 줍니다.
최근 안드로이드 스튜디오에서 적용하고 있는 Gradle도 이러한 관리 툴의 일종입니다.
- 읽어보실만한 글: https://www.devkuma.com/docs/maven/maven-jar-plugin-%EC%8B%A4%ED%96%89-%EA%B0%80%EB%8A%A5%ED%95%9C-jar-%EC%83%9D%EC%84%B1/