AWS

아마존 웹 서비스(S3, EC2, RDS)의 개념과 사용 방법 - AWS

파란배개 2020. 12. 15. 15:02

S3, EC2, RDS

S3 = 리액트 필드 파일을 셋업할 수 있는 S3버켓 세팅(클라이언트 역할)

EC2 = 위에서 구동되는 노드 서버의 api를 받아가고(서버역할)

RDS = api를 요청할 때 필요한 데이터는 RDS라는 데이터베이스 인스턴스에서 데이터를 쿼리해간다(데이터베이스 역할)

CloudFront = ssl을 적용하고 cdn을 활용해서 클라이언트 파일을 전 세계에 조금 더 빠르게 제공하는 기능을 적용하는 서비스

route 53 = 도메인을 구매하고(유료) ssl을 적용할 수 있는 것

 

https 웹사이트를 만들려면?

 

freenom 무료 도메인을 AWS EC2 서버와 연결해 https 적용하기

한참 도메인과 EC2를 연결시키려고 고생하던 중에 팀원에게 들은 충격적인 사실이 있다. 바로 freenom에서 제공하는 도메인 중 cf와 ml만 AWS 서비스와 연결이 가능하다는 것이다. 처음에 tk 도메인으

goanfvkdl.tistory.com

 

 

 

S3 

S3를 통해 리액트 앱을 AWS에 올릴 수 있다.

 

(터미널에 npx create-react-app practice-react-deploy로 간단하게 연습할 수 있는 리액트 앱을 만들 수 있다. create-react-app이 자동으로 react에 필요한 dependency들을 설치해준다.)

리액트 앱이 있는 폴더에서 터미널에 yarn build를 실행하면 빌드된다.(npm만 설치되어 있고 yarn이 설치되어 있지 않다면 npm install yarn -g로 yarn을 전역설치 해두자. 있으면 좋다.)

빌드는 js,html,css파일등을 웹팩을 통해 합쳐서 하나의 정적 파일로 만들어준다.

build 폴더에 있는 static(정적) 파일들을 S3 버켓에 올려서 배포를 진행해야 한다.

 

아마존 AWS 홈페이지의 AWS Management Console에 들어가서 서비스 찾기에서 S3를 검색해 들어간다.

버킷 만들기를 누르고 이름을 입력하면 버킷을 생성할 수 있다.

만들어진 버켓에 들어가면 기본 설정만 되어 있는 빈 버켓에 들어간다.

이 버켓을 퍼블릭(누구나 들어갈 수 있는)으로 만들고 정적 파일을 제공할 수 있는 웹사이트로 만드는게 목표다.

'속성'-'정적 웹 사이트 호스팅'에서 '편집'에 들어가 '비활성화를'을 '활성화' 속성으로 바꾸고 호스팅 유형을 정적 웹 사이트 호스팅으로 둔다.

그럼 인덱스 문서(엔트리 포인트가 되는 첫 문서)를 설정(ex,index.html)하고, 오류 문서(유저가 잘못된 요청을 했을 때 나오는 문서)를 설정(위에서 갓 만들어진 연습용 리액트 앱은 에러를 핸들링 할 수 없으므로 index.html을 대신 입력한다.)할 수 있는데 설정을 완료하고 저장하면 버켓은 웹사이트를 호스팅 할 수 있게 된다.

하지만 지금 상태로는 public이 접근 불가능하기 때문에 당장 접속해도 access denied가 뜬다. 이를 해결하기 위해 '권한'을 설정해주어야 한다.

 

사용자들이 접속할 수 있게 하기 위해 '권한'-'퍼블릭 액세스 차단'에서 '모든 퍼블릭 액세스 차단'을 비활성화한다.

다음으로 '편집' 버튼을 눌러버킷 정책(사람들이 어떻게 접속할 수 있고 어떤 액션을 취할 수 있는가)를 설정한다.

보통 json 타입의 정책을 입력해야 하지만 정책 생성기를 통해 간단히 생성할 수 있다.

step 1: Select Policy Type에서는

policy type은 S3 Bucket Policy로 변경한다.

step 2: Add Statement에서는

Principal에선 최소 하나 이상의 정책을 입력해야 한다.

Principal은 누구에게 권한을 부여할지 지정한다.

