AWS에서 제공하는 개발자 도구.
NodeJs, 웹 브라우저, React Native 용이 있다.
AWS SDK를 사용하여 JavaScript 코드로 AWS에서 제공하는 기능들을 사용할 수 있다.
AWS 외부에서 내 계정으로 AWS 기능을 이용하기 위해
AWS IAM 사용자를 생성하고
IAM 사용자 인증 정보를 이용하여 AWS 인가를 받는다.
설치 :
npm install @aws-sdk/client-s3
- 과거 사용하던 npm install aws-sdk는 현재 서비스하지 않는다.
import { EC2Client, DescribeInstancesCommand, StartInstancesCommand, StopInstancesCommand, RunInstancesCommand, TerminateInstancesCommand, } from '@aws-sdk/client-ec2';
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");