[우아한테크코스] 4월 29일 TIL

3 minute read

오늘 한 일

  1. 블로그 로컬에 배포
  2. 체스 피드백 적용

배포 관련

[gatsby] gatsby 블로그 로컬에 올리기

  • npm install
  • npm start
  • yarn install
  • yarn start
    이와 같은 명령어로 로컬에 돌릴 수 있다.

node 버전, npm 버전, 경로 설정 등이 잘못되어서 오류가 날 가능성이 있다.
올바른 버전을 잘 사용해보고
vi ~/.zshrc, vi ~./bash_profile 로 경로 설정을 잘 하도록 하자.
–force, sudo의 사용은 계속 쌓이니 주의하도록 하자.

  • npm install –legacy-peer-deps
  • npm install -g gatsby cli

[ubuntu] ubuntu에 도커 설치

  • docker 설치: 링크 https://hiseon.me/linux/ubuntu/install-docker/
    1. apt package 업데이트
      sudo apt-get update
    2. https를 통해 저장소 사용할 수 있도록 하는 패키지 설치
      sudo apt-get install \
        apt-transport-https \
        ca-certificates \
        curl \
        gnupg-agent \
        software-properties-common
      
  1. 도커 다운로드 키 추가
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

  2. fingerprint 인식 키 확인
    sudo apt-key fingerprint 0EBFCD88

  3. docker CE 설치
    업데이트: sudo apt-get update
    docker CE 설치: sudo apt-get install docker-ce docker-ce-cli containerd.io
    특정 버전 도커 설치: sudo apt-get install docker-ce=<version> docker-ce-cli=<version> containerd.io
    버전 확인: sudo docker version

  4. 사용자를 도커 그룹에 추가
    사용자 확인: cat /etc/group
    사용자 추가: sudo usermod -aG docker $USER($USER 이름 등록시 ubuntu), newgrp docker

  5. docker-compose 파일 생성
    vi docker-compose.yml
    ```
    version: ‘3’ plugdev:x:46:ubuntu staff:x:50: version: ‘3’ services: local-db: image: library/mysql:5.7 container_name: local-mysql restart: always ports:
    • 13306:3306 environment: MYSQL_ROOT_PASSWORD: sally118 MYSQL_DATABASE=chess MYSQL_USER=hi MYSQL_PASSWORD=sally118 TZ: Asia/Seoul volumes:
    • ./db/mysql/data:/var/lib/mysql
    • ./db/mysql/init:/docker-entrypoint-initdb.d platform: linux/x86_64 ```
  6. mysql 실행
    docker-compose up -d
    sudo apt install -y docker-compose
    실행: docker exec -it local-mysql bash
  • 안정화된 저장소 활용
    sudo add-apt-repository \
     "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
     $(lsb_release -cs) \
     stable"
    
  • 기존 도커 제거
    sudo apt-get remove docker docker-engine docker.io
    sudo apt install -y docker-compose

  • 필요한 패키지 설치
    sudo apt-get update && sudo apt-get install -y \
      apt-transport-https \
      ca-certificates \
      curl \
      software-properties-common
    
  • 패키지 저장소 추가
  • 도커의 공식 GPG 키와 저장소 추가
    curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
    sudo add-apt-repository \
     "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
     $(lsb_release -cs) \
     stable"
    
  • 도커 CE 설치
    sudo apt-get update && sudo apt-get install -y docker-ce

  • 일반 사용자 계정으로 docker 명령어를 사용하기 위해 그룹 추가
  • ubuntu 라는 사용자를 docker 그룹에 추가
    sudo usermod -aG docker ubuntu
    newgrp docker

  • 도커 재부팅
    sudo systemctl restart docker

  • 실행 확인 docker ps

[network] 서버 통신 과정

  1. 사용자가 웹브라우저 dns를 url 입력한다.
  2. dns를 통해 등록된 실제 주소(ip)를 알아낸다.
  3. ip를 통해 http 요청 메시지를 서버에 보낸다.(TCP/IP)
  4. 서버는 웹브라우저에 응답을 패킷으로 보낸다.
  5. 웹브라우저는 패킷을 조립해 사용자에게 보여준다.

[network] ddos 공격에 대응하려면?

ddos란? 감당할 수 없는 규모의 트래픽이나 커넥션 요청을 네트워크, 시스템, 어플리케이션에 전송해서 발생하는 것이다.
어플리케이션에 도달할 수 있는 트래픽의 유형을 줄임으로써 이를 막을 수 있다.
보안그룹을 구성하면 인스턴스에 대한 인바운드, 아웃바운드 통신에서 허용할 포트나 프로토콜을 지정해 통제할 수 있다. 지정되지 않는 다른 포트나 프로토콜은 접근이 불허된다.
이렇게 관리자만이 ssh를 통해 접근할 수 있도록 제한하기 위해 구성되는 인스턴스가 ssh bastion 서버이다.
우리는 22번 포트를 통해 허용된 ip로부터 접근할 수 있게 한다.
bastion 서버를 통해 관리자는 service, mysql 서버에 접근할 수 있다.

또 다른 방법으로 Elastic Load Balancing을 사용할 수 있다.
자동으로 인바운드 트래픽을 라우팅해줌으로써 공격받는 부분을 줄여주고, 자동으로 용량 스케일링을 해준다.
elb는 유효한 트래픽만 전달하도록 한다.

또 하나의 방법으로 Network Address Translation이 있다.
service, mysql 서버는 프라이빗 서브넷에 위치해서 직접 인터넷과 통신할 수 없다.
소프트웨어 업데이트 등을 위해 인스턴스는 인터넷과 연결될 필요가 있다. 이를 위해 고유의 보안그룹을 갖는 것이 이 NAT 인스턴스이다.

웹 어플리케이션 보안그룹을 설정해 elb로부터 오는 웹 요청들만 받아들이게 된다.
elb로부터의 tcp 포트 80, 443과 관리자의 접근을 위한 ssh 22 포트만 허용된다.

mysql 데이터베이스 서버보안그룹은 tcp포트 3306 트래픽

[network] 서버에서 연결 가능한 개수 구하기

sysctl fs.file-max
ulimit -aH: hard, ulimit -a: soft

[network] 재부팅 없이 ec2 volume 확장하기

  • ec2 elastic block store -> 볼륨 -> 볼륨 수정 -> 원하는 크기 입력 -> 수정 클릭
    in-use-completed가 되길 기다린다.
    용량 확인: df -h 혹은 lsblk
    스토리지 확장: sudo growpart /dev/xvda 1
    파일시스템 재할당: sudo resize2fs /dev/xvda1

체스 피드백 적용

[sql] room title 중복 제거

ALTER DATABASE chess DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
CREATE TABLE IF NOT EXISTS pieces
(
    room_id    bigint,
    piece_name char(1),
    position   char(2)
);
CREATE TABLE IF NOT EXISTS room
(
    id           bigint NOT NULL AUTO_INCREMENT,
    title        varchar(64) DEFAULT NULL UNIQUE,
    turn         char(5)     DEFAULT NULL,
    playing_flag tinyint(1) DEFAULT NULL,
    PRIMARY KEY (id)
);

unique 옵션, 상단 utf8 설정