Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

develog

AWS EC2에 HTTPS 적용하기 #1 (Express 서버 HTTP로 배포하기) 본문

백엔드

AWS EC2에 HTTPS 적용하기 #1 (Express 서버 HTTP로 배포하기)

LineGu 2022. 2. 2. 02:54
이 글은 2022.02.02를 기준으로 쓰인 글입니다.
필자는 MAC을 사용중입니다.

만약 EC2에 노드 서버가 이미 HTTP로 배포 되어있다면 이 파트를 건너뛰어도 된다.

여기서 설명했듯이, HTTPS를 적용하는 방법은 매우 다양하다.

필자는 이 방법들 중에서 AWS EC2, AWS Route53, AWS 로드밸런서, AWS ACM을 이용하여 HTTPS를 적용해보겠다.

(이 외의 방식에 질문이 있다면 언제든 댓글로 질문해도 괜찮습니다.)

Node 서버를 EC2에 배포하기

필자는 아래와 같은 Express 서버를 띄울 것이다.

const express = require('express');
const app = express();

const PORT = 8080;

function handleListen () {
    console.log("Listen on 3000 port");
}

function handleHome (req, res) {
    res.status(200).send('hello');
}

app.get('*', handleHome)

app.listen(PORT, handleListen);

8080포트로 접속하면 'hello'를 응답해주는 서버이다.


이제 AWS EC2 페이지로 가보자.

위 사진처럼 인스턴스 탭을 선택하고 그 안에서 인스턴스 시작 버튼을 누르자.

우리는 Amazon Machine Image(AMI)로 Ubuntu 18.04를 선택하겠다.

Ubuntu 20.04도 이 파트에선 상관없다.

필자는 돈이 없으므로, 프리티어를 사용하겠다.

t2.micro를 선택하고 검토 및 시작 버튼을 누르자.

인스턴스를 시작하자.

이런 모달이 뜰것이다.

새로운 키를 얻기 위해, 드랍다운에서 새 키 페어 생성을 선택하고 적절한 키 페어 이름을 지정하자.

그 후에 키 페어를 다운로드한다.

다운로드 하지 않으면 인스턴스를 시작할 수 없다.

키를 다운 받아야만 추후에 ssh로 인스턴스에 접속해서 관리할 수 있다.

아마 pem 확장자를 가진 파일이 다운로드 될 것이다. 안전한 장소에 보관하자.

다운로드가 완료되고 적당한 장소에 저장했다면 인스턴스 시작 버튼을 누르자.

인스턴스 보기 버튼을 눌러 내가 생성한 인스턴스를 보러가자.

인스턴스 탭에 내가 방금 만든 인스턴스가 생겼다!

필자는 기존에 만든 인스턴스가 있어 두개가 있는 상황이지만 이 글을 처음 따라하는 사람은 하나만 있을 것이다.

이제 그 인스턴스에 접속할 것이다.

자신이 방금 생성한 인스턴스를 클릭해보자.

이 화면이 나타날 것이다. 저 빨간색 퍼블릭 IPv4를 복사하자.

이제 각자의 컴퓨터에서 터미널을 열고, 다운로드받은 키 페어가 있는 경로로 가자.

예를 들어 Desktop 경로에 키페어가 있다면

$ cd ~/Desktop  

위 명령어를 치면된다.

해당 경로로 이동한 후 아래 명령어를 치자.

$ ssh -i {다운로드받은 키 페어 이름} ubuntu@{각자의 퍼블릭 IPv4}

{}안에는 자신이 설정한 값을 넣으면 된다.

필자같은 경우엔 아래와 같을 것이다.

$ ssh -i https-tutorial.pem ubuntu@13.209.64.194

확실히 연결을 시도할 것인지 물어본다. yes를 치고 엔터를 치자.

물어보지 않는다면 패스!

키 페어 파일을 읽을 권한이 없다는 것이다.

