Node.js 인터뷰 질문 68
질문: Node.js 애플리케이션을 AWS와 통합하는 방법에 대해 설명해주세요.
답변:
Node.js 애플리케이션을 AWS(Amazon Web Services)와 통합하는 것은 확장성, 안정성 및 다양한 기능을 활용할 수 있는 효과적인 방법입니다. 주요 통합 방법과 서비스에 대해 살펴보겠습니다.
1. AWS EC2를 사용한 Node.js 배포
Amazon EC2(Elastic Compute Cloud)는 가상 서버에서 Node.js 애플리케이션을 실행할 수 있게 해줍니다.
// 기본적인 EC2 설정을 위한 AWS SDK 코드 예시
const AWS = require("aws-sdk");
const ec2 = new AWS.EC2({ region: "us-east-1" });
// 인스턴스 시작 파라미터
const params = {
ImageId: "ami-0c55b159cbfafe1f0", // Amazon Linux 2 AMI
InstanceType: "t2.micro",
MinCount: 1,
MaxCount: 1,
KeyName: "my-key-pair",
SecurityGroupIds: ["sg-12345678"],
};
// 인스턴스 시작
ec2.runInstances(params, (err, data) => {
if (err) {
console.error("인스턴스 생성 실패", err);
} else {
console.log("인스턴스 생성 성공", data.Instances[0].InstanceId);
}
});
EC2 인스턴스 설정 후에는 SSH를 통해 접속하여 Node.js를 설치하고 애플리케이션을 배포할 수 있습니다:
# Node.js 설치 (Amazon Linux 2)
sudo yum update -y
sudo yum install -y nodejs npm
# 애플리케이션 코드 복제
git clone https://github.com/your-username/your-repo.git
cd your-repo
# 의존성 설치 및 서버 실행
npm install
npm start
프로덕션 환경에서는 PM2와 같은 프로세스 관리자를 사용하는 것이 좋습니다:
# PM2 설치 및 설정
npm install -g pm2
pm2 start app.js --name "my-app"
pm2 startup
pm2 save
2. AWS Lambda와 서버리스 아키텍처
AWS Lambda를 사용하면 서버 관리 없이 코드를 실행할 수 있습니다.
// AWS Lambda 함수 예시
exports.handler = async (event) => {
try {
// 요청 파라미터 파싱
const name = event.queryStringParameters?.name || "World";
// 응답 생성
const response = {
statusCode: 200,
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
message: `Hello, ${name}!`,
timestamp: new Date().toISOString(),
}),
};
return response;
} catch (error) {
return {
statusCode: 500,
body: JSON.stringify({ error: error.message }),
};
}
};
Node.js 애플리케이션을 Lambda로 배포하기 위한 serverless.yml
설정:
service: my-nodejs-api
provider:
name: aws
runtime: nodejs14.x
region: us-east-1
functions:
hello:
handler: handler.hello
events:
- http:
path: hello
method: get
3. AWS Elastic Beanstalk을 사용한 간편 배포
Elastic Beanstalk은 인프라 관리를 추상화하여 배포 프로세스를 단순화합니다.
// Elastic Beanstalk 설정을 위한 package.json 예시
{
"name": "my-app",
"version": "1.0.0",
"scripts": {
"start": "node app.js"
},
"engines": {
"node": "14.x"
}
}
Elastic Beanstalk 환경 설정을 위한 .ebextensions/nodecommand.config
:
option_settings:
aws:elasticbeanstalk:container:nodejs:
NodeCommand: "npm start"
aws:elasticbeanstalk:container:nodejs:staticfiles:
/public: public
4. 데이터베이스 통합 (RDS, DynamoDB)
4.1 Amazon RDS (관계형 데이터베이스)
// MySQL RDS 연결 예시
const mysql = require("mysql2/promise");
async function connectToRDS() {
const connection = await mysql.createConnection({
host: process.env.RDS_HOSTNAME,
user: process.env.RDS_USERNAME,
password: process.env.RDS_PASSWORD,
database: process.env.RDS_DB_NAME,
port: process.env.RDS_PORT || 3306,
});
console.log("RDS 데이터베이스에 연결되었습니다");
return connection;
}
// 사용 예시
async function queryUsers() {
const connection = await connectToRDS();
try {
const [rows] = await connection.execute("SELECT * FROM users");
return rows;
} finally {
connection.end();
}
}
4.2 Amazon DynamoDB (NoSQL 데이터베이스)
// DynamoDB 연결 및 사용 예시
const AWS = require("aws-sdk");
AWS.config.update({ region: "us-east-1" });
const dynamoDB = new AWS.DynamoDB.DocumentClient();
// 항목 추가
async function addUser(user) {
const params = {
TableName: "Users",
Item: {
userId: user.id,
name: user.name,
email: user.email,
createdAt: new Date().toISOString(),
},
};
try {
await dynamoDB.put(params).promise();
console.log("사용자가 추가되었습니다:", user.id);
return true;
} catch (error) {
console.error("사용자 추가 실패:", error);
throw error;
}
}
// 항목 조회
async function getUser(userId) {
const params = {
TableName: "Users",
Key: {
userId: userId,
},
};
try {
const result = await dynamoDB.get(params).promise();
return result.Item;
} catch (error) {
console.error("사용자 조회 실패:", error);
throw error;
}
}
5. 파일 저장소 (S3)
Amazon S3(Simple Storage Service)를 사용한 파일 업로드 및 다운로드:
const AWS = require("aws-sdk");
const fs = require("fs");
// S3 클라이언트 설정
const s3 = new AWS.S3({
region: "us-east-1",
});
// 파일 업로드
async function uploadFile(filePath, bucketName, key) {
try {
const fileContent = fs.readFileSync(filePath);
const params = {
Bucket: bucketName,
Key: key,
Body: fileContent,
};
const result = await s3.upload(params).promise();
console.log("파일 업로드 성공:", result.Location);
return result.Location;
} catch (error) {
console.error("파일 업로드 실패:", error);
throw error;
}
}
// 파일 다운로드
async function downloadFile(bucketName, key, destinationPath) {
try {
const params = {
Bucket: bucketName,
Key: key,
};
const data = await s3.getObject(params).promise();
fs.writeFileSync(destinationPath, data.Body);
console.log("파일 다운로드 성공:", destinationPath);
return true;
} catch (error) {
console.error("파일 다운로드 실패:", error);
throw error;
}
}
6. 메시징 서비스 (SQS, SNS)
6.1 Amazon SQS (Simple Queue Service)
const AWS = require("aws-sdk");
AWS.config.update({ region: "us-east-1" });
const sqs = new AWS.SQS();
// 메시지 전송
async function sendMessage(queueUrl, messageBody) {
const params = {
QueueUrl: queueUrl,
MessageBody: JSON.stringify(messageBody),
};
try {
const data = await sqs.sendMessage(params).promise();
console.log("메시지 전송 성공:", data.MessageId);
return data.MessageId;
} catch (error) {
console.error("메시지 전송 실패:", error);
throw error;
}
}
// 메시지 수신 및 처리
async function receiveAndProcessMessages(queueUrl) {
const params = {
QueueUrl: queueUrl,
MaxNumberOfMessages: 10,
WaitTimeSeconds: 20,
};
try {
const data = await sqs.receiveMessage(params).promise();
if (!data.Messages || data.Messages.length === 0) {
console.log("처리할 메시지가 없습니다");
return [];
}
const processedMessages = [];
for (const message of data.Messages) {
// 메시지 처리 로직
console.log("메시지 처리:", message.Body);
// 처리 후 메시지 삭제
await sqs
.deleteMessage({
QueueUrl: queueUrl,
ReceiptHandle: message.ReceiptHandle,
})
.promise();
processedMessages.push(message);
}
return processedMessages;
} catch (error) {
console.error("메시지 수신 또는 처리 실패:", error);
throw error;
}
}
요약
Node.js 애플리케이션을 AWS와 통합하는 주요 방법:
- EC2: 가상 서버에 Node.js 애플리케이션 배포
- Lambda: 서버리스 아키텍처로 함수 실행
- Elastic Beanstalk: 간소화된 배포 및 관리
- 데이터베이스 통합: RDS(관계형) 또는 DynamoDB(NoSQL)
- S3: 파일 저장 및 정적 웹사이트 호스팅
- 메시징 서비스: SQS(대기열) 및 SNS(알림)
이러한 AWS 서비스를 효과적으로 활용하면 확장성이 뛰어나고 안정적인 Node.js 애플리케이션을 구축할 수 있습니다. AWS SDK를 사용하여 이러한 서비스와 프로그래밍 방식으로 통합하고, IAM을 통해 적절한 보안 권한을 설정하는 것이 중요합니다.