ec2 인스턴스에 node.js 올리기


ssh로 ec2 인스턴스에 접속
[ec2-user@ip-172-31-40-225 ~]$ whoami
ec2-user

nvm 바이너리를 이용하여 원하는 번전의 node.js를 스위칭하며 사용가능
https://github.com/nvm-sh/nvm 

[ec2-user@ip-172-31-40-225 ~]$ curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.39.3/install.sh | bash
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 15916  100 15916    0     0  48441      0 --:--:-- --:--:-- --:--:-- 48376
=> Downloading nvm as script to '/home/ec2-user/.nvm'

=> Appending nvm source string to /home/ec2-user/.bashrc
=> Appending bash_completion source string to /home/ec2-user/.bashrc
=> Close and reopen your terminal to start using nvm or run the following to use it now:

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"  # This loads nvm
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"  # This loads nvm bash_completion


[ec2-user@ip-172-31-40-225 ~]$ export NVM_DIR="$([ -z "${XDG_CONFIG_HOME-}" ] && printf %s "${HOME}/.nvm" || printf %s "${XDG_CONFIG_HOME}/nvm")"
VM_DIR/nv[ec2-user@ip-172-31-40-225 ~]$ [ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh" # This loads nvm


nvm을 깔았으면 앞으로 어떤 버전을 사용할 지 알려워야 한다.
nvm install 명령어를 사용해서 설치한다.
lts -> 안정된 릴리즈 버전

[ec2-user@ip-172-31-40-225 ~]$ nvm install --lts
Installing latest LTS version.
Downloading and installing node v18.15.0...
Downloading https://nodejs.org/dist/v18.15.0/node-v18.15.0-linux-x64.tar.xz...
################################################################################################# 100.0%
Computing checksum with sha256sum
Checksums matched!
Now using node v18.15.0 (npm v9.5.0)
Creating default alias: default -> lts/* (-> v18.15.0)

nvm use 명령어를 사용해서 스위칭한다.

[ec2-user@ip-172-31-40-225 ~]$ nvm use --lts
Now using node v18.15.0 (npm v9.5.0)
[ec2-user@ip-172-31-40-225 ~]$ node -v
v18.15.0
[ec2-user@ip-172-31-40-225 ~]$ npm -v
9.5.0

[ec2-user@ip-172-31-40-225 ~]$ mkdir app
[ec2-user@ip-172-31-40-225 ~]$ cd app

npm을 명령어를 통해 현재 폴더에 express 패키지 설치한다. 
[ec2-user@ip-172-31-40-225 app]$ npm i -S express

added 57 packages in 5s

7 packages are looking for funding
  run `npm fund` for details
npm notice
npm notice New minor version of npm available! 9.5.0 -> 9.6.2
npm notice Changelog: https://github.com/npm/cli/releases/tag/v9.6.2
npm notice Run npm install -g npm@9.6.2 to update!
npm notice
[ec2-user@ip-172-31-40-225 app]$ ls
node_modules  package-lock.json  package.json

[ec2-user@ip-172-31-40-225 app]$ vi index.js
[ec2-user@ip-172-31-40-225 app]$ cat index.js
const express = require('express')
const app = express()

app.get('', async (req, res) => {
        res.send('Hello World\n')
})

app.listen(3000, () => {
        console.log('App is listening 3000 port')
})


[ec2-user@ip-172-31-40-225 app]$ node index.js
App is listening 3000 port

다른 터미널
[ec2-user@ip-172-31-40-225 ~]$ curl http://localhost:3000
Hello World

보안그룹 인바운드 규칙에 3000포트 허용하도록 설정한다.



외부 접속 결과

 

전체 구성도

조건문

if(조건) {실행할 코드}
else {실행할 코드}

$day = Get-Date

if($day.day -eq 20){
    write-host "Today"
} else {
    write-host "Not Today"
}

PS C:\WINDOWS\system32> C:\aa.ps1
Today


$day = Get-Date

if($day.day -eq 10){
    write-host "Today"
} else {
    write-host "Not Today"
}

PS C:\WINDOWS\system32> C:\aa.ps1
Not Today

반복문

ForEach

$a = 1,2,3,4,5
ForEach ($value in $a) {write-host $value}

PS C:\WINDOWS\system32> C:\aa.ps1
1
2
3
4
5


For

For($a=1; $a -le 5; $a++) {write-host $a}

PS C:\WINDOWS\system32> C:\aa.ps1
1
2
3
4
5

Do While

$a=1
do {write-host $a; $a++}
while($a -lt 5)

PS C:\WINDOWS\system32> C:\aa.ps1
1
2
3
4

Do Until

$a=1
do {write-host $a; $a++}
until ($a -gt 5)

PS C:\WINDOWS\system32> C:\aa.ps1
1
2
3
4
5

파라미터
Param(
[Parameter(Mandatory=$true)]
[String]$variablename)

param(
[parameter (mandatory=$true)]
[string]$cityname)

$a = $cityname
write-host "Welcome to $a!"

PS C:\WINDOWS\system32> C:\aa.ps1
cmdlet aa.ps1(명령 파이프라인 위치 1)
다음 매개 변수에 대한 값을 제공하십시오.
cityname: SEOUL
Welcome to SEOUL!

'클라우드 > PoweShell' 카테고리의 다른 글

변수, 비교연산자  (0) 2023.03.20
PowerShell Script  (0) 2023.03.20
File & Folder  (0) 2023.03.17
PowerShell 명령어  (0) 2023.03.17
Powershell 환경 설정  (0) 2023.03.17

변수
 - 데이터 저장
 - $뒤에 원하는 변수값 입력

PS C:\> $a =10
PS C:\> $a
10

PS C:\> $a = "Seoul"
PS C:\> $a
Seoul


비교연산자
-eq =
-lt <
-gt >
-ge >=
-le <=
-ne !=

-not
-and
-or

PS C:\> $a = 10
PS C:\> $b = 10
PS C:\> $a -eq $b
True
PS C:\> $a -ne $b
False

PS C:\> $a = 10
PS C:\> $b = 5
PS C:\> $a -gt $b
True
PS C:\> $a -lt $b
False

PS C:\> ($a -lt 15) -or ($b -gt 5)
True
PS C:\> ($a -gt 15) -or ($b -gt 5)
False

PS C:\> ($a -lt 15) -and ($b -gt 5)
False
PS C:\> ($a -lt 15) -and ($b -gt 2)
True

'클라우드 > PoweShell' 카테고리의 다른 글

조건문, 반복문, 파라미터  (0) 2023.03.20
PowerShell Script  (0) 2023.03.20
File & Folder  (0) 2023.03.17
PowerShell 명령어  (0) 2023.03.17
Powershell 환경 설정  (0) 2023.03.17

생성
윈도우 검색창에서 Windows PowerShell ISE 실행

- 상단 스크립트 창에 실행할 명령어를 나열해서 쓰고 실행 누르면 아래 콘솔창에 명령 그대로 실행됨
- 작성한 스크립트를 파일로 저장할 수 있음




실행

- 콘솔창에서 스크립트 파일 경로와 이름을 입력하면 스크립트가 실행된다.
- get-content 명령어로 파일 내용 확인 가능

'클라우드 > PoweShell' 카테고리의 다른 글

조건문, 반복문, 파라미터  (0) 2023.03.20
변수, 비교연산자  (0) 2023.03.20
File & Folder  (0) 2023.03.17
PowerShell 명령어  (0) 2023.03.17
Powershell 환경 설정  (0) 2023.03.17

파일과 폴더
get-childitem (= gci)
- 현재 폴더와 파일 리스트 형식으로 출력

get-childitem -force
- 숨겨진 폴더와 파일을 리스트 형식으로 출력

get-childitem -recurse
- 하위에 있는 폴더와 파일을 리스트 형식으로 출력

 get-childitem -path "c:\program files" -recurse -include * .exe
 - -path : 경로
 -  -include :지정한 형식을 포함한 모든 폴더와 파일 출력

cd 
- 폴더 이동

copy-item
- 파일, 폴더 복사
- copy-itrm -path c:\candy.txt -destination c:\apple 
  ->candy.txt 파일을 apple 폴더에 복사
- copy-itrm -path c:\banana -destination c:\apple 
 -> banana 폴더를 apple 폴더에 복사


move-item
- 파일, 폴더 이동
- move-itrm -path c:\candy.txt -destination c:\apple 
- move-itrm -path c:\banana -destination c:\apple 

remove-item
- 파일, 폴더 삭제
- remove-item -path c:\apple

파일과 폴더 읽기 & 쓰기

new-item
new-item -path "c:\apple" -itemtype directory
-> apple 폴더 생성
new-item -path "c:\file.txt" -itemtype file
-> file.txt 파일 생성

set-content
set-content c:\file.txt "Hello PowerShell"
-> Hello PowerShell 입력됨
set-content c:\file.txt "Hello Window"
-> Hello PowerShell 은 사라지고 Hello Window가 입력됨

add-content
add-content c:\file.txt "Nice Day"
-> 원래 있던 내용 뒤에 내용 추가


파일을 생성하는 다른방법
get-childitem | out-file c:\folderlist.txt
- get-childitem 에 있는 내용을 folderlist.txt 파일로 내용 출력


get-content
- 파일을 읽는 명령어
- get-content c:\folderlist.txt


html로 파일 출력
get-service | convertTo-HTML name, displayname, status | Set-content c:\\svc.html

xml로 파일 출력
get-childitem |export-clixml c:\XMLtest.xml

csv로 파일 출력
get-service | export-CSV "c:\svcList.csv"

csv를 읽는 명령어
import-csv c:\svclist.csv

윈도우에 설치된 csv에 연결된 프로그램이 실행되며 파일 열림
invoke-item c:\svclist.csv

'클라우드 > PoweShell' 카테고리의 다른 글

조건문, 반복문, 파라미터  (0) 2023.03.20
변수, 비교연산자  (0) 2023.03.20
PowerShell Script  (0) 2023.03.20
PowerShell 명령어  (0) 2023.03.17
Powershell 환경 설정  (0) 2023.03.17

구조
Verb(동사)-Noun(명사) -Parameter(옵션값) <Argement>
- Verb(동사) : 해야 할 액션
- Noun(명사) : 액션에 대한 타겟
- Parameter(옵션값) : 명사에 대한 옵션값

ex ) Get-Process -Name Winlogon

명령어

Get-Help (알고싶은)명령어
- Get-Help Get-Process
= Help (알고싶은)명령어
- Help Get-Process
=  (알고싶은)명령어 -?
- Get-Process -?


Get-Command
- 명령어 목록 출력
Get-Command -type cmdlet
- let 타입의 명령어만 표시


Format 
Get-Process | Format-Wide
Get-Process | Format-Wide -column 4
Get-Process | Format-List
- 리스트 ~~형식으로
Get-Process | Format-Table


Pipeline ( | )
- 앞에 있는 명령어 출력을 | 을 통해 다음값으로 넘김
 get-service | where-object {$_.Displayname -Match "xbox"}


Tab
- 명령어 자동완성



'클라우드 > PoweShell' 카테고리의 다른 글

조건문, 반복문, 파라미터  (0) 2023.03.20
변수, 비교연산자  (0) 2023.03.20
PowerShell Script  (0) 2023.03.20
File & Folder  (0) 2023.03.17
Powershell 환경 설정  (0) 2023.03.17

Powershell 처음 사용시 3가지 설정하기

update-help
- 도움말 파일 업데이트
- 빨간 글씨로 출력된 내용은 파워쉘이 영어만 지원하고 한글지원을 안헤서 한글관련 도움말은 업데이트 할 수 없다고 뜨는 것이니 업데이트 실패가 아니다.


cls
- 화면 클리어

Set-ExecutionPolicy RemoteSigned
- 파워쉘 스크립트 활성화
- Get-ExecutionPolicy 명령어를 입력하면 Unrestricted 가 출력
- Set-ExecutionPolicy RemoteSigned 명령어 입력
- 다시 Get-ExecutionPolicy 명령어를 입력하면 RemoteSigned 출력



Enable-PSRemoting
- 원격명령어 실행 활성화






'클라우드 > PoweShell' 카테고리의 다른 글

조건문, 반복문, 파라미터  (0) 2023.03.20
변수, 비교연산자  (0) 2023.03.20
PowerShell Script  (0) 2023.03.20
File & Folder  (0) 2023.03.17
PowerShell 명령어  (0) 2023.03.17

명령어 옵션을 활용한 팁

1. 가독성을 좋게 출력
column
- mount (ls -al ...) | column -t

2. 메모리 많이 사용하는 프로세스 10개 출력
ps aux | sort -nr -k 4 | head -10 (-n 10 으로 써도 됨)

특정시간이 지나면 명령어를 자동 종료
timeout Ns 명령어
 -> timeout 5s top  (5초 후 top명령어 종료)


문법을 활용한 팁
1. 현재 위치 하위의 디렉토리별 파일 수 카운트
find . -xdev -type d -exec /bin/echo -n "{} :" \; -exec sh -c "ls {} | wc -l" \;
-xdev : 로컬에 있는 파일 시스템만 검색 (마운트한 디렉토리는 검색을 하지 않겠다.)
-exec : 다음에 나오는 명령어 실행
echo -n "{} :" : 디렉토리 검색한 이름과 콜론 출력
\; : 종료
ls {} | wc -l : ls 의 결과값을 wc로 넘겨서 라인수 출력

2. 어떤 프로세스가 io interrupt를 기다리고 있는지 확인 (실시간으로 모니터링할 때 유용)
- 1초마다 date를 찍으며 state code가 D(uninterruptible sleep (usually IO)) 인 프로세스를 출력
while tru; do date; ps auxf | awk '{if($8== "D") print $0;}'; sleep 1; done

3. 특정한 프로그램(프로세스명)이 전체 메모리의 몇 퍼센트를 사용하는지 확인
ps -eo pmem,comm | grep -i "프로세스이름" | awk '{sum+=$1} END {print sum "% fo MEMORY"}'
-> ps -eo pmem,comm | grep -i "nginx" | awk '{sum+=$1} END {print sum "% fo MEMORY"}'

쉘스크립트 점검 팁

https://www.shellcheck.net/

시나리오
 - 예상 불가능한 문제로 백업이 제대로 안됐을 경우에 알림 메세지를 받을 수 있도록 감시 쉘 스크립트를 작성

wc
- 라인 수 , 단어 수 , 바이트, 파일이름 출력
-  -l : 라인 수만 출력

grep
- grep 옵션 "찾을 문자열" 파일명
- -c : 지정한 문자열을 가진 라인이 몇 개 었는지 출력
- -i : 대소문자를 구분
- -r : 현재 디렉토리와 그 하위 디렉토리까지 검색
- -v : 지정한 문자열을 제외한 모든 라인을 출력

function
- 함수를 정의
- 주의할 점
- 쉘 스크립트는 순차적으로 위에서부터 실행, 함수 or 변수를 모아놓은 파일을 가져와 사용할 떄는 가장 상단에서 불러와야 한다. 
-  function 함수명 () {
              매개변수를 받아서 처리할 내용
              함수 처리 루틴
}

function readtest () {
read A
read B
echo ${A} ${B}
}
readtest

- read : 유저가 입력하면 지정한 변수에 넣음


vi backup_monitor.sh

##변수지정
TODAY=$(/bin/date +%Y.%m.%d)
PUSH="/root/SHELL/monitor/tel_push.sh"
LOG="/tmp/bak_report"
HOST=$(hostname)
WEB="/nfs/BACKUP/cent1/* .tgz"
DB1="/nfs/BACKUP/cent2/* cent2 .tgz"
DB2="/nfs/BACKUP/cent2/* DB .tgz"
STR="/nfs/BACKIP/cent3/* .tgz*"
WBK_CNT=$(/usr/bin/ls -1 ${WEB} | /usr/bin/wc -1)
DBK_CNT1=$(usr/bin/ls -1 ${DB1} | /usr/bin/wc -1)
DBK_CNT2=$(usr/bin/ls -1 ${DB1} | /usr/bin/wc -1)
SBK_CNT=$(/usr/bin/ls -1 ${STR} | /usr/bin/wc -1)

##함수정의
- 인자를 두개 받아 비교 메세지를 반환
- 인자1 : 백업이름
- 인자2 : 백업카운트
function chk_cnt(){
##인자를 변수에 할당
NAME="$1"
CNT="$2"
##백업카운트 (${CNT})가 8이 아닐 경우 확인하도록 메세지
##8이 맞을 경우 문제가 없다는 메세지를 출력
if [ "${CNT}" -eq 8 ]
then
/usr/bin/echo "${NAME} 백업파일 문제없음"
/usr/bin/echo
else
/usr/bin/echo "${NAME} 백업파일dl 8개가 아닙니다! 확인하세요 !"
/usr/bin/echo
fi
}

##레포팅파일 초기화
/usr/bin/rm -f "${LOG}"
/usr/bin/touch "${LOG}"

##레포팅 메세지 작성
{
/usr/bin/echo " ================= "
/usr/bin/echo "                  백업 확인           "
/usr/bin/echo " ================= "
/usr/bin/echo
/usr/bin/echo " 웹서버 백업파일"
/usr/bin/ls -1 ${WEB} | /usr/bin/grep " ${TODAY}"
/usr/bin/echo
/usr/bin/echo "DB서버 백업파일"
/usr/bin/ls -1 ${DB} | /usr/bin/grep " ${TODAY}"
/usr/bin/echo
/usr/bin/echo "Storage 서버 백업파일"
/usr/bin/ls -1 ${STR} | /usr/bin/grep " ${TODAY}"
/usr/bin/echo

##백업 별 파일숫자 확인
chk_cnt Web_System "${WBK_CNT}"
chk_cnt DB_System "${DBK_CNT1}"
chk_cnt DB_Dump "${DBK_CNT2}"
chk_cnt STORAGE_System "${SBK_CNT}"


}>|"${LOG}"


##텔레그램으로 레포트 메세지를 보냄
"${PUSH}" " ${HOST}"   " $(/usr/bin/cat " ${LOG}")"

crontab -e
30 10  * * * /root/SHELL/monitor/backup_monitor.sh >/dev/null 2>$1

시나리오
 - 스토리지 서버의 디스크가 풀로 찼다.

find
 - find (옵션) 찾기시작할패스 익스프레션
- find ./ -name tetsfile.txt   (이름으로 파일찾기)
- find ./ -mtime -10 ( 현재 시각으로부터 10일 이전에 수정이 이루어진 파일 찾기)
- find ./ -mtime +10 ( 현재 시각으로부터 10일 이후에 수정이 이루어진 파일 찾기)
 찾은 파일을 출력뿐만아니라 처리까지 할 수 있다.
 find ./ -mtime +3 -exec rm {} \ ; 
 - 역슬레시와 세미콜론으로 find 명령어를 끝냄
 - 명령어는 rm 말고도 여러가지 다 됨
 -  명령어 입력 후 -c 옵션을 주면 다른 명령어 사용 가능
 - find ./ -mtime +3 -exec sh -c "rm {}" \;  


예전에 만들었던 백업 정책에 내용 추가

vi web_backup.sh & db_backup.sh (cent1 cent2 서버) 

#!/bin/bash
set -exuo pipefail  <<--  cent1, 2 둘다 추가 , 완료 후 주석처리

##변수설정
HOST="$(/usr/bin/hostname)"  
LOG="/root/backup.log"
PUSH="/root/SHELL/monitor/tel_push.sh"
DATE="$(/bin/date +%Y.%m.%d)"

--- 중략 ---

##---로그 기록시작 ({중괄호}로 시작과 끝을 정의함)
{
##백업 시작 시간
/bin/echo
/bin/echo "=== 백업시작 시간"
/bin/date
/bin/echo

/bin/echo
/bin/echo "=== 이전 백업파일 삭제 : "
/usr/bin/find ${BAK_PATH} -mtime +7 -exec sh -c "ls -a {}; rm {}" \;
/bin/echo
--->> 추가

##백업
/usr/bin/tar czpPf "${BAK_FILE}" ${BAK_LIST} <-- ${BAK_LIST}에는 " "를 안붙인 이유 : 위에 변수선언할 때 이미  " "를 붙혀줬기때문에
p : 퍼미션유지  P : 절대경로유지

 

--- 생략 ---

+ Recent posts