AWS로 서비스 이전을 위한 사전준비

- 11 mins

Summary:

AWS로 서버이전을 하기 위한 사전작업들과 AWS 콘솔 셋팅

이전 서버 사양 체크

1) 리눅스 버전체크

uname -a

2) CentOS 버전체크

cat /etc/redhat-release

grep . /etc/*-release

3) 하드용량 체크

df -h

4) 메모리 체크

free -m

5) CPU 코어수 확인

cat /proc/cpuinfo | grep processor | wc -l

6) PHP 버전 체크

php -v | head -1

6) MySQL or MariaDB 버전체크

mysql --version

대략적으로나마 파악한 스펙을 기준으로 삼아 적당한 인스턴스를 생성한다.

AWS EC2 사양 및 요금표 참조

AWS 인스턴스 생성과 기본 셋팅정보 확인

여기서는 테스트용 서버이므로 프리티어 사양인 t2.micro 로 셋팅하고,

~~AMI(Amazon Machine Image)는 새로나온 Amazon Linux 2 LTS를 사용했다.가 여러가지 문제가 있어서

표시한 첫번째 AMI로 생성했다.~~

** 2018.03 AMI 구버전이 더이상 업데이트 되지 않는다는 오피셜이 떠서 그냥 CentOS 그대로 진행하기로 변경 **

ami_image

1) 쉘 접속

인스턴스가 생성됬으면 각 OS에 맞는 방법으로 쉘에 로그인한다.

AWS에서 인스턴스를 만든 후 기본생성되는 사용자 이름은 다음과 같다.

aws 공식문서 참조

2) 시스템 시간 설정

서울 리전에서 인스턴스를 생성했어도 서버시간이 UTC로 되어있으니 이를 Asia/Seoul/로 변경해준다.

vi /etc/sysconfig/clock

Linux Timezone Setting

시스템 전체에 적용하기 위해 /usr/share/zoneinfo의 적절한 파일에 /etc/localtime을 심볼릭 링크한다.

ln -sf /usr/share/zoneinfo/Asia/Seoul /etc/localtime

잘 적용됬는지 시간 확인

date

추후 php를 설치하면 php.ini 설정파일에서 date.timezone을 검색해서 거기도 ‘Asia/Seoul`로 바꿔줘야 한다

3) hostname 설정

SSH 쉘로 접속시 콘솔창에 뜨는 보기싫은 서버이름을 변경해준다.

보통은 인스턴스에 연결한 도메인으로 설정한다.

빈 파일일 경우 그냥 도메인명 써주고 닫는다.

vi /etc/hostname

적용!

hostname -F /etc/hostname

쉘에 재접속 하면 적용되어있다.

4) CentOS 방화벽 설정

CentOS 7 버전을 사용한다면 firewall을 사용해도 되지만 여기서는 6.X 버전대에서 사용가능한 iptables 를 사용하여 설정한다

기본적으로 SSH(22)포트만 허용이 된 상태이므로 80포트는 AWS의 Security Group 과는 별개로 OS 단에서 추가적으로 80포트를 열여줘야 하는 것 같다 ==(확실하지 않으니 확인 필요)==

vi /etc/sysconfig/iptables

22번 포트 설정 아래에 80포트 설정을 추가해준다

-A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT 

-A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
// 특정 IP 허용

-A INPUT -s ip 주소 -j ACCEPT



// 특정 IP 차단

-A INPUT -s ip 주소 -j DROP



// 특정 Port 허용

-A INPUT -p tcp –dport 443 -j ACCEPT



// 특정 Port 차단

-A INPUT -p tcp –dport 443 -j DROP

방화벽 설정을 끝냈다면 방화벽을 재시작해준다.

(둘중 하나만 하면 된다.)

/etc/init.d/iptables restart

service iptables restart

열린 포트 확인

netstat -antl

5) OS에 설치되어 있는 프로그램 최신버전으로 패치 및 패키지 그룹 설치

RedHat 계열이므로 패키지 관리자 프로그램으로 yum을 사용한다.

sudo yum update

기본 제공되는 계정인 centos를 그대로 사용하므로 sudo를 입력해야 진행이 된다.

아니면 root 계정 패스워드를 설정 후 root 계정으로 진행해도 되지만 여기서는 기본계정 그대로 진행

6) 기본적인 패키지 설치

yum groupinstall "Development Tools"

# 그외 필요에 따라서 설치 

yum install yum-fastestmirror

yum install netconfig

yum install ntsysv

yum install wget

yum install tcpdump

7) yum 저장소에서 설치가능한 패키지 확인

yum list httpd

yum list php

Amazon Linux AMI를 사용할 경우에는 하기 이미지와 같은 버전으로 설치되니 참조

apache version

php version

7-1) Apache와 PHP 기본제공 외 버전 설치

CentOs 6.9 버전에서는 원하는 버전이 기본 저장소에 없다.(아파치 2.4 / PHP 5.6 이상)

아래 커맨드로 가능 추가 저장소를 추가 시켜준다.

yum --enablerepo=extras install  centos-release-scl

repo add

원하는 apachePHP버전을 명시해서 설치해준다

yum install   httpd24  rh-php56   rh-php56-php

확인해보자

// 확인

rpm -qa httpd php

// 상세확인

rpm -qa | grep http

rpm -qa | grep php

확인 후 만약 명시한 버전으로 설치되지 않았다면 제거를 해준다.

//기존 yum 패키지 제거

yum remove -y httpd php

rpm 기본정보 설치가 아닌 정보는 별도로 제거

각 상세정보 확인에서 뜨는 저장소를 메모장이나 기타 편집기로 가져가서 rpm -e --nodeps~(의존성에 개의치 않고 삭제)를 붙여준다

rpm -e --nodeps rh-php56-php-cli-5.6.25-1.el6.x86_64

rpm -e --nodeps rh-php56-php-pear-1.9.5-4.el6.noarch

rpm -e --nodeps rh-php56-php-5.6.25-1.el6.x86_64

rpm -e --nodeps php-common-5.3.3-49.el6.x86_64

rpm -e --nodeps rh-php56-php-xmlrpc-5.6.25-1.el6.x86_64

rpm -e --nodeps rh-php56-runtime-2.3-1.el6.x86_64

rpm -e --nodeps rh-php56-php-common-5.6.25-1.el6.x86_64

rpm -e --nodeps rh-php56-php-process-5.6.25-1.el6.x86_64

rpm -e --nodeps rh-php56-php-xml-5.6.25-1.el6.x86_64

rpm -e --nodeps rh-php56-2.3-1.el6.x86_64

rpm -e --nodeps php-cli-5.3.3-49.el6.x86_64

rpm -e --nodeps rh-php56-php-gd-5.6.25-1.el6.x86_64

rpm -e --nodeps rh-php56-php-pdo-5.6.25-1.el6.x86_64

rpm -e --nodeps rh-php56-php-pecl-jsonc-1.3.6-3.el6.x86_64



rpm -e --nodeps httpd24-httpd-tools-2.4.27-8.el6.x86_64

rpm -e --nodeps httpd-tools-2.2.15-60.el6.centos.6.x86_64

rpm -e --nodeps httpd24-apr-1.5.1-1.el6.x86_64

rpm -e --nodeps httpd24-libnghttp2-1.7.1-1.el6.x86_64

rpm -e --nodeps httpd24-httpd-2.4.27-8.el6.x86_64

rpm -e --nodeps httpd24-1.1-18.el6.x86_64

rpm -e --nodeps httpd24-runtime-1.1-18.el6.x86_64

rpm -e --nodeps httpd24-apr-util-1.5.4-1.el6.x86_64

기본 저장소에 없는 버전대를 설치할 경우 생기는 문제는 조금더 확인이 필요할 듯

8) Apache기본 경로 변경

기본적으로 설정되어 있는 /var/html 경로를 사용하진 않으므로 경로를 바꿔준다.

  1. 아파치 설정파일 httpd.conf 를 직접 바꾼다. (비추천)

  2. 별도의 설정파일을 아파치 설정파일에 설정해서 따로 관리를 한다

혼자 사용할 개인서버가 아니므로 관리의 편의상 여기서는 2번 방법으로 진행한다.

CentOSUbuntu와 아파치 설정 파일 경로와 enable 시키는 방식이 다르니 참고

아파치 설정 파일을 열어주고 ,

vi /etc/httpd/conf/httpd.conf

설정파일 제일 하단에 가상호스트 설정 파일경로를 추가해준다.

apache conf

NameVirtualHost *:80

include /etc/httpd/conf/extra/httpd-vhosts.conf

include 시킨 경로에 폴더와 파일을 생성해주고 아래와 같이 입력한다.

<VirtualHost *:80>

    DocumentRoot /home/{user}/www/public_html

    ServerAdmin dev@test.com

    ServerName test.com

    ServerAlias www.test.com

    #ErrorLog logs/test.com-error_log

    #CustomLog logs/test.com-access_log combined



    <Directory "/home/{user}/www/public_html">

       # 필요할 경우 선언

       php_admin_value open_basedir /home/{user}/www/public_html:/home/{user}/www:/home/{user}/www/php_lib

       Options Indexes FollowSymLinks

       AllowOverride None

       Order allow,deny

       Allow from all

    </Directory>

</VirtualHost>

주의 사항으로 <Directory > 부분을 웹에서 복사 붙여넣기 할경우 정상작동을 안하는 경우가 있다.

또한 위 설정내용은 Apache2.2 버전에 해당하는 내용으로 2.4버전 이상은 설정값이 조금 다르니 참고

설정파일을 수정했다면 먼저 문법 검사를 한 후 아파치를 새로고침 혹은 재시작 해주자

service httpd configtest

service httpd restart

9) 권한설정

설정파일에서 설정한 경로의 권한과 그룹을 맞춰준다.

chmod  711  /home/{user}
chmod  755  /home/{user}/www
chown {user}:apache /home/{user}/www

10) selinux 설정 변경

CentOS 는 SELinux라는 보안강화 모듈이 설치 및 활성화 되어있는데,

간혹 이로인해 웹에서 접근시 permission error 가 뜰 경우 아래와 같이 조치한다.

기본적으로 웹 소프트웨어 업로드 및 파일 쓰기 기능을 막는 기능이라고 생각하면 되고 문제가 생길경우 꺼주자

setenforce 0

vi /etc/sysconfig/selinux

여기서 파일 중간의 SELINUXdisabled로 변경해 준다.

selinux

Apache httpd의 기본 DocumentRoot의 SELinux security context 확인

ls -alZ /var/www/html

//output

drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 .

drwxr-xr-x. root root system_u:object_r:httpd_sys_content_t:s0 ..

-rw-r--r--. root root unconfined_u:object_r:httpd_sys_content_t:s0 index.php

새로 변경한 DocumentRoot의 SELinux security context 확인

ls -alZ /home/username/public_html/

//output

drwxr-xr-x. username username unconfined_u:object_r:httpd_user_content_t:s0 .

drwx--x--x. username username unconfined_u:object_r:user_home_dir_t:s0 ..

-rw-r--r--. username username unconfined_u:object_r:httpd_user_content_t:s0 index.html

chcon 명령으로 SELinux security context 변경

chcon -Rv --type=httpd_sys_content_t /home/{username}/public_html

//output

changing security context of ‘/home/username/public_html/index.html’

changing security context of ‘/home/username/public_html’

변경내용 확인

ls -alZ /home/{username}/public_html/

//output

drwxr-xr-x. username username unconfined_u:object_r:httpd_sys_content_t:s0 .

drwx--x--x. username username unconfined_u:object_r:user_home_dir_t:s0 ..

-rw-r--r--. username username unconfined_u:object_r:httpd_sys_content_t:s0 index.html

현재 SELinux 상태 확인

sestatus

//output

SELinux status:                 enabled

SELinuxfs mount:                /sys/fs/selinux

SELinux root directory:         /etc/selinux

Loaded policy name:             targeted

Current mode:                   enforcing

Mode from config file:          enforcing

Policy MLS status:              enabled

Policy deny_unknown status:     allowed

Max kernel policy version:      28

해당내용 참고 URL stackoverflow

웹서버가 정상적으로 작동하는지 확인한다.

이때 ELB를 연결 했다면 ELB의 DNS name으로 확인 해보면 된다.

혹시 안된다면 error_log를 살펴보자

가상호스트 설정파일에 로그 경로를 입력했을 경우 해당 경로로 지정해주면 된다

tail -n 20 error_log_file

tail -f error_log_file

11) RDS 셋팅

(추후 작성)

12) 기존 DB에서 RDS로 데이터 이관

일단은 AWS에서 데이터 이관에 관한 훌룡한 메뉴얼을 제공해주고 있으니 참조 (한글로)

MariaDB 인스턴스로 데이터 가져오기 AWS 메뉴얼

여기서는 다음과 같은 순서로 진행한다.

  1. 온프레미스에서 DB에서 dump

  2. dump된 파일의 용량에 따라 압축

  3. 파일을 로컬로 다운로드 -> EC2로 업로드 (SFTP 사용)

  4. RDS 인스턴스에서 이관

DB 덤프 (cli에서 하던 workbench 같은 툴로 하던 아무거나)

mysqldump -u db_user -p --databases db_name --single-transaction --compress --order-by-primary > origin_dump.sql

용량에 따라서 압축

tar -zcvf origin_dump.tar.gz origin_dump.sql

filezilla 같은 툴을 통해 SFTP로 EC2에 접속하여 덤프파일을 업로드 해준다

이때 S3에서 가져오는 방법등 다양한 방법이 있으나 일단은 테스트 용이므로 직접 업로드를 했다.

EC2로 업로드 되면 압축해제

tar -zxvf origin_dump.tar.gz origin_dump.sql

자주 안써서 자꾸 까먹는 tar 옵션

옵션 설명

|——–|——–|

-c 파일을 tar로 압축
-p 파일 권한을 저장
-v 압축 혹은 해제 과정을 화면에 출력
-f 파일 이름을 지정
-C 경로를 지정
-x tar 압축해제
-z gzip으로 압축 혹은 해제

EC2에서 RDS mysql 접속

mysql -h <rds.endpoint> -P 3306 -u <db_master_user> -p

rds의 endpoint는 AWS manage console의 RDS -> instance -> 인스턴스 set detail 로 접근 후 스크롤을 조금만 내리면 Connect 부분에 Endpoint가 있다.

참고로 당연한 얘기지만 EC2에 mysql client 설치를 하던가 해서 접속한다는 가정하의 진행이다.

이관 시작

source path/origin_dump.sql

RDS와 커넥트가 안될경우 패키지 확인후 mysql 관련 패키지 추가 설치

mysql55-devel

mysql-devel

일반적으로 새로운 소스코드는 정상적으로 작동할테지만 기존 소스를 이관하는 경우 추가적으로

php.ini 혹은 httpd.conf 등의 설정파일 상의 문제일 가능성이 크니 이때는

이관하려는 본 서버의 설정을 참고 하는 수밖에 없다.

13) 편의를 위한 리눅스에 aws cli 설치

awscli 패키지는 APT 및 yum과 같은 다른 패키지 관리자용 리포지토리에서 사용할 수 있지만, pip에서 가져오거나 번들 설치 관리자를 사용하지 않는 한 최신 버전이 보장되지 않으므로 pip를 사용하길 추천

pip --version

pip가 없는 경우 설치되어 있는 Python 버전을 확인한다

python --version

// 혹은

python3 --version

python 이 없을 경우 python을 설치한다.

AWS market의 CentOS 6.9에서는 Python 2.6.6이 기본으로 설치되어 있는데 이로 진행하면 pip2.x로 설치가 되고

awscli 과정에서 에러가 나니 python3.X를 설치해준다.

yum install https://centos6.iuscommunity.org/ius-release.rpm

yum install python35u

python3.5 -V



cd /var/local/

wget https://bootstrap.pypa.io/get-pip.py

python3.5 get-pip.py

pip3 -V

python3이 아닌 python3.5라고 마이너 버전까지 명시 해줘야 한다…(확인 필요)

  1. pypa.io에서 설치 스크립트를 다운로드
curl -O https://bootstrap.pypa.io/get-pip.py
  1. Python을 사용하여 스크립트를 실행
python get-pip.py --user
  1. 실행 경로 ~/.local/bin을 PATH 변수에 추가

    1. 사용자 폴더에서 셸의 프로파일 스크립트를 찾는다.

      어떤 셸을 가지고 있는지 잘 모르는 경우 echo $SHELL을 실행한다.

ls -a ~

.  ..  .bash_logout  .bash_profile  .bashrc  Desktop  Documents  Downloads
2. 내보내기 명령을 프로필 스크립트에 추가
export PATH=~/.local/bin:$PATH

이 명령은 이 예제의 ~/.local/bin 경로를 현재 PATH 변수에 추가한다.

3. 프로필을 현재 세션에 로드한다.
source ~/.bash_profile
  1. pip버전을 확인한다.
pip3 --version
  1. pip를 사용하여 AWS CLI를 설치 및 버전확인
pip3 install awscli --upgrade --user

aws --version
comments powered by Disqus
rss facebook twitter github youtube mail spotify lastfm instagram linkedin google google-plus pinterest medium vimeo stackoverflow reddit quora quora