권한은 chmod 명령어로 처리해줄 수 있다.

다음 명령어를 치자.

$ chmod 400 {다운로드받은 키 페어 이름}

필자의 경우 chmod 400 https-tutorial.pem

chmod 명령어는 특정 파일에 대한 권한을 부여하는 리눅스 명령어이다.

숫자의 순서대로 나/그룹/전체에 대한 권한을 지정한다.

권한은 숫자로 나타내고, read(4), write(2), execute(1) 로 분리된다.

예시로, 400이면 나만 read라는 것이다.

700이면 (4+2+1)/0/0으로 나만 read, write, execute가 가능하다는 것이다.

444면 나 그룹 전체 모두가 read가 가능하다는 것이다.

파일에 권한을 준 뒤 다음 명령어로 다시 인스턴스에 접속해보자.

$ ssh -i {다운로드받은 키 페어 이름} ubuntu@{각자의 퍼블릭 IPv4}

이런식으로 자신의 private-IP (접속할때 썼던 퍼블릭 IP 아님 private-IP는 AWS에서 자신의 인스턴스보는 곳에서 확인 가능)와 함께 뜬다면 성공한 것이다.

이제 우리가 만든 node를 가지고 놀 폴더를 생성하고, 그 폴더로 들어가자

$ mkdir {폴더 이름} && cd mkdir {폴더 이름}

필자의 경우 mkdir https-tutorial-folder && cd https-tutorial-folder

이제 자신이 만든 폴더에 위치해 있을 것이다.

이제 자신이 만든 node 코드를 집어 넣자.

만약 자신이 만든 node 코드가 git으로 관리되고 있다면 git clone으로 진행할 수 있다.

필자는 간단한 테스트이므로 인스턴스에서 직접 코드를 입력해 주겠다.

아래 두가지 방법 중 하나만 진행해야한다.

  1. git clone인 경우
$ git clone {자신의 레포지토리 URL}

예시로, git clone https://github.com/LineGu/example.git

이때엔, 자신의 git 이름과 git token을 입력해야 Clone 진행이 가능할 것이다.

git token이 무엇인지 모른다면, 이 글을 참고하자. 필자는 귀찮아서 설명을 생략하겠다. (git은 2020년쯤 토큰을 이용한 방식으로 인증 방식을 변경하였다.)

clone이 완료되면, 아까 자신이 만든 폴더 안에 Clone받은 레포지토리의 폴더가 생겼을 것이다.

그렇다면 그 폴더로 들어가자.

  1. 필자를 따라 인스턴스 내에서 간단한 코딩을 하는 경우

1번 방법을 무시했어야한다.

지금 터미널의 상태는 자신이 만든 폴더 내부일 것이다.

다음 명령어로 파일을 만들자.

$ touch index.js

index.js파일에 내용을 넣자.

$ vi index.js

위 명령어를 치면 파일 내용을 입력할 수 있는 화면이 나올 것이다.

  • i 버튼을 눌러 insert 모드로 전환하자.
  • 아래 코드 or 자신이 만든 코드를 복붙하자.
const express = require('express');
const app = express();

const PORT = 8080;

function handleListen () {
    console.log("Listen on 3000 port");
}

function handleHome (req, res) {
    res.status(200).send('hello');
}

app.get('*', handleHome)

app.listen(PORT, handleListen);

복붙했다면 esc -> : -> wq -> enter를 순서대로 눌러 저장하자

express를 사용했으므로, 모듈을 설치해야한다.

우선 npm을 설치하고, 초기 설정해야한다.

그전에 우선 node부터 깔고 npm을 깔자.

다음 명령어들을 순서대로 치자.

$ sudo apt-get install -y curl 
$ sudo apt update
$ sudo curl -sL https://deb.nodesource.com/setup_16.x | sudo -E bash -
$ sudo apt-get install -y nodejs
$ sudo apt install npm

