본문 바로가기

서버관련/아마존 서버 (배포 관련)

EC2 배포 방법

EC2에 배포 하기 전에 먼저 IAM 생성 및 AdministratorAccess(전체 관리자 권한) 권한을 부여해준다.

 

■ EC2 AWS 초기 세팅

1. EC2화면에서, 인스턴스 시작을 누른다. (인스턴스 = 컴퓨터)

2. 적절한 이름 및 AMI는 ubuntu를 선택

3. 나머지는 프리티어에 맞게 선택

4. 보안그룹은 아래와 같이 세팅한다. (AWS 지역별로 별도 세팅)

 

 

- 22포트를 통해 SSH로 접속 가능

- 4000포트를 통해 통해 개발 모드일때 접속 가능

- 80포트를 통해 프로덕션 환경에서 외부 http 공개 주소를 통해 접속 가능 (추가 설명 예정)

 

5. 키페어는 나중에 내 개인 노트북이 있을 때 발급받고, 일단은 키 페어 없이 진행

1) 키페어가 있다면, 내 개인 노트북에 있는 터미널을 통해 ec2에 접속 할 수 있다. (mac과 windows 방법 약간 다름)

2) 키페어가 없다면, aws 콘솔에서 직접 컨트롤 할 수 있다. (약간 느림)

 

■ EC2 실행 및 세팅

1. 인스턴스 연결 (직접 AWS 콘솔에서 접근하는걸로 사용하자. 찾아보니, 추후 만약 관리자가 많아질경우 SESSION MANAGER를 통해 접속하는게 모든 로그에도 남고 좋다고 함, SSH는 개인 노트북에서 접속 가능)

실행 후, EC2 컴퓨터에는 거의 아무것도 설치가 안된 상태이기 때문에 필요한 것들을 설치해주자. (git은 초기에 설치되어있음)

*sudo 명령어는 관리자 권한을 가지게 됨

 

1. sudo apt-get update : os 업데이트

2. sudo apt-get upgrade: 업그레이드 (정확히 모름 일단 입력)

3. sudo apt-get npm -y (y는 모든 질문에 yes 입력한다는 뜻)

-이 후 node -v와 nodejs -v를 통해 설치 여부를 재확인을 해보자.

 

4. git clone 주소 : 가져와야할 git 을 ec2 컴퓨터에 clone해옴

5. cd 폴더명으로 해당 프로젝트 폴더로 이동

-ls를 입력하면 현재 폴더의 파일들을 볼 수 있다.

6. npm i 입력

7. nano .env 입력 및 환경변수값 수동 입력 (nano는 파일 생성 및 수정 가능, 컨트롤 s 저장, 컨트롤 x 나오기)

- 이 때, 내 컴퓨터의 개발 환경에서는 PORT를 입력하지 않지만, 배포 환경에서는 PORT=80을 입력해야 한다.

아래 코드는 server.js파일인데, listen 부분을 통해 배포 환경에서만 80포트만 접속 허용가능하다. (80은 이전 보안설정에서 이미 허용 가능하게 세팅 완료)

require("dotenv").config();
import { ApolloServer } from "@apollo/server";
import { typeDefs, resolvers } from "./schema";
import { startStandaloneServer } from "@apollo/server/standalone";

import { getUser } from "./users/users.utils";

const server = new ApolloServer({
  typeDefs,
  resolvers,
});

const PORT = process.env.PORT || 4000;

const startServer = async () => {
  try {
    const { url } = await startStandaloneServer(server, {
      listen: { port: PORT },
      context: async ({ req }) => {
        return {
          loggedInUser: await getUser(req.headers.token),
        };
      },
    });

    console.log(`🚀 Server is running ${url}`);
  } catch (error) {
    console.error("Error starting the server:", error);
  }
};

startServer();

 

여기까지 하고, sudo npm run start를 하게 되면 build된 폴더가 실행되고, 퍼블릭 주소로 접속이 가능해진다.

하지만, 문제는 계속 이거를 켜둘 수가 없기 때문에 pm2를 사용해주어야 한다. pm2는 계속 서버를 실행할 수 있게 해주고, 여러 기능들이 존재 하는 것 같다.

 

8. sudo npm install -g pm2(sudo를 통해 글로벌로 설치해야함)

9. sudo pm2 start build/server.js (서버 파일 실행) / 앞에 sudo를 붙이는 이유는 80포트는 sudo를 통해서 실행이 된다.

- 이 후 퍼블릭 주소로 접속이 가능하다.

- 이러면 pm2를 통해 80포트가 계속 실행되고 있는 것이다.

- 추 후 만약에 ec2 환경에서 npm run start나 npm run dev로 새로 서버를 열려고 하면 이미 80포트가 실행중이라고 뜰 것이다. 해당 명령어를 통해 확인 가능 sudo lsof -i :80

이 때, 해당 80포트를 죽이려면 일반적으로, sudo kill -9 <PID> 를 입력하면 되는데, 나는 pm2를 sudo로 실행중이기 때문에 이렇게 강제로 80포트를 죽이더라도 바로 다른 PID로 자동생성이 된다. 이럴 때는, sudo npx pm2 kill를 통해 루트 권한으로 실행중인 pm2를 삭제해주면 해결 된다.

 

10. 추 후 코드가 업데이트 되면, 내 컴퓨터에서 개발 이 후 git push를 해주고, ec2 에서 git pull 해준 후에 sudo pm2 restart server해주면 된다.

 

■ 추가 세팅

1. 만약 기존 인스턴스가 중지or삭제하게 되게 되면 퍼블릭 ip가 바뀌게 된다. 그럼 기존 도메인주소로 접속 할 수가 없다. 이러한 문제를 방지하기 위해, 고정 ip로 바꿔주자. 아래 탄력적 ip 클릭

 

2. 탄력적 ip 주소 할당 버튼 클릭

3. 아래 화면 나오면, 체크해주고, 작업 -> 탄력적 ip 주소 연결

 

4. 인스턴스 연결 및 재연결 체크 및 연결 버튼 클릭

 

이제 해당 백엔드 퍼블릭 주소를, 프론트에 연결해주면 끝이다. 완료!