(참고 : docs.aws.amazon.com/ko_kr/AmazonS3/latest/dev/s3-bucket-user-policy-specifying-principal-intro.html)

Principal에 *를 입력하면 익명(모두)에게 권한을 부여할 수 있다.

 

Actions는 GetObject를 클릭한다.

 

ARN은 아래 쓰여진 예시처럼 형식에 맞게 입력한다.

(ex. arn:aws:s3:::<bucket_name>/<key_name>)

(예제. arn:aws:s3:::practice-react-deploy/*)

#버켓명을 정확히 입력할 것!#

Step 3: Generate Policy에서 Generate Policy버튼으로 생성된 json을 버킷 정책에 입력하고 변경사항을 저장하면 된다.

 

이제 S3 버켓의 '객체'탭에서 크리에이트 리액트 앱에서 build해 둔 static 폴더를 포함한 정적 파일들을 올리면 된다.

 

그러면 '속성' - '정적 웹 호스팅' - '버킷 웹 사이트 엔드포인트'에 있는 엔드포인트로 접속하면 퍼블릭 링크로 빌드된 리액트 앱이 접속이 되는 것을 볼 수 있다.

------------------------------------

EC2

EC2를 통해 node.js를 AWS에 올릴 수 있다.

 

git을 통해 서버 어플리케이션을 EC2에 업로드한다.

깃허브에 해당 서버 어플리케이션을 업로드하고 진행한다.

Start Instance

AWS에서 EC2를 검색해 EC2 대시보드에 들어간 후 EC2를 만들기 위해서 '인스턴스 시작'을 누른다.

그러면 다양한 OS가 깔린 컴퓨터들이 나오는데 그 중에서 가장 무난한 우분투 최근버전(20.04)의 64비트(x86)를 이용해서(과금당하지 않으려면 프리티어 사용 가능한 컴퓨터만 선택해야 한다!) 검토 시작을 누른다.

인스턴스 유형을 검토한 후 시작하기를 누른다.

'기존 키 페어 선택 또는 새 키 페어 생성'에서 프라이빗 키를 구성한다. 새 키 페어를 생성하고 키 페어 이름을 정한다.

키는 한 번 저장하면 다시는 키를 얻을 수 없기 때문에  꼭 키 pem 키를 다운로드 해놔야 한다.

인스턴스는 처음에 이름이 없기 때문에 인스턴스가 많아지면 헷갈릴 수 있다. 이름을 정해놓는게 좋다.

(그렇게 새로 생긴 인스턴스 항목을 클릭하면 인스턴스 요약이 뜨는데, 이 인스턴스에 접속하기 위해선 이 인스턴스의 퍼블릭 주소와 pem 키가 필요하다.)

인스턴스 위의 '연결'을 클릭하고 'SSH 클라이언트' 탭을 누르면 뭘 해야 인스턴스에 연결할 수 있을지 잘 나와 있다.

루트 디렉토리(계정명)에 .ssh란 폴더와 ssh라는 것이 거본적으로 설정되어 있음(만약 .ssh 폴더가 없으면 mkdir .ssh로 만들면 된다.)

.ssh 폴더에 아까 받은 pem 키를 옮긴다.

콘솔에 chmod 400 <key>.pem을 입력해 파일 보안 권한을 부여하고

AWS에서 보여주는 예를 복붙하면 연결이 진행되고 yes/no를 물으면 yes를 입력해 연결한다.

그렇게 연결되는 컴퓨터는 아무것도 깔려 있지 않지만 git은 깔려있어서 클론할 수 있지만 해당 파일을 실행시킬 런타임이 없다.

노드를 설치해야 한다.

 

Environment Settings

자신의 AWS에 깔린 우분투 버전과 상황에 맞는 방법으로 node.js와 npm을 설치한다.

<우분투인 경우>
sudo apt-get update 
sudo apt-get install nodejs
sudo apt-get install npm

깃헙에 올라간 서버를 EC2 서버에 클론한다.

클론은 되었지만 노드 모듈은 깃헙에 푸쉬되지 않으므로 package.json에 따라 dependency를 설치한다(npm install)

이제 public 접속을 위해 AWS에서 보한 설정을 추가로 진행해야 한다.

 

Security Group

AWS에서 인스턴스를 누르고 '보안' 탭을 누르면 인바운드에서 원격 접속을 했던 SSH만 인바운드로 허락되어 있다.

인바운드 규칙 위의 보안그룹을 눌러 '인바운드 규칙 편집'을 누른다.

규칙을 새로 추가해서 HTTP요청을 받을 수 있게 유형을 HTTP로 바꾸고 소스를 위치 무관(누구나 api를 요청할 수 있게)으로 정한다.

또 규칙을 한 번 더 새로 추가해서 유형을 사용자 지정 TCP로 바꾸고 포트범위를 서버를 열어놓은 포트로 정한다. 소스를 위치 무관으로 바꾼다.

이후 퍼블릭 주소와 열린포트로 접속하면 홈페이지에 접속할 수 있다.

 

PM2

PM2는 AWS와 연결된 터미널을 꺼도 서버가 계속 작동되게 하는 모듈이다.

AWS와 연결된 터미널에 $ sudo npm install pm2 -g 명령어로 pm2를 전역설치하자(pm2는 자주 쓰이므로 전역설치가 낫다고 한다.)

설치를 완료한 후 서버가 있는 폴더에서 $ pm2 start <엔트리포인트> (ex. $ pm2 start app.js)를 입력하면 앱이 실행되는게 보인다.($ pm2 list를 입력해도 실행되는 앱을 확인할 수 있다.) 이렇게 되면 터미널을 끄고 나가도라도 서버가 정상적으로 작동된다.

pm2를 종료하려면 $ pm2 stop 0 (여기서 0은 $ pm2 list를 입력했을 때 나오는 리스트에서 실행되는 앱의 id이다. 실행되는 앱의 App name을 입력해도 된다)을 입력한 후 $ pm2 kill을 입력한다.

 

 

RDS

EC2 컴퓨터의 데이터베이스에 특화된 컴퓨터

협업 시에 데이터베이스의 상황이 너무나 달라서 데이터베이스의 접속부터 문제가 생기는 경우가 생긴다. 그래서 협업시에 데이터베이스는 클라우드 데이터베이스를 사용하는 편이 좋다.

 

AWS에서 RDS를 서비스에서 찾아 들어간다.

데이터베이스 생성을 누른다.

엔진 옵션은 MySQL을 고른다.'

'템플릿'은 프리 티어를 선택한다.(그래야 과금이 청구되지 않는다.)

'설정'에서 DB인스턴스 식별자와 마스터 사용자 이름, 암호를 채운다.(시퀄라이즈를 초기화 하거나 DB에 직접 접근할 때 마스터 사용자 이름과 암호가 필요하다.)

'연결'에서 '퍼블릭 액세스 가능'은 사실 vpc 내부의 EC2 인스턴스만 데이터베이스에 연결되면 되지만 초기에는 다양한 MySQL클라이언트 툴들로 접속할 일이 있기에 public access를 이용할 수 있도록 '예'를 선택한다.

'추가 연결 구성'에서는 데이터베이스 포트를 설정할 수 있다. MySQL에서는 3306이 기본 포트이지만 이 포트를 그대로 노출하고 사용하는 것은 보안의 위험이 있을 수 있다.

'추가 구성'에서 '초기 데이터베이스 이름'을 입력한다.(이 이름은 생성하는 인스턴스의 이름이 아니라 MySQL 데이터베이스의 이름을 말한다.)

설정이 끝난 후 데이터베이스를 생성한다. RDS를 셋업하는데 10분 정도 걸리니 기다리자.

 

생성된 후 엔드포인트, 포트, 마스터유저네임, 비밀번호를 확인한다.

이것들을 통해 서버 코드에서 mySQL이나 ORM으로 접속하거나 mySQL CLI나 클라이언트 등을 통해서도 접속이 가능하다.

mySQL workbench의 경우 호스트네임에 엔드포인트를 입력하고, 포트, 유저네임에 마스터유저네임, 비밀번호를 입력해서 접속이 가능하다.

만약 연결이 안 된다면 연결&보안 탭의 보안그룹- 인바운드 규칙 편집에서 유형을 모든 트래픽, 소스를 위치 무관으로 바꾸면 연결된다.