Amazon EC2를 이용한 배포 (인스턴스 생성 ~ 이슈 발생)

1. AWS EC2 인스턴스 생성
-
보안 그룹 추가: 인바운드 규칙에 ssh, http, https 추가
-
pem키 생성
-
ssh 등록
-
pem키 권한 변경
chmod 400 EC2.pem
- 맥 유저
ssh -i [pem key 파일 경로] [사용자 이름]@[Public IP 주소 또는 DNS 이름]
- 대부분의 Linux AMI의 경우, 기본 사용자 이름은 다음과 같다.
- Amazon Linux, CentOS, Red Hat Enterprise Linux (RHEL): ec2-user
- Ubuntu: ubuntu
- Debian: admin
- Fedora: fedora
ssh -i ~/Downloads/EC2.pem ubuntu@123.45.67.89
- 윈도우 유저
- Putty-gen을 통해 pem파일을 pky파일로 변경한다.
- Putty를 통해 SSH에 접속한다.
- ssh 접속
2. Ubuntu Instance
우분투 서버에 node와 git을 설치한다
# 시스템에 설치된 패키지 정보를 최신 상태로 업데이트
sudo apt update
# Node.js의 저장소를 추가
curl -sL https://deb.nodesource.com/setup_lts.x | sudo -E bash -
# 설치
sudo apt-get install -y nodejs
sudo apt install git
git clone ...
npm install
3. .env파일 만들기
vi .env
i
코드 붙여넣기
esc
:
wq enter
[이슈 발생] 포트 권한 오류(permission denied)
80번 포트 permission 오류
Emitted 'error' event on Server instance at:
at emitErrorNT (node:net:1337:8)
at processTicksAndRejections (node:internal/process/task_queues:81:21) {
code: 'EACCES',
errno: -13,
syscall: 'listen',
address: '0.0.0.0',
port: 80
}
well known port인 1024미만 port를 사용하려면 루트권한으로 실행 해야한다.
sudo npm start을 해야한다.
1) sudo 명령어 먹게하기
node가 설치 되어 있는 경로와 연결시킨다.
which node로 경로파악(절대경로로 씀)
~/.nvm/versions/node/v15.13.0/bin/node
sudo ln -s /home/ec2-user/.nvm/versions/node/v15.13.0/bin/node /usr/local/bin
sudo ln -s /home/ec2-user/.nvm/versions/node/v15.13.0/bin/npm /usr/local/bin
cd /usr/local/bin
// ls -al로 파란색 글자로 링크 연결됐나 확인하기
2) secure path 설정을 바꿔준다.
sudo visudo
/ (검색)
/secure_path
~bin:/usr/local/bin
폴더로 가서 실행한다.
cd /home/ec2-user/Quote-Owl
sudo npm start
sudo 오류
여전히 permision denied오류와 함께 더불어 새로운 sudo오류가 생겼다.sudo npm start를 하고 나서 모든 package.json 명령어에 위와 같은 에러가 추가로 뜬다. 루트 폴더로 접근을 못해서 발생하는 것 같다.
glob error [Error: EACCES: permission denied, scandir '/root/.npm/_logs'] {
errno: -13,
code: 'EACCES',
syscall: 'scandir',
path: '/root/.npm/_logs'
}
방법1. netstat -ano 모든 포트 확인: 이미 80번을 사용하고 있는 포트가 있는지 확인한다.
이 문제는 아니였다.
방법2. 코드가 꼬인건가?
Terminate instance -> Launch Instance
인스턴스 삭제하고 다시 생성한다.
이 문제도 아니였다.
방법3. npm으로 실행하고 패키지를 글로벌하게 설치하기
npm config set user 0
npm config set unsafe-perm true
npm install -g package
--> 어떤 것도 해결하지 못함
방법4.
sudo npm install --save -g --unsafe-perm=true --allow-root
--> 어떤 것도 해결하지 못함
방법5.
sudo문제? sudo node a.js는 잘 돌아간다. 이 문제도 아니다.
찾아보니 80번 포트를 루트권한을 주어 바로 연결하는 미개한 방법은 사용하지 않는다고 한다.
포트포워딩을 통해 80번 포트로 우회해주는 방법을 선택한다.
포트 포워딩
포트포워딩 설정 코드
sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3001
포트 포워딩 취소 코드
sudo iptables -D PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3001
포트 포워딩 상태 확인 코드
sudo iptables -t nat -L
80번 포트로 접속하면 3001번 포트로 포워딩 해주는 것 까지 성공했다.
하지만 아래와 같은 두 오류가 발생했다.
Failed to load resource: net::ERR_CONNECTION_REFUSED
net::ERR_CONNECTION_REFUSED
홈HTML에서 모든 소스파일(링크로 설정한 사진 파일, JS파일, CSS파일) 모두 가져오지 못했다.
이 문제는 다음 링크에서 해결한다.