AWS EC2 - 인스턴스 생성, 삭제, 원격 접속하기, IP 주소와 DNS 주소, 보안 그룹 설정, 포트 Redirect , Ubuntu MySQL 설치, Node

Corner·2022년 6월 6일
1

Cloud

목록 보기
1/4
post-thumbnail

AWS EC2


목차

[AWS EC2 - 인스턴스 생성하기]

​ [인스턴스 삭제 방법]

[AWS EC2 - 원격 접속하기]

[AWS EC2 - IP 주소와 DNS 주소, 보안 그룹 설정]

[AWS EC2 - 포트 Redirect하기]

[AWS EC2 - Ubuntu MySQL 외부 접속 오류 해결하기 ]

[AWS EC2 - MySQL 8.0 설치]


들어가며...

AWS EC2로 서버를 배포하려고 좌충우돌한 과정을 겪었습니다..

인스턴스를 생성하고 서버를 실행하는 것까진 어렵지 않았습니다만, MySQL 외부 접속에서 오류를 해결하려고 애먹었었네요.


AWS EC2 - 인스턴스 생성하기

AWS 계정 가입 과정은 생략합니다.

1. AWS 서비스에서 EC2 대시보드로 이동합니다.

대시보드에 바로 뜨는 인스턴스 시작을 누릅니다.

인스턴스 시작에서 아래는 순서대로 작성하는 내용입니다.

2. 이름 및 태그

사용할 인스턴스의 이름을 작성합니다.

3. 애플리케이션 및 OS 이미지(Amazon Machine Image)

저는 Ubuntu에 18.04 LTS 버전을 사용합니다.

Ubuntu는 20.04 버전과 18.04 버전이 있는데 이 중에서 18.04 버전을 선택한 이유는 github에서 Deploy agent에 관련해서 20.04 버전은 지원하지 않는다고 들었습니다.

3. 인스턴스 유형

맞게 설정하면 되지만 저는 기본으로 된 t2.micro 입니다.

4. 키 페어

사용하는 키 페어가 없다면 키 페어 생성 버튼을 누릅니다.

키 페어 이름은 알 수 있도록 임의로 지정하면 됩니다. 그러고나서 다운로드 합니다.

단, 분실되지 않도록 잘 관리하고 계시면 됩니다.

5. 이하 내용은 따로 건들지않고 설정할 것이 없어 이후 바로 인스턴스를 시작합니다.


인스턴스 삭제 방법

인스턴스 메뉴에서 해당 인스턴스를 선택하여 [인스턴스 상태]를 인스턴스 종료로 바꿔주면 됩니다. 그럼 종료되면서 일정 시간이 지나면 리스트에서 사라지게 됩니다.


AWS EC2 - 원격 접속하기

SSH를 이용하여 원격 접속을 합니다.

SSH키는 EC2 인스턴스를 생성하면서 사용하는 키 페어입니다. 다운로드 받은 PEM 키는 임의 경로에 관리하도록 두시면 됩니다.

chmod로 pem 파일에 권한을 부여합니다.

chmod 400 test.pem

PEM키가 있는 경로에서 아래와 같이 명령어를 수행합니다.

ssh -i "다운받은 pem이름.pem" ubuntu@아.이.피.1

"다운받은.pem"에는 pem파일 이름이 들어가고,

ubuntu@인스턴스의아이피를 넣으시면 됩니다.

# ex)
ssh -i "test.pem" ubuntu@127.0.0.1

yes/no를 물으면 yes를 입력하고 진행합니다.


AWS EC2 - 웹 서버 배포

저는 Node Express와 Mysql을 사용하고, git 등 필요한 것들을 설치했습니다.

ubuntu에서는 apt-get 명령어를 사용합니다.

  1. apt-get update

    sudo apt-get update
  2. nodejs 14버전 설치

curl -sL https://deb.nodesource.com/setup_14.x | sudo bash -

