게시글 저장은 Firestore database 와 AWS S3에 이미지 업로드 되도록 했어서
RESTful API를 활용해 보기 위해서 게시글 조회와 검색 기능에 적용하였다.
1. 시작
Node.js 프로젝트 초기화
npm init -y
필요한 프레임워크 install
npm install express firebase-admin body-parser
npm install axios
npm start로 서버와 Metro bundle을 같이 실행시키기 위해서 package.json 코드를 아래처럼 수정하였다.
"scripts": {
"start": "concurrently \"react-native start\" \"npm run server\"",
"server": "node server.js"
},
2. firebase.js
- 프로젝트 루트 폴더에 firebase.js 파일을 생성
- Firebase - 프로젝트 설정 - 서비스 계정 - 새 비공개 키 생성을 통해 JSON 파일을 PC에 저장
const admin = require('project-admin');
const serviceAccount = require('json 파일 경로');
admin.initializeApp({
credential: admin.credential.cert(serviceAccount)
});
const db = admin.firestore();
module.exports = db;
3. RESTful API 서버 구축 - server.js
- 마찬가지로 프로젝트 루트 폴더에 server.js 파일 생성
- 앞서 설치한 express, body-parser 프레임워크 / firebase 데이터 베이스 연결 설정
- app = express 앱 생성 / 서버 실행될 포트 번호 3000
const express = require('express');
const bodyParser = require('body-parser');
const db = require('./firebase');
const app = express();
const port = 3000;
app.use(bodyParser.json());
- async : 비동기 함수를 만들 때 사용 ( req = 클라이언트에서 보내는 요청 / res = 클라이언트로 보내는 객체 )
- await : 데이터 베이스에서 meetings 컬렉션을 가져오는 작업은 비동기 작업 / 비동기 작업이 완료될 때까지 기다림
- createdAt : 게시글 데이터는 게시글 작성 날짜를 기준으로 내림차순으로 정렬
- snapshot.docs → Firestore에서 가져온 문서 목록 배열
- .map(doc => → 배열을 가공해서 원하는 형태의 리스트로 변환
- 데이터를 JSON 형태로 클라이언트에 전송
- app.listen : 서버 실행
app.get('/api/meetings', async (req, res) => {
try {
const snapshot = await db.collection('meetings')
.orderBy('createdAt', 'desc')
.get();
const meetings = snapshot.docs.map(doc => ({
id: doc.id,
...doc.data()
}));
res.status(200).json(meetings);
}
});
app.listen(port, () => {
console.log(`Server is running on port ${port}`);
});
4. AWS EC2 인스턴스 생성
- 인스턴스 시작
- 운영체제는 Amazon Linux로 할 것. 내 컴퓨터 운영체제를 선택하는게 아님
- 인스턴스 : t2.micro
- 키 페어 생성
- 왼쪽 메뉴에서 탄력적 IP 할당하기
- 탄력적 IP 주소 연결로 EC2와 연결해주기
- 인스턴스 - 보안 - 보안 그룹 - 인바운드 규칙 편집 - 규칙 추가 - 사용자 지정 TCP / 포트는 내가 생성한 3000 포트 / Anywhere-IPv4 로 만들고 규칙 저장하기
- 인스턴스 체크하고 연결 누르고 SSH 클라이언트 - 설명대로 연결하기 (powershell 에서 .pem 파일 있는 폴더로 이동해서 따라하면됨 ) (ssh -i "key.pem" ec2-user@ip주소)
그러면 Bad permissions. Try removing permissions for user 뭐시기 에러가 발생할텐데 cmd에서 권한을 다시 초기화하고 부여해야함. 파일 경로로 이동해서 아래 명령어대로 실행
icacls.exe "파일명.pem" /reset
icacls.exe "파일명.pem" /grant:r %username%:(R,W)
icacls.exe "파일명.pem" /inheritance:r
아래 블로그에서 도움을 받아 해결했음
EC2 SSH 접속 오류
EC2 인스턴스에 SSH접속시 위와같은 오류가 발생했다.구글링 결과 파일자체에 권한 설정이 너무 많이 부여됐기 때문에 권한설정을 제한해줘야 한다고 한다.권한 설정을 다시 지정하는 방법에는
velog.io
접속이 완료되었다면 Node.js 와 npm 을 EC2 인스턴스에 설치해야함 아래 명령어로 EC2 인스턴스에 node.js 설치
sudo yum update -y
sudo yum install -y gcc-c++ make
sudo curl --silent --location https://rpm.nodesource.com/setup_20.x | sudo bash -
sudo dnf install -y nodejs
- exit로 SSH 접속 해제할 수 있음
- 파일을 업로드할 때는 SSH 접속을 해제한 상태에서 업로드해야함
scp -i "C:/cliProject/key.pem" C:/cliProject/올릴 파일 ec2-user@IP:/home/ec2-user/
다시 SSH 접속해서 파일 저장되었는지 확인
ls -l /home/ec2-user/
실행 명령어
node server.js
그런데 이 상태에서 실행하면 express 등 패키지가 설치되어있지 않아서 에러가 발생할거임.
파일을 저장했던 프로젝트 디렉터리로 이동
cd /home/ec2-user/
필요했던 패키지들 설치
npm install express body-parser firebase-admin
업로드된 파일 코드 수정하는 법
SSH 접속되어 있는 상태에서 업로드했던 경로 파일을 nano
nano /home/ec2-user/firebase.js
아래처럼 열리면 수정할 부분 수정하고 Ctrl + X -> Y -> Enter 로 저장
모두 수정하고 EC2 인스턴스에 제대로 파일들이 업로드 되었다면 React Native 프로젝트에서도 코드 수정 하기
const response = await axios.get("http://EC2 탄력적IP:포트번호/api/meetings");
5. 서버 자동 시작
컴퓨터를 껐다 키면 다시 powershell 에서 ssh를 해주고 서버를 켜줘야 정상적으로 에뮬레이터에서 게시글 조회, 검색이 되는 불편함을 줄이기 위해 EC2 서버를 재시작하거나 컴퓨터를 재부팅해도 자동으로 서버가 시작되도록 해보자
1. SSH로 EC2 접속
ssh -i "your-key.pem" ubuntu@your-ec2-ip
2. server.js 파일을 배포했던 경로로 이동
cd /home/ec2-user
3. systemd 서비스 파일을 /etc/systemd/system/ 경로에 생성
sudo nano /etc/systemd/system/myapp.service
4. myapp.service 작성
[Unit]
Description=Firestore API Server
After=network.target
[Service]
ExecStart=/usr/bin/node /home/ec2-user/server.js
WorkingDirectory=/home/ec2-user
StandardOutput=inherit
StandardError=inherit
Restart=always
User=ec2-user
Group=ec2-user
[Install]
WantedBy=multi-user.target
다 작성했으면 시스템에 새로운 서비스를 인식시키기 위해 systemd를 리로드
sudo systemctl daemon-reload
서버 시작
sudo systemctl start myapp.service
서버가 잘 실행중인지 확인
sudo systemctl status myapp.service
로그 그만 보고 다시 명령어 입력하려면 q를 누르면 된다.
부팅 시 자동으로 시작되도록 설정
sudo systemctl enable myapp.service
끗
'AWS :' 카테고리의 다른 글
[FN] 모임 신청 개발 일지[2] / notifee, API - EC2 배포 (2) | 2025.02.23 |
---|---|
[FN] AWS S3, AWS IAM (8) | 2025.01.19 |