AWS 상세 구성도
AWS 구성에 대한 설명
🔧 전체 아키텍처 설명
1. 외부 접근 및 도메인 관리
- Route 53: DNS 서비스로, 사용자의 요청을 적절한 리소스로 라우팅합니다.
- 인터넷: 사용자 트래픽이 인터넷을 통해 유입되고 Route 53을 통해 로드밸런서로 전달됩니다.
2. VPC (Virtual Private Cloud)
- 전체 네트워크 인프라는 VPC 안에 구성되어 있고, 퍼블릭 및 프라이빗 서브넷으로 구분되어 있습니다.
🌍 퍼블릭 서브넷
- Bastion Host: 관리용 SSH 접속을 위해 사용되며, 외부에서 내부 리소스 접속을 중계합니다.
- NAT Gateway: 프라이빗 서브넷의 인스턴스가 인터넷에 접근할 수 있도록 합니다.
- Application Load Balancer (ALB): 외부 요청을 Auto Scaling 그룹 내 인스턴스로 분산시켜 줍니다.
🔒 프라이빗 서브넷
- Jenkins: CI/CD 도구로 GitHub에서 푸시된 코드를 감지하여 빌드 및 배포 파이프라인을 실행합니다.
- GitHub → Jenkins: Push/Trigger
- Jenkins → Docker: Build 후 이미지 생성
- Jenkins → ECR(S3 심볼로 표시됨): Docker 이미지 업로드
- Auto Scaling Group: 생성된 Docker 이미지를 기반으로 애플리케이션 인스턴스를 자동 확장 및 축소합니다.
🐳 Docker 연동
- GitHub에서 소스코드 푸시 → Jenkins가 감지
- Jenkins가 Docker 이미지를 생성 → Private 서브넷에 배포
🗄️ Database Subnet
- 데이터베이스는 별도의 서브넷에 존재하며, 보안 및 접근 제어를 강화한 영역입니다.
🔐 VPN Gateway
- 사내 네트워크와 AWS 간 보안 연결을 위해 VPN 게이트웨이를 사용하고 있습니다.
✅ 요약
- CI/CD 파이프라인 구축 (GitHub + Jenkins + Docker)
- 보안 및 확장성 고려한 AWS 인프라 구성 (VPC, 서브넷, ALB, Auto Scaling)
- 내부와 외부 모두에 대응 가능한 구조 (VPN + Bastion + NAT)
- DNS 및 트래픽 분산 (Route 53 + ALB)
프로젝트 구성 단계
정책 및 역할 생성
# 정책 생성: user18-code-deploy-ec2-policy
# 역할 생성
- user18-code-deploy-ec2-role
- user18-code-deploy-service-role
bastion- instance 생성 - (Private Subnet과 통신을 위해서)
보안 자격 증명 구성
1. 액세스 키 만들기
절대 액세스 키를 분실하거나, 공유되어서는 안된다. .csv 파일 다운로드를 하고 나서 잘 챙겨둬야한다. 아래는 AWS CLI 도구를 설치 및 사용하는 방법이기 때문에 참고하면 좋을 것 같다.
Jenkins EC2 생성
1. 젠킨스 인스턴스 생성
이름: user18-jenkins-ec2
OS: Ubuntu 22.04
인스턴스 : t2.micro
보안그룹 : SSH, WEB
스토리지 : 20GB
설치 소스 : https://github.com/sjh4616/aws-project
# aws-Client로 ssh로 Jenkins 접속 & 도커 설치 (접속 전 config 파일에서 ip 주소 바꾸기)
ubuntu@ip-172-31-73-69:~/aws-project$ git --version
ubuntu@ip-172-31-73-69:~/aws-project$ git clone https://github.com/sjh4616/aws-project
ubuntu@ip-172-31-73-69:~/aws-project$ cd aws-project/
ubuntu@ip-172-31-73-69:~/aws-project$ ls
ubuntu@ip-172-31-73-69:~/aws-project$ cat Dockerfile
ubuntu@ip-172-31-73-69:~/aws-project$ clear
ubuntu@ip-172-31-73-69:~/aws-project$ cat install-docker.sh
ubuntu@ip-172-31-73-69:~/aws-project$ chmod +x install-docker.sh
ubuntu@ip-172-31-73-69:~/aws-project$ sh ./install-docker.sh
ubuntu@ip-172-31-73-69:~/aws-project$ clear
ubuntu@ip-172-31-73-69:~/aws-project$ exit
ubuntu@ip-172-31-73-69:~/aws-project$ ssh Jenkins
ubuntu@ip-172-31-73-69:~/aws-project$ docker version
# Jenkins에 Container 설치
ubuntu@ip-172-31-73-69:~/aws-project$ cd aws-project/
ubuntu@ip-172-31-73-69:~/aws-project$ docker compose up -d --build
ubuntu@ip-172-31-73-69:~/aws-project$ docker images
ubuntu@ip-172-31-73-69:~/aws-project$ docker ps -a
# Jenkins에 Docker 설치
ubuntu@ip-172-31-73-69:~/aws-project$ docker exec -it jenkins bash
root@7519c2b70850:/# cat command-line
root@7519c2b70850:/# export DOCKER_GID=1000
root@7519c2b70850:/# apt install zip unzip -y
root@7519c2b70850:/# groupadd -g ${DOCKER_GID:-1000} -f docker
root@7519c2b70850:/# usermod -aG docker jenkins
ubuntu@ip-172-31-73-69:~/aws-project$ docker logs jenkins
ubuntu@ip-172-31-73-69:~/aws-project$ docker version
ubuntu@ip-172-31-73-69:~/aws-project$ cd aws-project/
ubuntu@ip-172-31-73-69:~/aws-project$ ls
ubuntu@ip-172-31-73-69:~/aws-project$ cat docker-compose.yaml
# aws CLI 계정 등록
ubuntu@ip-172-31-73-69:~/aws-project$ apt install less -y
ubuntu@ip-172-31-73-69:~/aws-project$ aws configure
AWS Access Key ID [None]:
AWS Secret Access Key [None]:
Default region name [None]: ap-northeast-2
Default output format [None]: json
ubuntu@ip-172-31-73-69:~/aws-project$ aws sts get-caller-identity 확인
Jenkins 설정
1. Tools 설정 : Java(name: JDK17 / JAVA_HOME: opt/java/openjdk), Maven(name : M3)
2. Plugin 설치
- Publish over SSH
- github integration
- Docker
- Docker Pipeline
- docker-build-step
- AWS CodeDeploy
- Pipeline : Aws Steps
- Pipeline : stage view
- Maven Integration
- Pipeline Utility Steps
- Pipeline Stage View
로드밸런서 생성
로드밸런스 생성을 해줬다. 이제 로드밸런스를 통해 auto scaling group 과 jenkins에 접속 하는 방법은 두가지 이다. 하나는 두개를 포트로 구분시켜서 접속하는 방법이 있고, 또 다른 방법은 도메인 헤더를 가지고 접속하는 방법이 있는데, 이번 포스팅에서는 도메인 헤더를 가지고 접속하는 방법을 이용해보겠다. 이제는 도메인 헤더를 통해 접속하기 위해 설정해볼 것이다.
로드 밸런서 생성
이름 : user18-alb
가용영역 : public 1a, public 2c
대상그룹 : user18-jenkins-target-group(상태검사x)
Github 키 생성
1. VM box에서 aws-client에서 git-key 생성
ubuntu@aws-client:~/.ssh$ ssh-keygen -t rsa -C "내 깃허브 이메일 주소"
이름 : git-key
2. 공개키 등록하는 방법
ubuntu@aws-client:~/.ssh$ cat git-key.pub
3. config 파일에서 github 등록
# 깃허브에 공개키 등록 완료
# 깃허브 spring-petclinic private로 설정해주기
이제 키가 없으면 접속이 안된다.
젠킨스에 github 접속, aws Cridential 설정
1. github 접속 만들기
ubuntu@aws-client:~/.ssh$ cat git-key
2. 젠킨스 aws Credential 설정
원본 ec2 만들기
[원본 인스턴스 생성]
- 이름 : user18-app-ec2
- OS : Ubuntu 22.04
- VOC : 502
- 서브넷 : public 1a
- 인스턴스 : t2.micro
- 기존 보안 그룹 선택
- 보안그룹 : SSH, WEB
# config 없이 바로 들어가는 방법
ubuntu@aws-client:~/.ssh$ ssh -i user18-key.pem ubuntu@43.201.51.22
ubuntu@ip-172-31-0-245:~$ sudo apt install vim git curl -y
# 도커 설치
ubuntu@ip-172-31-0-245:~$ vim install-docker.sh
ubuntu@ip-172-31-0-245:~$ chmod +x install-docker.sh
ubuntu@ip-172-31-0-245:~$ ./install-docker.sh
# CodeDeploy-agent 설치
ubuntu@ip-172-31-0-245:~$ sudo apt install -y ruby
ubuntu@ip-172-31-0-245:~$ wget https://aws-codedeploy-ap-northeast-2.s3.amazonaws.com/latest/install
ubuntu@ip-172-31-0-245:~$ chmod +x ./install
ubuntu@ip-172-31-0-245:~$ sudo ./install auto
ubuntu@ip-172-31-0-245:~$ sudo service codedeploy-agent status
# Spring-petClinic application 인스턴스 - 원본 이미지로 생성
시작 템플릿 생성
이름 : user18-app-launch-template
설명 : initial version
내 AMI : user18-app-image
인스턴스 : t2.micro
키페어 : user18-key
서브넷 : 시작템플릿에 포함하지 않음
보안그룹 : SSH, WEB
고급세부 정보
- IAM 인스턴스 프로파일 : user18-code-deploy-ec2-role
Auto Scaling Group 생성
# spring-petclinic으로 가는 대상 그룹 생성 - 상태검사 x / 인스턴스랑 연결 안함.
로드밸런서 생성
리스너 및 규칙을 보면 80으로 들어가면 jenkins-target으로 들어가는데, 우리는 이전에 도메인으로 들어가게 하기로 했다.두개로 쪼개야한다.
저 도메인으로 접속을 하면 대상그룹에서 spring-petclinic으로 가라는 뜻이다. 기본값일 때는 jenkins로 가고 아니면 spring-petclinic으로 가라는 뜻이다.
기본값 규칙 변경
젠킨스로 가는게 없어졌으니 만들어준다.
이렇게 도메인 헤더로 접속을 하였다. 다음으로 router 53을 통해 레코드를 만들것이다.
auto scaling group으로 연결하는 spring-petclinic 대상 그룹 생성
'Cloud(AWS)' 카테고리의 다른 글
[AWS | Jenkins(dock)] AWS 구성 - 2 (0) | 2025.01.20 |
---|---|
CodeDeploy 배포 (0) | 2025.01.06 |
[AWS] CodeDeploy 구성 (0) | 2024.12.30 |
[AWS] AWS Client 만들기 (0) | 2024.12.30 |
[AWS] VPC 생성 (0) | 2024.12.23 |