​ 명령어 수행 이후

sudo apt -y install nodejs
  1. npm

    sudo apt-get install npm
    npm --version
  2. git

    sudo apt-get install git
    git --version
  3. [AWS EC2 - Ubuntu MySQL 8.0 설치](##AWS EC2 - MySQL 8.0 설치)

이제 필요한 항목들을 설치했다면 프로젝트를 클론 받습니다.

git clone https://github.com/eight-corner/~~~.git

git config 관련 설정을 해둡니다.

git config --global credential.helper store
git config --global user.name ""
git config --global user.email ""

프로젝트에서 NPM 실행

npm install

AWS EC2 - IP 주소와 DNS 주소, 보안 그룹 설정, 포트 개방

생성한 인스턴스에서 보안 탭을 들어가면 "보안 그룹"과 밑에 인바운드 규칙이 있습니다. 인바운드 규칙을 편집할 것인데, 보안 그룹을 눌러서 수정합니다.

보안 그룹에 아래 링크를 누릅니다.

인바운드 규칙 편집에서 아래와 같이 필요한 포트 개방 설정을 해줍니다.


포트 Redirect하기

80포트를 오픈했지만 내부에서는 3001포트 8080포트 같이 사용하고 있다면

사용자는 80포트로 들어왔지만 3001, 8080포트 등 우리가 지정한 포트로 보이게할 수 있습니다.

sudo iptables -A PREROUTING -t nat -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3001

대충 80 포트로 들어오게하고 3001 포트로 보낸다라는 뜻입니다.

현재 리다이렉트중인 포트 리스트를 보는 명령어는 아래와 같습니다.

sudo iptables -t nat -L --line-numbers

삭제 명령어는 아래에서 리스트에서 보는 number를 number란에 넣어주면 됩니다.

sudo iptables -t nat -D PREROUTING [number]

AWS EC2 - Ubuntu MySQL 외부 접속 오류 해결하기

AWS EC2로 Ubuntu 인스턴스를 만들고 MySQL을 설치하여 외부에서 Datagrip을 이용해 접속하려 했으나 오류가 나버렸다..

이런 문제는 인스턴스 보안 방화벽 포트를 개방 해두었기 때문에 방화벽 관련 문제는 아니고,

한 번 Mac에서도 이러한 똑같은 에러가 났었는데, MySQL이나 계정 관련으로 세팅할 문제였었다.

해당 문제도 그런 것으로 보인다.

Communications link failure

The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

Listen IP 대역 변경

위 문제를 해결하기 위해서 conf 파일 설정을 해주어야합니다.

아래 명령어를 통해서 mysqld의 Local Address와 Foreign Address를 확인합니다.

sudo netstat -ntlp | grep mysqld

# 결과
tcp        0      0 127.0.0.1:3306            0.0.0.0:*               LISTEN      8140/mysqld

Local Address는 서버 내의 IP 주소이며, Foreign Address는 네트워크로 연결이 이루어진 IP주소입니다.

명령어를 실행하면 Local Address IP가 127.0.0.1로 기본 설정 되어있습니다.

외부 접속을 위해서 Local Address IP를 0.0.0.0으로 모든 IP 허용으로 변경해주어야 합니다.

아래 커맨드를 수행합니다.

sudo vim /etc/mysql/my.cnf

💡 여기서 중요합니다.

!includedir /etc/mysql/mysql.conf.d/ 이런 문구가 적혀있으면

해당 부분의 경로로 이동해서 수정해야합니다.

sudo vim /etc/mysql/mysql.conf.d/mysqld.cnf

해당 부분의 bind-address를 127.0.0.1로 되어있는 것을 0.0.0.0으로 수정합니다.

변경한 값 적용을 위해 Mysql을 재실행 합니다.


Ubuntu에서 Mysql 시작, 종료, 재시작

mysql 서버 시작

/etc/init.d/mysql start

mysql 서버 종료

/etc/init.d/mysql stop

mysql 서버 재시작

/etc/init.d/mysql restart

mysql 서버 상태 확인

/etc/init.d/mysql status


아래 명령어로 Local Address가 0.0.0.0으로 변경되었는지 확인합니다.

netstat -ntlp | grep mysqld

# 결과
tcp        0      0 0.0.0.0:3306            0.0.0.0:*               LISTEN      8140/mysqld

AWS EC2 - MySQL 8.0 설치

1단계 : MySQL APT Repository 추가

sudo wget https://dev.mysql.com/get/mysql-apt-config_0.8.13-1_all.deb

2단계 : MySQL APT Repository 패키지 다운로드

sudo dpkg -i mysql-apt-config_0.8.13-1_all.deb

위의 명령어를 입력하면 아래와 같은 창이 뜨는데 OK를 선택하면 된다.

3단계 : MySQL Repository 업데이트

sudo apt-get update

4단계 : MySQL 8.0 Server 설치

sudo apt-get install mysql-server

5단계 : mysql_secure_installation 설정

sudo mysql_secure_installation

설정 mysql_secure_installation

  1. ... Would you like to setup VALIDATE PASSWORD plugin? (Press y|Y for Yes, any other key for No:)

강화된 패스워드 생성 플러그인을 설정할 것인가? (Yes는 y, 나머지 키는 No로 간주)

root 비밀번호를 두번 입력해준다.(한번은 password 확인용)

  1. Remove anonymous users? **(Press y|Y for Yes, any other key for No:)**

익명의 사용자를 제거할 것인가? (Yes는 y, 나머지 키는 No로 간주)

yes로 설정하면 mysql 로그인 시 -u 옵션을 반드시 명시해야한다.

  1. Disallow root login remotely? **(Press y|Y for Yes, any other key for No:)**

root 권한으로 외부 로그인 시 허용할 것인가? (Yes는 y, 나머지 키는 No로 간주)

외부에서 해당 Databases을 이용할 것이라 no,

Databases를 해당 서버에서만 쿼리, 제어한다면 yes를 선택

  1. Remove test databases and access to it? ****(Press y|Y for Yes, any other key for No:)****

mysql 설치 시 기본으로 생성되는 test DB를 제거할 것인가? (Yes는 y, 나머지 키는 No로 간주)

  1. Reloading privileges tables now? ****(Press y|Y for Yes, any other key for No:)****

privileges talbe를 재로드 할 것인가?

설정한 값을 재로드를 통해 지금 적용할 것인가

6단계 : MySQL 외부 접속 허용하기

sudo mysql -u root -p

다음 명령어로 User별 현재 허용된 접근 Host 정보를 얻을 수 있다.

SELECT Host,User,plugin,authentication_string FROM mysql.user;

1. 모든 IP 허용하기

※ 참고로 %은 모든 아이피를 포함하지만, localhost는 포함되지 않는다.

  • GRANT
GRANT ALL PRIVILEGES ON *.* TO '아이디'@'%' IDENTIFIED BY '패스워드';
  • INSERT + GRANT + FLUSH
INSERT INTO mysql.user (host,user,password,ssl_cipher, x509_issuer, x509_subject) VALUES ('%','아이디',password('패스워드'),'','','');

GRANT ALL PRIVILEGES ON *.* TO '아이디'@'%';

FLUSH PRIVILEGES;

모든 IP를 허용한 경우에 다음과 같이 원래 상태로 복구할 수 있다.

DELETE FROM mysql.user WHERE Host='%' AND User='아이디';
FLUSH PRIVILEGES;

2. LISTEN IP 대역 변경

위에서 작성한 [Listen IP 대역 변경] 하는 오류 해결 글을 확인합니다.


긴 글 읽어주셔서 감사합니다. 자동화 배포까지 포스팅 합니다!

profile
Full-stack Engineer. email - corner3499@kakao.com,

0개의 댓글