Backend boot camp/Session4
[Cloud] 운영 환경 구성
by orioncsy
2022. 12. 9.
AWS Regulations
AWS 규정
클라우드 서비스 장점
- 신속한 인프라 구축
- 유연한 인프라 관리
- 트래픽 폭주 대응
- 글로벌 서비스
- 강한 보안, 장애 없는 서비스
- 합리적 가격
AWS 기능
Cloud Computing
기존 서버 방식
- 전산실에 컴퓨터를 배치하고 인터넷을 연결하여 서비스 제공
- 같은 공간에 더 많은 컴퓨터를 사용하거나 성능을 높이는 방식을 사용
기존 서버 방식 문제점
- 주기적인 관리가 필요
- 물리적인 공간 부족
- 거대 기업이 데이터 센터를 세우고 자원을 대여하는 서비스 등장
- 서버의 자원, 공간, 네트워크 환경 제공을 빌려 사용하는 클라우드 컴퓨팅 등장
클라우드 등장
- 데이터 센터에서는 서버 자원의 공간, 네트워크 환경 제공(온프레미스)
- 클라우드는 데이터 센터와 달리 가상 컴퓨터를 대여
- 클라우드 서비스는 기존 온프레미스 방식과 달리 장점 존재
- 필요할 때마다 컴퓨팅 능력 조절
- 고정 비용이 들어가는 온프레미스와 달리 사용하는 만큼만 지불
- 스냅샷을 이용해 다른 컴퓨터로 즉시 이주 가능
클라우드 환경의 단점
- 운영 환경이 클라우드 제공자에게 종속
- 클라우드 사업자에게 종속되어 클라우드 서비스에 문제가 생기면 영향을 받는다.
클라우드 서비스 제공 범위
- SaaS : Software As A Service 네트워크, 하드웨어, 운영체제, 플랫폼/데이터베이스, 애플리케이션 지원
- PaaS : Platform As A Service 네트워크, 하드웨어, 운영체제, 플랫폼/데이터베이스 지원
- IaaS : Infrastructure As A Service 네트워크, 하드웨어 지원(AWS의 경우 해당)
Deploy
배포(Deployment) 과정
- Development
- 로컬 환경에서 개발 및 테스트
- sample data(더미 데이터) 이용
- 모든 구성원 각자 환경에서 진행
- Integration
- 각자 환경에서 개발된 부분 취합
- 코드 간 conflict가 없는지 확인
- 다른 코드에 문제를 발생시키지 않는지 확인
- Staging
- production 단계와 가장 유사한 환경에서 테스트
- 복제된 실제 데이터를 이용해 테스트
- 관계자들이 검증
- Production
- 개발환경과 구분된 환경
- 실제 데이터 사용
- 실제로 서비스가 제공되는 단계
Development 환경과 Production 환경 차이
- 개발 환경과 production의 환경은 다를 수 있다.
- 환경 설정을 코드와 분리해야 한다.
- 작성한 코드가 다른 환경에서 작동하기 위한 방법
- 절대 경로 대신 상대 경로 사용
- 환경에 따라 포트를 분기할 수 있도록 환경 변수 설정
- Docker와 같은 개발 환경 자체를 통일시키는 솔루션 사용
EC2
Amazon EC2(Elastic Compute Cloud)
- 아마존 웹 서비스에서 제공하는 클라우드 컴퓨팅 서비스
- 원격으로 제어할 수 있는 가상의 컴퓨터 한대를 빌리는 것
- 인터넷을 통해 서버, 스토리지, 데이터베이스 등 컴퓨팅 서비스를 제공
- 비용, 성능, 용량에서 탄력적인 클라우드 컴퓨터 제공
EC2 장점
- 구성하는데 시간이 짧다.
- 다양한 운영체제 선택 가능
- CPU, RAM 용량 구성
Instance
- AWS에서 빌리는 컴퓨터
- 컴퓨터로 할 수 있는 일 가능
- 컴퓨터를 조작하기 위해 네트워크를 통해 제어
- 웹서버를 설치하과 웹 서버를 통해 사용자가 웹 브라우저를 통해 요청하는 서비스 제공
AMI
- Amazon Machine Image는 소프트웨어 구성이 기재된 템플릿
- 운영체제만 깔려있는 템플릿 부터 런타임 설치 템플릿(우분투 + node,js, 윈도우+JVM)까지 제공
- 운영체제, 런타임으로 구성된 setting을 선택 가능
EC2 생성 의미
- AMI를 토대로 운영체제,CPU, RAM, 런타임 구성된 컴퓨터를 빌리는 것
RDS
Relational Database Servcie
- AWS에서 제공하는 관계형 데이터베이스 서비스
EC2 인스턴스에 설치된 DB 엔진 단점
- EC2 인스턴스에 DB를 설치하여 데이터를 관리할 수 있지만 유지 보수에 대한 부담을 해야 한다.
- EC2 인스턴스에서 데이터베이스 관련 자동으로 담당하는 부분이 매우 적기 때문에 데이터베이스 엔진의 설치와 버전 관리, 데이터 백업을 진행해야 한다.
- 가용성, 내구성이 확보되지도 않아 데이터가 유실되는 확률이 커지고 추후 확정도 어렵다.
RDS 장점
- 데이터베이스 유지 보수에 대해서 자동 관리
- 초기 설정만 사용자가 한다.
- 데이터베이스 엔진을 다양하게 선택 가능
S3
Cloud Storage
- 인터넷 공간에 데이터를 저장하는 장소
- 웹 환경이라면 언제 어디서나 파일에 접근 가능
S3: Simple Storage Service
S3 장점
- 확장성이 높아 보다 쉽게 스토리지 규모 확장/축소 가능
- 사용한 만큼만 비용 지불하여 효율적
- 내구성이 높아 저장된 파일을 유실할 가능성이 적어진다.(S3는 99.999999999%)
- 가용성이 높아 저장된 파일을 정상적으로 사용할 시간이 길어진다.(99.99%)
- 리전이란 AWS에서 클라우드 서비스를 제공하기 위해서 운영하는 물리적인 서버 위치
- 가용 영역(Availability Zone)은 리전 안에 존재하는 데이터 센터(IDC)를 의미
- 한 곳의 가용영역이 재난이나 사고가 나도 다른 가용 영역에 백업을 해놓아 문제없이 서버 구동
- 다양한 스토리지 클래스 제공
- standard vs Glacier 클래스
- standard는 범용적인 목적으로 사용, 데이터 빠른 속도로 접근, 데이터 액세스 요청에 대한 처리 속도가 빠르나 보관 비용이 높음
- Glacier의 경우 데이터 접근 속도 느리지만 보관 비용이 저렴
- Standard-IA, One Zone-IA, S3 Glacier Deep Archive 등 여러 스토리지 클래스
- 정적 웹 사이트 호스팅이 가능
- 정적 파일 : 서버의 개입 없이 생성된 파일
- 동적 파일 : 서버에 요청을 보내면, 서버가 생성한 파일
- 웹 호스팅 : 서버의 한 공간을 임대해 주는 서비스
- S3에서 버킷이 사용자들이 정적 웹 사이트를 배포할 수 있는 공간 제공
- 정적 파일을 업로드하고 버킷을 정적 웹 사이트 호스팅 용도로 구성하여 정적 웹 사이트를 배포 가능
- S3에 저장되는 모든 파일은 버킷 안에 저장되어야 하고 각각의 버킷은 이름을 가진다.
- 버킷의 이름은 버킷이 속해 있는 리전에서 유일해야 한다.
- 버킷 정책을 생성해 다른 유저의 접근 권한 수정 가능
- S3에서 버킷에 담기는 파일을 객체라고 한다.
- 데이터를 저장할 때 키-값 페어 형식으로 데이터 저장
- 파일의 값에 실제 데이터 저장, 데이터의 최대 크기 5TB
- 키는 고유 식별자 역할, 메타데이터는 객체의 생성일, 크기, 유형과 같은 객체 정보가 담긴 데이터
- 모든 객체는 URL 주소를 가지고 있고 http://[버킷이름].S3.amazonaws.com/[객체키] 형태
3 Tier-Architecture 배포 전략
Client Application 제공
- S3 서비스로 사용자들에게 client를 제공 가능
- 로컬 환경에서는 자체 개발 서버를 이용해서 클라이언트 앱을 실행
- 클라이언트 앱을 정적 파일로 빌드하여 제공
빌드
- 불필요한 데이터를 없애고 퍼져있는 데이터들을 통합, 압축하여 배포하기에 최적화된 상태를 만드는 것이다.
- 데이터의 용량이 줄어들고 웹 사이트 로딩 속도가 빠르다는 장점
- 일반적인 의미의 빌드는 소스코드를 실행 가능한 번들로 변환하는 컴파일 과정을 의미
- HTML, CSS, JS의 형태로 배포하는 경우는 정적 파일 형태로 만들어야 한다.
- asset 자체가 정적인 경우 그대로 배포
- react의 경우 npm run build 명령으로 정적 파일 형태로 배포
CloudFront
- AWS에서 제공하는 CDN(Content Delivery Network) 서비스
- 데이터센터에 데이터를 분산시켜서 저장해 가까운 지역에 데이터를 주는 방식
Server Application
- AWS EC2를 사용하여 서버 구성 및 서비스 제공
DB
- RDS 서비스를 이용하여 즉시 데이터베이스 사용 가능
도메인 주소
- 도메인을 통해 접속하려면 AWS에서 Route 53 서비스를 통해 직관적인 도메인 주소를 통해 서비스 접근 가능
서버 배포
EC2 Instance 연결
- 인스턴스 탭에서 연결하고자 하는 인스턴스 선택 후 연결 버튼 클릭
- Session Manager 연결을 클릭
- bash를 입력하여 터미널 환경 접속
- 연결 종료하고 싶을 시 종료 버튼 혹은 exit 입력
EC2 instance 서버 실행
인스턴스 개발 환경 구축
- sudo apt update를 통해 패키지 정보 업데이트
- sudo apt install openjdk-11-jre-headless를 통해 java 설치
- SSH 등록
- ssh-keygen을 입력하여 ssh 키 생성
- cat ~/.ssh/id_rsa.pub를 통해 공개키를 복사
- github에 settings에 ssh and GPG keys에 new ssh key에서 입력하고 등록
git을 통해 서버 코드 클론 받기
- git clone을 통해 코드 가져오기
- 해당 디렉터리로 이동
- ./gradlew build로 빌드
EC2 인스턴스 서버 실행
- java -jar build/libs/[파일 이름].jar을 통해 서버 실행
- 인스턴스 대시보드에서 퍼블릭 IPv4 DNS 혹은 IPv4주소 중에 하나를 선택하여 웹 브라우저에서 접근
백그라운드 실행하는 명령어
- nohup java -jar [빌드된 jar파일].jar &
- ps -ef | grep java를 통해 검색
- kill -9 [프로세스 아이디]를 통해 종료(-9 강제 종료, -15 안전하게 종료)
Security Group
보안 그룹
- 인스턴스로 들어(인바운드)가고 인스턴스로 나가(아웃바운드)는 트래픽에 대한 가상 방화벽
인바운드 규칙
- EC2 인스턴스로 들어오는 트래픽 규칙
- 허용되지 않은 규칙은 접근 불가
- 기본적으로 SSH 접속을 위한 규칙이 생성
인바운드 규칙
- EC2 인스턴스에서 나가는 트래픽에 대한 규칙
- 기본적으로 나가는 모든 트래픽 허용
보안 그룹 설정
- 인스턴스 탭 우측에 어떤 보안 그룹에 속해있는지 확인 가능
- 보안 그룹 탭에서 보안 그룹을 클릭하면 규칙을 설정 가능
- 인바운드 규칙에서 인바운드 규칙 편집을 통해 편집 가능
- 규칙 추가 버튼을 눌러 추가
- EC2 인스턴스에서 실행 중인 서버가 인터넷 요청을 받을 수 있도록 설정해야 한다.
- 포트 번호와 유형을 선택
- 소스에 따라 요청을 허락하고 거절할 수 있다.
- 규칙 저장을 하면 설정 완료
- postman을 통해 테스트하여 확인 가능
- 8080 포트로 설정하면 해당 포트로 접속 가능
Shell Script
shell script
- java -jar build/libs/[빌드 파일 명].jar를 통해 EC2에서 실행
- 해당 명령어는 foreground에서 동작해 실행시킨 창을 항상 열어놔야 한다.
- 백그라운드에서 실행 가능하고 제대로 실행되고 있는지 체크해야 할 때 작성
- 셀이나 명령 중 인터프리터가 돌아가도록 작성된 스크립트
Spring Boot 백 그라운드 실행
- vi example.sh를 통해 에디터로 파일 생성 후
- 아래 작성
#실행 중이면 프로세스 종료
ps -ef | grep "[빌드된 파일명]" | grep -v grep | awk '{print $2}' | xargs kill -9 2> /dev/null
# 종료 이력을 보고 문구 출력
if [ $? -eq 0 ];then
echo "my-application Stop Success"
else
echo "my-application Not Running"
fi
#다시 실행하기
echo "my-application Restart!"
echo $1
nohup java -jar build/libs/[빌드된파일명] --spring.profiles.active=dev > /dev/null 2>&1 &
- chmod 755 example.sh를 통해 실행 권한 부여
- 권한이 없다면 sudo 사용
- 이후 ./example.sh로 실행을 하면
서버 배포 완료
- EC2 인스턴스로 서버 실행 후 Postman으로 테스트 진행
클라이언트 배포
환경 설정
nvm 설치
설치 확인
- 터미널을 닫고 재실행
- nvm —version 입력하여 설치 확인
node.js 설치
- nvm install —lts 로 설치
- node -v 로 node.js 설치 확인
S3 호스팅
1. 정적 웹 페이지 빌드
- 빌드
- 불필요한 데이터를 없애고 통합 및 압축하여 배포
- 빌드 전 터미널에 client 디렉터리로 이동 후 의존성 모듈 설치
- 해당 디렉터리에 들어가서 npm install을 통해 설치
- 환경 변수 설정
- .env 파일을 수정하여 REACT_APP_API_URL=[서버 주소]로 설정
- 서버 주소는 http://에서 포트까지 작성
- npm run build 를 실행하여 웹 페이지 빌드
- nvm use 16 명령어를 통해 안정된 버전에서 사용해야 오류 발생하지 않는다.
- 빌드가 완료되면 디렉터리 하위에 build 폴더가 생성
2. 버킷 생성 및 정적 웹 사이트 호스팅 용으로 구성
- AWS S3에 접속
- 리소스를 찾아서 버킷 클릭
- 속성으로 이동하여 정적 웹 사이트 호스팅 편집을 들어가 활성화로 변경
- 인덱스 문서 부분에는 처음 접속 기본 페이지 지정
- 오류 문서는 오류 발생할 때 페이지 지정
- 변경 사항 저장
- 변경 사항 저장되면 버킷 웹 사이트 엔드 포인트가 생성
3. 빌드된 정적 웹 페이지 업로드
- 객체 메뉴에 들어가 업로드 버튼 클릭
- build 폴더 안에 포함된 파일을 드래그 앤 드롭하여 업로드
4. 퍼블릭 액세스 차단 해제 및 정책 생성
- 권한 탭으로 가서 퍼블릭 액세스 차단 옵션에서 편집하고 모든 퍼블릭 액세스 차단 옵션 체크 해제 후 변경 사항 저장
- 권한 탭의 버킷 정책 부분 편집 후 정책 생성기 클릭
- Select Type of Policy에서 S3 Bucket Policy 선택, Principal은 을 입력, Actions는 GetOject 선택, Amazon Resource Name에는 버킷 정책 편집에 나와있는 ARN 복사 후 /를 붙여서 사용(arn:aws:s3:::<버킷이름>/)
- Generate Policy 버튼 클릭하면 정책 생성되고 JSON 데이터를 복사하고 close
- 버킷 정책에 붙여 넣고 변경사항 저장
- 속성으로 들어가서 버킷 웹 사이트 엔드포인트로 접속하여 테스트
데이터베이스 연결
RDS 인스턴스 연결
RDS 인스턴스 생성
- AWS RDS 접속
- 사이드바에서 데이터베이스 클릭하여 이동
- 데이터베이스 생성 버튼을 누르고 엔진 옵션에 MySQL 선택
- 템플릿 옵션에서 프리 티어로 선택
- DB 클러스터 식별자 이름, 마스터 사용자 이름, 암호 지정
- RDS 인스턴스 클래스는 t2.micro 선택
- 연결 옵션에서 퍼블릭 액세스 가능을 예로 설정
- 보안 그룹은 기본값 default 그룹 선택
- 추가 연결 구성에는 일반적인 포트 번호 3306 대신 13306 지정
- 추가 구성에서는 초기 데이터베이스 이름을 설정(예시 test)
- 데이터베이스 생성하고 나서 상태에서 사용 가능으로 변경될 때까지 대기
데이터베이스 연결
- AWS RDS에서 데이터베이스 메뉴에 DB 식별자를 찾아 클릭
- 엔드포인트 주소를 확인하고 복사하고 포트 번호를 확인
- 터미널에서 MySQL을 통해 DB 인스턴스 접속
- mysql -u [마스터 이름] —host [엔드 포인트 주소] -P [포트 번호] -p 를 실행 후 마스터 비밀번호 입력
- show databases;를 통해 초기 데이터베이스 존재하는지 확인
서버 환경 설정
- EC2 인스턴스 터미널에서 application.properties 수정
- vi src/main/resources/application.properties
- spring.datasource.url={AWS RDS 엔드포인트 주소:포트}/test?useSSL=false&characterEncoding=UTF-8&serverTimezone=UTC
- spring.datasource.username={마스터 사용자 이름}
- spring.datasource.password={암호}
- config.domain=http://{S3 엔드포인트 주소}
- 내용을 변경하고 저장
- ./gradlew clean으로 이전 빌드 제거 후 다시 빌드한다.
서버 실행
- java -jar build/libs/{빌드된 파일 명}.jar를 통해 서버 실행
- S3 버킷의 엔드포인트 주소로 접속해서 연결 확인
도메인 주소를 이용한 HTTPS 인증
ELB 생성 및 ACM을 통한 인증서 발급
- EC2 메인 콘솔 이동
- 사이드바에 로드 밸런서 탭 클릭
- load balancer 생성 클릭, application load balancer 클릭
- 이름에 ELB, 프로토콜에 http 포트 번호 80, HTTPS 포트번호 443으로 등록 후 다음 버튼 클릭
- vpc에서 기본값을 설정하고 가용 영역 선택 후 다음
- ACM에서 인증서 선택을 누르고 ACM으로부터 새 인증서 요청 클릭
- 도메인 이름 입력 후 다음, DNS 검증 선택 후 다음, 검토 클릭, 확인 및 요청, Route 53에서 레코드 생성을 클릭 후 생성 후 계속
- 검증 보류 상태 확인하고 인증서 발급 완료되면 발급 완료 상태 확인하고 load balancer 생성 창으로 돌아가 recurring 아이콘 클릭
- 인증서 이름에 인증서를 선택 후 다음 클릭
- 보안 그룹을 선택 후 라우팅 구성 클릭, 대상 그룹 이름을 설정, 고급 상태 검사 설정에서 성공 코드 201로 입력 후 다음 클릭
- EC2 인스턴스를 체크한 후 등록된 항목에 추가를 클릭, 선택한 EC2 인스턴스 등록 여부를 확인하고 다음 클릭
- 내용을 검토하고 생성 클릭하면 생성 완료 확인
- 로드 밸런서 메뉴로 돌아가서 DNS 이름 주소를 이용하여 접속 테스트 진행
호스팅 영역에 별칭 레코드 생성
- Route53 콘솔로 이동하여 호스팅 영역을 클릭
- 해당 호스팅 역역을 접속하여 레코드 생성을 클릭하고 별칭을 클릭
- Application/classic load Balancer에 대한 별칭 클릭
- 리전을 서울 리전으로 선택
- 로드 밸런서에서 생성한 로드밸런서를 클릭
- 레코드 생성 여부를 확인하고 접속 테스트 진행
리소스 생성
인스턴스 생성
- AWS EC2 서비스를 검색하고 인스턴스 시작 버튼 클릭
- 프리티어 사용 가능 태그를 확인하여 과금이 되지 않도록 유의
- 인스턴스 유형을 선택할 때 CPU, RAM, 용량 선택 가능
- 검토 및 시작 버튼을 클릭하면 SSH 원격 접속을 위한 key 생성 및 다운로드 진행
- 새 키 페어 생성 메뉴를 확인하고 이름을 정하고 다운로드하면 인스턴스 시작 버튼 활성화
- SSH 프로토콜은 서로 다른 pc가 인터넷과 같은 public Network를 통해 통신할 때 안전하게 통신을 하기 위한 규약
- EC2 프라이빗 키 파일(.pem 파일)
- 인스턴스 생성 마지막 단계에서 다운로드 한 파일은 ssh 통신을 위한 키 페어 중 프라이빗 키가 기록된 파일로 .pem 파일이다.
- 우측 하단에 인스턴스 보기를 통해 생성된 인스턴스 확인 가능
- name 칼럼에서 해당 인스턴스 이름을 설정하면 인스턴스 구분 용이
인스턴스 연결
- ssh 연결을 통해 인스턴스 접속
- 인스턴스 선택 후 연결 버튼 클릭하고 ssh 클라이언트 클릭
- 로컬 터미널에서 ssh 프로토콜을 이용해 인스턴스와 연결 가능
- pem 키 파일에 대한 권한을 수정해야 한다.
- chmod 400 [pem 키].pem 나에게만 읽기 권한이 있도록 부여
- 권한 설정을 하지 않는 경우 너무 open되어 있다는 경고 발생
- 권한 설정을 하면 ssh 명령어를 통해 인스턴스 접속 가능
- 접속 주소는 인스턴스를 클릭하면 보이는 세부 정보 탭에서 확인 가능
- ssh -i {다운로드한 키 페어 파일 경로} {사용자 이름}@{ssh접속주소}를 통해 접속