AWS

[ AWS ] - ec2 이용하여 배포하기

algml0703 2022. 4. 5. 23:30
반응형

가정 : aws의 계정이 존재하고 로그인이 되어있음을 전제하였다.

1. 콘솔에 ec2를 입력 후 EC2 클라우드의 가상 서버라고 되어 있는 것을 클릭한다.

2. 지역은 서울(ap-northeast-2)로 한 후, 왼쪽의 카테고리 목록에서 인스턴스-인스턴스를 클릭한다.

// 지역은 달라져도 큰 상관없다. 하지만 해당 서버가 실제 이용되는 지역으로 설정하는 것이 좋다.

3. 우측 상단의 인스턴스 시작을 클릭한다.

4. 이름에는 해당 인스턴스 구분명을 적고 애플리케이션 및 OS 이미지에서는 Ubuntu를 선택하고, 나머지는 기본값을 그대로 둔 후 인스턴스 시작을 클릭한다.

5. 아래와 같은 창이 나오면 해당 키페어 이름을 적고, 나머지는 기본값 그대로 한 후 키 페어 생성을 클릭한다.

6.  이와 같이 되면 인스턴스가 생성된 것이다.

7.  해당 인스턴스 창에 들어간 후 우측 상단의 연결을 클릭한다.

8. ssh 클라이언트라고 되어 있는 부분을 클릭하고 예 ssh -i "azit ~~~" 부분을 복사한다.

9. 아까 5.에서 생서된 .pem으로 된 키페어 파일을 인스턴스를 이용하려고 하는 곳의 동일 경로에 둔후, 8.에서 복사한 명령어를 터미널에 입력한다.  해당 명령어를 터미널에 입력하면 아래와 같이 접근이 거부되는 것을 확인할 수 있는데, 이는 키페어파일에 대한 권한을 수정하여 주면 된다. 

아래의 명령어를 본인의 pem 파일명으로만 바꿔서 터미널에 입력한다.

> chmod 400 [key_name].pem
// 나의 경우 chmod 400 [azit-pem].pem

아래와 같이 나오면 접속이 완료된 것이다.


기본 세팅 + node.js + mysql 설치

10.  위와 같이 접속된 하면에서 아래의 명령어들을 차례로 입력한다.

> sudo apt-get update
> sudo apt-get install -y build-essential
> sudo apt-get install curl
> curl -sL http://deb.nodesource.com/setup_14.x | sudo -E bash --
> sudo apt-get install -y nodejs
> node -v.    →  node.js 가 제대로 설치되었는지 확인
> sudo apt-get install mariadb-server
> sudo apt-get install mariadb-client 
// 질문이 나오면 무조건 y 누른다.
> mariadb --version     →  mysql이 제대로 설치되었는지 확인

mariadb 관련 설정 
> sudo su    → 관리자로 전환
> mysql_secure_installation

위의 명령어까지 입력시 아래와 같은 질문들이 나오는데 

enter

y

y

mysql 비밀번호 설정하려는 것으로 입력한다.

y

y

y

y

> mysql -uroot -p[password] 
// mysql 비밀번호로 설정하는 것을 입력한다.

아래와 같이 나오면 성공적으로 비밀번호가 변경된 것이다.

> use mysql
> SELECT user, host, plugin FROM user;

위의 명령어 입력시 아래와 같이 나오면 된다.

위와 같이 나오지 않는 경우 
> UPDATE user SET plugin='mysql_native_password' WHERE user='root';
// 바꾸어 준 후 다시 확인
> SELECT user, host, plugin FROM user;
> FLUSH PRIVILEGES;
> ctrl + c
> exit 
// 다시 초록 글씨가 되도록 돌아온다. 

프로젝트 클론

> git clone [배포하려는 프로젝트 git 주소]

해당 프로젝트에 .env로 관리하는 환경변수가 있다면 vi.env로 파일을 만들어 추가해준다.

해당 프로젝트 실행시키는 포트 번호를 80으로 바꾸어 준다.

11. 포트 열어주기 

인스턴스 - 보안 - 보안 그룹을 클릭한다.

12. 인바운드 규칙 편집 클릭 

아래와 같이 추가해준 후 규칙 저장 클릭한다.

13. 해당 프로젝트 sudo npm run start 를 통해 실행시킨 후 해당 인스턴스의 ip를 통해 들어가면 완료


** 무중단 서버 실행

> sudo npm run start&

위와 같이 한 경우 해당 인스턴스를 나오면 서버가 꺼지게 된다.

pm2를 활용한 무중단 서버 실행

> sudo npm install -g pm2
> sudo npx pm2 start server.js

pm2 명령어
> sudo npx pm2 start server.js
> sudo npx pm2 stop server.js
> sudo npx pm2 monit
> sudo npx pm2 kill
> sudo npx pm2 list
> sudo npx pm2 status

 

======================ERROR ======================

1. typescript에서 styled-component 에 props에 따른 값 적용한 경우 발생하는 에러

// 아래와 같이 props 값에 대해 type을 명시해줌

const SellTab = Styled.div<{flag:boolean}>`
    cursor:pointer;
    font-size: 23px;
    color: ${props => (props.flag == true ? '#000000b3' : '#a0a0a0b3')};
    font-weight: ${props => (props.flag == true ? 'bold' : 'none')};
`

2. ssh 접속 시 connection timed out 나오면서 접속되지 않는 경우

1 ) 볼륨교체

참고 블로그https://yvvyoon.github.io/ubuntu/ufw-enable-ssh-timeout/
aws 참고
https://aws.amazon.com/ko/premiumsupport/knowledge-center/ec2-linux-resource-over-utilization/


3. npm run build 중 멈추는 현상

// 메모리 부족으로 인한 문제

1) package.json파일 수정

아래와 같은 package.json파일의 scripts 부분의 내용을 수정

  "scripts": {
    "dev": "next",
    "build": " GENERATE_SOURCEMAP=false next build",
    "start": "next start",
    "link-contracts": "cd lib && ln -s ../../build/contracts contracts"
  },
    // GENERATE_SOURCEMAP=false  --> 이부분이 추가된 내용

2) 가상메모리 공간 만들어주기

1. sudo dd if=/dev/zero of=/mnt/swapfile bs=1M count=2048
2. sudo mkswap /mnt/swapfile
3. sudo swapon /mnt/swapfile

출처: https://dundung.tistory.com/284 [DunDung] `


4. build후 npm run start까지 완료된 후에 해당 주소로 들어가도 화면이 나오는 않는 현상

// 포트 문제 추정
아래의 명령어 입력
> sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3000
-- 80번 포트를 3000번 포트로 리다이렉트 해주겠다는 의미인 듯...


5. ssh 접속시 에러

someone could be eavesdropping on you right now (man-in-the-middle attack)!
해결
// ssh 접속 전 터미널에 아래의 명령어 입력
// ip에는 접속하려는 ip를 넣어줌
>ssh-keygen -R [ IP or DomainName]


6. Error: listen EACCES: permission denied 0.0.0.0:80

npm run start 할때 sudo 를 붙이면 해결된다.

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

반응형