[NodeJs]AWS SDK 사용해서 서버 생성하기

김동욱·2025년 2월 17일

AWS

목록 보기
4/4

AWS SDK

AWS에서 제공하는 개발자 도구.
NodeJs, 웹 브라우저, React Native 용이 있다.
AWS SDK를 사용하여 JavaScript 코드로 AWS에서 제공하는 기능들을 사용할 수 있다.


IAM 사용자 인증

AWS 외부에서 내 계정으로 AWS 기능을 이용하기 위해
AWS IAM 사용자를 생성하고
IAM 사용자 인증 정보를 이용하여 AWS 인가를 받는다.


설치 및 import

설치 : npm install @aws-sdk/client-s3

  • 과거 사용하던 npm install aws-sdk는 현재 서비스하지 않는다.
import {
  EC2Client,
  DescribeInstancesCommand,
  StartInstancesCommand,
  StopInstancesCommand,
  RunInstancesCommand,
  TerminateInstancesCommand,
} from '@aws-sdk/client-ec2';

EC2Client

const ec2Client = new EC2Client({
  region: 'ap-northeast-2',
  credentials: {
    accessKeyId: config.aws.accessKeyId,
    secretAccessKey: config.aws.secretAccessKey,
  },
});

인스턴스 확인

describeInstances: () => {
  const describe = new DescribeInstancesCommand({});
  ec2Client.send(describe).then(
    (data) => {
      let log = `EC2 인스턴스 : \n`;
      data.Reservations.forEach((resv) =>
        resv.Instances.forEach((instance) => {
          log += `{\n  InstanceId: ${instance.InstanceId}`;
          log += `\n  State: ${instance.State.Name}`;
          log += `\n  PublicIpAddress: ${instance.PublicIpAddress}`;
          log += `\n  ImageId: ${instance.ImageId}`;
          log += `\n  AvailabilityZone:  ${instance.Placement.AvailabilityZone}`;
          log += `\n}\n`;
        }),
      );
      console.log(log);
    },
    (error) => {
      console.log('EC2 인스턴스 조회 실패', error);
    },
  );
},

인스턴스 시작

startInstances: (instanceId) => {
  const start = new StartInstancesCommand({ InstanceIds: [instanceId] });
  ec2Client.send(start).then(
    () => console.log('인스턴스 실행'),
    (error) => console.log('인스턴스 실행 실패', error),
  );
},

인스턴스 중지

stopInstances: (instanceId) => {
  const stop = new StopInstancesCommand({ InstanceIds: [instanceId] });
  ec2Client.send(stop).then(
    () => console.log('인스턴스 중지'),
    (error) => console.log('인스턴스 중지 실패', error),
  );
},

인스턴스 생성 (구동)

runInstances: (type) => {
  //const userDataBase64 = type===ec2Types.town?townUserDataBase64:null;
  const userDataScript = setupPortInUserDataScript(3001);
  const userDataBase64 = encodingToBase64(userDataScript);
  const run = new RunInstancesCommand({
    ImageId: 'ami-024ea438ab0376a47', // AMI ID
    InstanceType: 't2.micro',
    MinCount: 1,
    MaxCount: 1,
    KeyName: config.aws.keyName,
    SecurityGroupIds: [config.aws.securityGroupId],   // inbound TCP:3000 0.0.0.0/0
    UserData: userDataBase64,
  });
  ec2Client.send(run).then(
    (data) => {
      // #ADD 새로 생성된 EC2 instance의 id를 어떻게 관리할 것인가?
      const instanceId = data.Instances[0].InstanceId;
      const state = data.Instances[0].State.Name;
      const publicDnsName = data.Instances[0].PublicDnsName;
      //ec2Instances.set('테스트서버', { instanceId, state, publicIpAddress });
      setupInstance(publicDnsName);
      console.log('인스턴스 시작');
      console.log(`instanceId: ${instanceId}`)
    },
    (error) => console.log('인스턴스 시작 실패', error),
  );
},

인스턴스 종료

terminateInstances: (instanceId) => {
  const terminate = new TerminateInstancesCommand({
    InstanceIds: [instanceId],
  });
  ec2Client.send(terminate).then(
    () => console.log('인스턴스 종료'),
    (error) => console.log('인스턴스 종료 실패', error),
  );
},

사용자 정의 시작 템플릿 구성

user-data.sh 작성

#!/bin/bash

# nodejs 설치
curl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -
sudo apt-get install -y nodejs

# pm2 설치
sodo -s
npm install pm2 -g

# 프로젝트 설치
cd /home/ubuntu
git clone -b dev https://github.com/dkcp/${my-project}.git
cd ${my-project}
npm install

# pm2로 프로젝트 실행
pm2 start src/server.js

파일 로드 및 base64로 인코딩

import fs from 'fs';
import path from 'path';
import { fileURLToPath } from 'url';

const __filename = fileURLToPath(import.meta.url);
const __dirname = path.dirname(__filename);
const userDataScript = fs.readFileSync(path.join(__dirname, "user-data.sh"), "utf8");
const userDataBase64 = Buffer.from(userDataScript).toString("base64");
profile
갓겜만들어야지

0개의 댓글