📖 AWS
📌 용어정리
- 배포
- 사용자들이 인터넷을 통해서 사용할 수 있게 만드는 것
- EC2
- 컴퓨터를 빌려서 원격으로 접속해 사용하는 서비스
- 내가 가진 컴퓨터로 사용하면 24시간 켜야하고, 보안적 위험이 존재 그래서 EC2 사용
- AWS 인스턴스 : EC2 하나
- 인바운드 트래픽 : 외부에서 EC2 인서턴스로 보내는 트래픽
- 아웃바운드 트래픽 : EC2인스턴스 내부에서 외부로 보내는 트래픽
- ssh : 원격 접속을 위한 경로
- ip : 특정 컴퓨터를 가리키는 주서
- port : 한 컴퓨터 내에서 실행되고 있는 특정 프로그램의 주소 , 외부에서 들어와 어떤 프로그램이랑 소통할지도 알려면 알아야함
- 브러우저 창에 포트 번호를 입력하지 않는 이유?
: 브라우저는 기본적으로 80번 포트로 통신을 보내게 설정
- 잘 알려진 포트 : 0~1023 번 포트 (다르게 써도 상관은 없음)
- 22(ssh,secure shell protocol) : 원격 접속을 위한 포트 번호, EC2 인스턴스에 연결할 때 22번 포트를 사용
- 80번(HTTP) : HTTP 로 통신할 떄 사용
- 443번(HTTPS) : HTTTPS 로 통신시 사용
- EBS(Elastic Block Storage) : EC2 에서 사용하는 하드디스크
- 퍼블릭 ip : EC2 주소
- 인스턴스 종료 : EC2 삭제하는 거임 다날라감
- 탄력적 IP : 인스턴스를 생성하면 ip 를 받는데 일시적인 것이다, 중지시켰다가 키면 ip가 변동됨 그래서 고정ip 를 받아야한다 ip 가 모잘라지기 시작해서 임시적으로 주는것 안쓰는 것 쓰게하려고
📌 EC2 생성 순서
- EC2 선택
- Region 선택 : 인프라를 지리적으로 나누어 배포한 각각의 데이터 센터, 어디에 있는 컴퓨털르 빌릴꺼란 거임 선택
- 리전 선택 기준 : 애플리케이션의 주된 사용자들의 위치와 지리적으로 가까운 리전을 사용 하는것이 유리 , 통신이 가까울수록 빠르게 되기에
- 리전 마다 EC2가 따로따로 관리되고 있으니 딴곳에 들어가면 만든것이 없다고 당황하지 말 것
- 인스턴스 시작
- 이름 (관련)
- Ubuntu (개발자들이 필요한 성능만 쓰기에 우분투가 훨씬 가벼움)
- 인스턴스 유형 : 컴퓨터 사양
- 키 페어(비밀번호) : 생성 , 다른사람이 이것을 알고있으면 이 공간에 접근 할 수 있음 ,파일보관잘하기
- 네트워크 설정
- 편집
- 방화벽(보안 그룹) : EC2를 빌려서 울타리랑 대문, 즉 방화벽이 들어와도 되는지 검사를 해줌 ,들어와도 되는 트래픽 인지
- 인바운드 트래픽 : 외부에서 EC2 인서턴스로 보내는 트래픽
- 아웃바운드 트래픽 : EC2인스턴스 내부에서 외부로 보내는 트래픽
- 어떻게 보안그룹을 설정해야하는지
- 보안그룹 생성
- 이름 : 직관적인
- ssh : 원격 접속을 위한 경로 , 포트범위에 대해 허용이 되어있어야만 들어 갈 수있음 ex) 소스유형 :위치무관이면 어떤 컴퓨터의 ip에 대해서도 접근가능하다라 한것 , 특정ip만 들어오게 하려면 사용자 지정 ip 작성
- 보안그룹 규칙 추가 -> 유형 : HTTP -> 80번 포트에서 받을꺼기에 열어놓는 것
- 스토리지(저장공간,EBS(Elastic Block Storage))
- 인스턴스 시작
- 대시보드 -> 인스턴스
- 연결
- EC2 인스턴스 연결 ( 인터넷으로 연결 하는것 ) -> 연결
- 카테고리 -> 탄력적 IP -> 탄력적 ip주소 할당 -> 할당 -> 이름 ~~-ip
- 작업 -> ip주소 연결 -> 인스턴스 선택 -> 연결
- 인스턴스 종료 ( 탄력적 ip 도 제거해야함 )
- 탄력적 ip -> 작업 -> 릴리즈
📌 EC2 서버에 배포하기
- sudo su : 루트권한으로 바꿈
- node.js 다운 (우분투환경에서)
apt-get update && /
apt-get install -y ca-certificates curl gnupg && /
mkdir -p /etc/apt/keyrings && /
curl -fsSL https://deb.nodesource.com/gpgkey/nodesource-repo.gpg.key | sudo gpg --dearmor -o /etc/apt/keyrings/nodesource.gpg && /
NODE_MAJOR=20 && /
echo "deb [signed-by=/etc/apt/keyrings/nodesource.gpg] https://deb.nodesource.com/node_$NODE_MAJOR.x nodistro main" | sudo tee /etc/apt/sources.list.d/nodesource.list && /
apt-get update && /
apt-get install nodejs -y
- node -v : 잘설치됬나 확인
- github 으로 Express 프로젝트 클론
$ git clone https://github.com/JSCODE-EDU/ec2-express-sample
$ cd ec2-express-sample
$ npm i
- .env 파일 직접 만들기 :
vi .env
DATABASE_NAME=my_databse
- pm2 설치해서 서버 실행시키기
$ sudo npm i -g pm2
$ sudo pm2 start app.js
📌 Route 53
도메인을 발급하고 관리해주는 서비스 (도메인 : 인터넷주소) ,DNS 서비스
- 왜? : ip 주소는 기억하기 어려움 , ip 에는 https 에는 적용이 안됨
- DNS : 도메인이 없던 시절 IP 주소를 사용, IP주소를 문자로 바꿔주는 서버
- Route 53
- 등록된 도메인
- 도메인 등록
- 작성 (email 은 제대로 작성해야함) 구매하면댐
- 호스팅 영역
- 등록된 도메인
- 호스팅 영역
- 레코드 생성
- A,CANME
- 값 instance ip 입력
- 레코드 생성
무료 도메인 받기
1. 내 도메인 받기
2. 도메인 관리
3. 수정
- ip연결(a) -> ip 붙이기
📌 HTTP
- ELB(Elastic Load Balancer) : 트래픽(부하)를 적절하게 분배해주는 장치 , 로드 밸런서 라고 불림 Load(짐) Balancer
- SSL/TLS : HTTP를 HTTPS 로 바꿔주는 인증서
- HTTPS 를 적용 시켜야 되는 이유? :
- 보안적인 이유 : 데이터를 암호화 시켜서 보내기에
- 사용자 이탈을 막기 위해
- ELB 를 활용하여 사용자들이 직접적으로 요청하는게 아니라 ELB에 전달하고 ELB에서 EC2 로 전달할 것이다.
사용순서
- EC2 접속
- 카테고리 -> 로드밸런서 -> 로드밸런서 생성
- Application load balancer 생성
- 이름 ~~~-server-elb
- 인터넷 경계, ipv4
- 네트워크 매핑 : 어떤 가용영역을 가질건지 , 다 트래픽을 내보내겟다 다클릭
- 보안그룹 : EC2랑 다름
- EC2 카테고리 보안그룹
- 보안그룹 생성
- 인바운드 규칙추가 -> HTTP -> 소스 Anywhere ipv4 + 규칙추가 -> HTTPS -> anywhere ip4
- 보안그룹 생성
- 보안그룹 생성
- 만든거 체크
- 리스너 및 라우팅 -> 대상 그룹 생성 : 대상그룹으로 어떤방식으로 트래픽을 전달할지 설정하는 부분
- 상태 검사 : elb 부가 기능 고장난 서버에 트래픽을 전달하는게 비효율적이여서, 주기적으로 연결되어있는 ec2 서버에 200번대 응답이 날린다 -> 응답이 안날라오면 서버가 고장 났다고 생각하여 트래픽을 날리지 않는다. 효율적인 트래픽을 위한 과정
- 상태 검사 경로 : /health
- 다음 -> 대상등록 -> 체크 -> 아래에 보류 중인 것으로 포함 -> 대상 그룹 생성
- 리스너 및 라우팅 새로고침 -> 만든거 클릭
- 로드밸런서 생성
- health check API 추가하기
- ec2 instance 실행 -> vi app.js 아래코드 사이에 추가
app.get('/health', (req, res) => {
res.status(200).send("Success Heatlth Check");
})
- elb 도메인 연결
- 레코드 생성
- 별칭 -> Application/Classic Load Blance 에 대한 별칭 -> 지역 (서울)선택 -> 만든거 뜸 -> 레코드 생성
- https 적용을 위해 인증서 발급받기 -> Certificate manger 검색
- 인증서 요청
- 요청
- CNAME 을 넣고 거기에 코드를 넣으면 넣어주겠따.route53 에서 레코드 생성
- ec2 -> 로드밸런서 -> 리스너 및 규칙 -> 리스너 추가 -> HTTPS -> 인증서 -> 추가
- 리스너 및 규칙 -> HTTP 삭제 -> 리스너 추가 -> URL로 리디렉션 -> 추가 : http 로 치더라도 https 로 들어와짐
- 리스너 삭제 -> 인스턴스 삭제 -> 도메인 삭제(릴리스)
📌 RDS
관계형 데이터베이스 서비스
- 서버를 배포하면 내컴퓨터에 설치된 mysql 과 연결할 수 없다. db 도 인터넷에서 접근할 수있도록 배포하는것임
- ec2 에 mysql 을 쓰지 않는 이유는 서버 장애로 ec2 가 죽을 경우 애꿎은 mysql 도 같이 죽기때문에
- RDS
- 데이터베이스 생성
- Mysql
- 프리티어
- db인스턴스 식별자 직관적
- ssd gp3
- 퍼블릭 액세스 : 예 -> 외부에서 접근해서 할거에요
- ec2 -> 보압그룹 -> 보안그룹 생성 -> 이름 ~~-db-security -> 설명
- 인바운드 규칙 MYSQL/Aurora anwhere-ipv4
- RDS -> 데이터베이스 -> 수정
- 연결 -> 보안그룹 -> 생성한 보안그룹
- 게속 -> 즉시적용 -> db인스턴스 수정
- rds -> 파라미터 그룹 -> 파라미터 그룹 생성
- mysql 8.0 -> 이름 ~~-db-parameter-gropu -> 생성
- 편집
- character 검색 -> 처음부터 server 까지 utf8mb4(한글이랑 이모티콘을 지원하게 해주는 방식) 추가 -> 저장
- 편집
- collation(정렬규칙) -> utf8mb4_unicode_ci -> 다추가
- 편집
- time_zone -> Asia/Seoul -> 변경사항 저장
- RDS -> db인스턴스 클릭 -> 수정
- 추가 구성 -> 방금 만든 것으로 -> 게속 -> 즉시수정 -> 인스턴스 수정 -> 작업 -> 재부팅(수정완료후)
- 데이터베이스랑 연결해서 잘 연결됬나 확인
- mysql -> connections -> server host : [엔드포인트 주소] -> port -> username -> 비번 , 엔드포인트 : 특정리소스(서버,db)에 접근할수있도록 해주는 url
- 대시보드 -> 데이터에베이스 -> 작업 -> 삭제 -> 최종스냅샷,자동백업 보전 체크 해제 -> 삭제
📌 S3
파일 저장서비스
-
백엔드 서버를 구현하다보면 이미지 업로드 기능을 구현할 때가 많다. 어디에 저장할까? 내부에 저장할 수도 있지만 ec2 에 쌓이는 파일이 많고 지저분해진다
-
파일저장,다운에 특화된 서비스
-
이미지 업로드 api 요청 -> ec2 -> s3 -> ec2(이미지가 저장된 url) -> rbs
-
이미지 조회 -> ec2 -> db에 조회 sql ->rds -> url응답-> ec2-> 사용자가 url을 사용하면 -> s3로부터 이미지 다운
-
s3_버킷 : 하나의 저장소를 bucket 이라 부름 like github repository
-
s3_객체 : s3 버킷에 업로드된 파일
-
정책 -> 권한(permission) 을 정의하는 json 문서 : aws 는 기본적으로 대부분의 권한이 주어지지 않음. aws 특정 소스에 접근하려면 권한 허용을 해야댐 권한 허용할 때 작성해야 하는게 정책
- S3
- 버킷 만들기
- 이름 : ~~-static-files
- 퍼블릭 액세스 차단 설정 모든 액세스 차단 클릭 해제 -> 현재설정으로 인해~~ 체크
- 버킷 만들기
- 버킷 정책 추가해주기
- 만든 버킷 들어가서 -> 권한 -> 구체적으로 어떤 것을 허용할 건지
- 정책(상품이미지 모든사용자한테 보여주고 상품이미지 다운 가능하게)-> 버킷에서 이미지 조회하게 정책 추가
- 새 문 -> S3 검색 -> GetObject 검색 -> 체크 -> 리소스 추가 -> 유형(object) -> 리소스ARN 버킷네임 객체 이름 아까 적은거 작성
- 변경사항 저장
- 버킷 안에 들어가서 파일 삭제 후 -> 버킷 삭제