중간에 Yes or No를 물어본다면 Y 혹은 Yes를 쳐주면 된다.

이 과정에서, node 버전을 다른 버전으로 하고 싶다면, 16.x 부분을 다른 버전으로 바꿔주면 된다.

예를들어, 14버전이라면

$ sudo curl -sL https://deb.nodesource.com/setup_14.x | sudo -E bash -

이런식이다.

하지만 글을 쓰고 있는 시점인 2021.02.02 현재는 16버전이 LTS이므로 16을 까는게 좋다.
(TMI : LTS는 짝수 버전마다 이루어진다.)

이제 npm을 초기화해보자.

현재 터미널에서 위치는 자신이 아까 만든 폴더여야한다. (필자는 https-tutorial-folder)

다음 명령어를 치자

$ npm init

뭘 계속 물어볼 것이다. 그냥 다 엔터 치자. (어차피 추후에 package.json에서 변경 가능)

ls 명령어를 통해서 폴더 내 있는 것들을 확인해보면 package.json이 생겼을 것이다.

이제 express를 깔자.

$ npm i express

끝났다.

서버를 실행시키자.

$ node index.js

필자를 따라했다면, 서버가 열렸는 내용인 Listen on 3000 port 가 터미널에 찍힐 것이다.

여기서 이제 인스턴스로 접속해보자.

브라우저에 http://{인스턴스 퍼블릭키}:{자신의 서버 포트} 를 쳐보자

필자의 경우엔 http://13.209.64.194:3000이다.

기대와 달리 뭐가 계속 돌아가기만하고, 아무것도 안뜰것이다.

"서버를 열었는데, 왜 안보이지?""

이는 방화벽 때문이다. 인스턴스 자체에서 보안 설정을 따로 해주어, 3000포트 접근이 가능하게 열어줘야한다.

아까 각자가 생성한 인스턴스 페이지에서 보안 그룹을 탭으로 넘어가보자.

)

아마 특별하게 건들지 않았다면, 현재는 인바운드 규칙으로 22번 포트만 열려있을 것이다. 이 때문에 우리가 ssh 접속이 가능했던 것이다. (ssh는 22포트이므로)

인바운드 규칙이란, 우리가 인스턴스에 접속할 때 어떤 포트로 접속이 가능할지 정해주는 규칙이다.

이 규칙으로 특정 포트를 열어주지 않는다면 외부에서 해당 포트로 들어갈 수 없다.

다음으로 넘어가기 전에, 여기서 보안 그룹의 저 고유번호를 기억해두자.

이를 이용해서 이 인바운드 규칙을 재설정해줄 것이다.

왼쪽 탭에서 보안 그룹 탭으로 넘어가자.

여기서 우리 인스턴스가 현재 설정 중인 보안 그룹의 고유번호와 일치하는 곳을 찾아서 클릭하자.

이제 인바운드 규칙을 편집해주자.

아래 화면처럼 설정해주고, 저장해주자. (소스는 Anywhere-IPv4)
같은 포트에 대해 소소가 Anywhere-IPv6인 것도 추가해줘도 무방하다.

IP에 대해서 어떤 방식을 사용하냐가 중요한 것이다.

여기서 0.0.0.0/0은 어떤 IP든 허용해주겠다라는 것이다.

이제 3000포트로도 들어갈 수 있게 되었다.

이 과정에서 기존 보안그룹을 수정해주는게 아니라, 보안그룹을 새로 만들어서 그걸 인스턴스에 적용해줘도 된다.

이제 다시, 브라우저에 http://{인스턴스 퍼블릭키}:{자신의 서버 포트} 를 쳐보자

필자의 경우엔 http://13.209.64.194:3000이다.

Hello가 잘 출력될 것이다.

여기까지가 AWS EC2로 Node 서버 띄우는 방법이였다.

다음 시간에는 도메인을 구매하고, 이를 AWS Route53과 연결하는 법을 보겠다.

Comments