인프라 관련 내용 정리가 필요할 것 같아 중요한 키워드 정도로 정리한 내용입니다.

AWS EC2 접속 명령어

기본적으로 pem키를 발급받고 네트워크 보안이 올바르면 아래와 같은 명령어로 pem키를 이용해 접속 가능합니다.

1
2
chmod 400 [pem파일명]
ssh -i [pem키 파일명] ubuntu@[퍼블릭 IP 주소]

입력했던 콘솔 보기

1
history

bastion host 설정

bastion host란 내부와 외부 네트워크 사이에서 게이트 역할을 수행하는 호스트입니다.
내부 서버나 중요 리소스를 보호하기 위해 생성되며, 일반 유저들에게는 공개하지 않습니다.

bastion host에서 공개키를 생성한 후 접속하려는 서비스 서버에 키를 추가하여 접속할 수 있습니다.

서비스용 서버에 22번 포트로의 접근은 bastion host만 가능하도록 security group을 설정해야합니다.

1
2
3
4
5
6
# Bastion Server에서 공개키를 생성
bastion $ ssh-keygen -t rsa
bastion $ cat ~/.ssh/id_rsa.pub

# 접속하려는 서비스용 서버에 키 추가
$ vi ~/.ssh/authorized_keys

위와 같이 설정한 후 해당 서비스용 ip를 별칭으로 입력합니다.

1
vim /etc/hosts

해당 파일에서 아래와 같이 입력하면 됩니다.

1
[ip주소] [별칭]

사용할 때는 아래와 같이 쓰면 됩니다.

1
ssh [별칭]

latency 인증 관련

도메인 생성 사이트 에서 도메인을 발급받은 뒤 docker의 certbot을 통해 SSL 인증서를 무료로 발급받을 수 있습니다.

1
2
3
4
docker run -it --rm --name certbot \
  -v '/etc/letsencrypt:/etc/letsencrypt' \
  -v '/var/lib/letsencrypt:/var/lib/letsencrypt' \
  certbot/certbot certonly -d '[도메인 주소]' --manual --preferred-challenges dns --server https://acme-v02.api.letsencrypt.org/directory

발급받은 뒤 도메인 사이트에 아래와 같이 TXT(SPF)를 추가 해줘야합니다.

images

1
2
3
# 인증서 경로
/etc/letsencrypt/live/[도메인주소]/fullchain.pem ./
/etc/letsencrypt/live/[도메인주소]/privkey.pem ./

이후 nginx나 tomcat에 해당 인증서 키를 추가해야합니다.

git submodule 관련

키, 계정 정보, DB IP주소 패스워드 등 공개하고 싶지 않은 정보는 git private 저장소에 저장하고 해당 레포지토리를 submodule로 이용할 수 있습니다.

1
git submodule add [자신의 private 저장소] ./src/main/resources/config

이후 source code 받을때

1
2
3
4
5
6
git clone --recurse-submodules [자신의 프로젝트 저장소]

# 설정 파일이 변경된 경우
git submodule foreach git pull origin main
# 위의 설정이 안되면 아래로..!
git submodule update --init --recursive

k6 부하테스트 관련

k6는 부하테스트를 위한 라이브러리입니다. apache의 ab 나 naver의 nGrinder 처럼 부하테스트를 할 수 있는 도구입니다.
설치 후 실행은 아래처럼 사용하면 됩니다.

1
k6 run [파일명.js] 

k6를 gui로 보기 좋게 해주는 grafana 도 있습니다.

jar 스크립트 배포 관련

스크립트를 이용해서 배포를 할 수 있습니다. 아래의 코드는 Spring 프로젝트를 정지, 빌드, 배포하는 스크립트 입니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
PROJECT_PATH='프로젝트 경로'
JAR_PATH=${PROJECT_PATH}/build/libs
JAR=$(cd ${JAR_PATH} && find ./* -name "*jar" | cut -c 3-)
JAR_PID=$(ps -ef | grep $JAR | grep -v grep | awk '{print $2}')

function stop_process() {
  if [ -z "$JAR_PID" ]; then
    echo "프로세스가 실행중이지 않습니다."
  else
    echo "$JAR의 프로세스를 종료합니다. (PID = $JAR_PID)"
    kill $JAR_PID
  fi
}

function build() {
  cd ${PROJECT_PATH} && ./gradlew clean build
}

function start_process() {
  java -jar -Dspring.profiles.active=prod $JAR_PATH/$JAR
}

echo -e "${txtylw}=======================================${txtrst}"
echo -e "${txtgrn}  Deploy Start                         ${txtrst}"
echo -e "${txtylw}=======================================${txtrst}"

stop_process
build
start_process

위의 파일은 [파일명].sh로 확장자를 구성해야 하며, 처음에 권한을 추가해준뒤 아래 명령어로 실행하면 됩니다.

1
2
3
4
# 권한 추가
chmod +x [파일명.sh]
# 실행
./[파일명.sh]

이외에도 AWS 모니터링, 스케일 아웃, AWS Launch Template 등 인프라 설정을 한다면 조금 더 안정적으로 웹 서비스를 운용할 수 있습니다.