AWS 알아보기
OS : Ubuntu 16.04 LTS
이번 포스팅에서는 아마존클라우드웹서비스(AWS)에 회원가입을 하고, 간단하게 로컬환경에 있는 폴더를 아마존 서버에 올리는 것까지 연습하는 것을 목표로 한다. AWS를 처음 보면 웹 홈페이지가 굉장히 딱딱해보이고, 절차도 생각보다 복잡하다.
이 포스팅을 위해서 계정을 두 번 갈아 엎었다. 세번째 시도해서야 내 생각대로 조금씩 동작하는 느낌을 받을 수 있었다. 사실 처음에는 인스턴스라는 말이 굉장히 딱딱해보이는데, AWS에 배정받는 새로운 컴퓨터 한대라는 느낌만 가져가도 충분히 성공한 포스팅이라고 생각한다.
아마존 웹서비스와 클라우드
클라우드
의 핵심적인 아이디어는, 인터넷으로 또 다른 컴퓨터(크고, 복잡하고, 성능이 좋은)를 연결해 사용할 수 있는 것이다. 아마존 웹서비스는 아마존이 제공하는 클라우드 서비스(줄여서 AWS)를 이용해서 컴퓨터 작업을 진행할 수 있다.
지역과 가용구역
지역(region) : AWS가 어느 위치에 있는가?. 위치가 가까울수록 속도가 빨라질 확률이 높다. 전에는 일본의 Region을 이용했지만 2016년부터 한국이 12번째 region으로 선정되면서, 지역을 서울로 선택할 수 있다.
가영영역(availiability zone) : 지역 다음으로 살펴봐야 할 것이 가용영역이다. 지역 내에는 또 다시 여러 개의 데이터센터로 나뉜다. 혹시 모를 상황에 대비해 예비 센터가 존재한다. 이 가용영역끼리는 전용선
으로 이어져 있어서 데이터의 송수신이 가능하다. (지역간도 가능하지만 느림)
EC2 소개
EC2(Elastic Compute Cloud)는 독립된 컴퓨터를 제공해주는 상품이라고 생각하면 된다.
1. 회원가입
첫 메인페이지. 인터페이스가 참...
처음 이용한다면 새 사용자입니다를 클릭한다.
모든 개인정보는 영어
로 입력해야 통과가 가능하다.
해외 결제가 가능한 카드 번호를 입력하면 1.5달러 정도가 통장에서 빠져나간다. 유효한 카드번호인지 확인하는 것이니 나중에 다시 돌려준다. 다음 단계에서 ARS 인증을 받는다.
전문적인 개발자가 아니라면 기본
을 선택한다.
2. 가격정책
AWS 프리티어의 경우 1년 동안 매달 750시간을 무료를 제공한다. 한달 내내 켜놔도 720시간 남짓이니 사실상 공짜이다.
요금제를 살펴보면 지역에 따라, 운영체제에 따라, 인스턴스 타입에 따라 가격이 달라진다.
요금제 역시 다양하게 세분화되어있다.
온 디맨드 인스턴스(On-demand)는 우리가 필요할때마다 인스턴스를 끄고, 킬 수 있는 형태의 서비스를 의미한다.
예약 인스턴스는 할인권 개념이다. 만약, 우리가 운영할 서비스가 1년 동안 끌 필요가 없다면 경우에 따라서는 더욱 저렴하게 서비스를 이용할 수 있다. 3년 동안 서비스 혜택을 받을 수 있다.
스팟 인스턴스를 구입하면, 놀고있는 컴퓨터가 많으면 가격이 저렴해지고, 놀고 있는 컴퓨터가 없으면 가격이 높아질 수 있는 개념이다. (주가처럼 가변적인 가격정책을 가져간다.)
3. 인스턴스 생성하기
첫 메인화면에서 EC2(Elastic Computer Cloud)
를 검색한 뒤 EC2
를 클릭한다.
접속을 하고나면, 상단 오른쪽 부분에서 Asis Pacific(Seoul)
로 바꿔준다.
그리고 Create Instance
를 클릭해 AWS 인프라 위에 컴퓨터 하나(인스턴스 하나)를 생성한다.
2-1 가상머신 선택(AMI, Amazone Machine Image)
위에서는 EC2 서비스를 이용해 새로운 컴퓨터를 배정받을 수 있다. 인스턴스를 생성하려고 하면 맨 처음화면에서 운영체제
를 설정할 수 있다. Free tier eligible
이라고 써져있다면 1년 동안 무료 사용이 가능하다. 여러 아마존 가상 머신들이 있지만 본 포스팅에서는 서버 운용에 적합한 Ubuntu Server 16.04
를 선택했다.
2-2 인스턴스 타입 선택 (Instance Type)
인스턴스는 컴퓨터 하나라고 생각하면 된다. Instance Type
은 컴퓨터의 사양이라고 생각하면 된다. 이 역시 Free tier eligible
이라고 써져있는 것이 1년간 무료로 제공되는 인스턴스이다. 앞으로 새롭게 배정받은 컴퓨터를 인스턴스
라고 표현하겠다.
Family
는 인스턴스의 목적에 따라 나뉜다. 어떤 것은 용량에 강점을 갖고, 어떤 것은 GPU에 강점을 갖는다.
vCPUSs
는 몇 개의 CPU인가? 여기서 v
는 가상화(virtual)를 의미한다.
Mememory
는 몇 기가바이트의 메모리를 갖고 있는지를 의미한다.
network Performance
는 말 그대로 네트워크의 성능이다.
자신의 상황에 맞게 사양을 알맞게 선택하면 된다.
2-3 인스턴스 세부 환경 설정 (Configure Instance Details)
Number of Instances
대여받을 인스턴스 수를 설정할 수 있다.
Purchasing Option
에서는 가변적인 요금제를 갖는 스팟 인스턴스를 선택할 수 있다.
Network
, Subnet
, Auto-assign Public IP
를 통해서 자신의 네트워크환경을 커스텀 할 수 있다.
Shutdown Behavior
는 우리가 만든 운영체제를 셧다운시키면 Stop
시킬 것인지, Terminate
할 것인지 정할 수 있다. Stop
을 사용하면 저장장치에 해당하는 비용만 해당하고, Terminate
를 설정하면 데이터가 날라갈 수 있다.
Enable termination protection
을 설정하면 실수로 인스턴스를 삭제하는 것을 방지할 수 있는 기능이다.
Monitoring
은 인스턴스의 상태(CPU, 메모리점유율)를 더 디테일하게 저장할 수 있도록 도와준다. 단, 추가 요금(additional charges)이 적용된다.
2-4 스토리지 추가하기 (Add Storage)
아마존에서는 스토리지를 EBS
라는 말을 사용한다. 이는 Elastic Block Store의 줄임말로 일종의 하드디스크라고 생각하면 된다.
Size
는 이러한 EBS
의 용량을 정할 수 있다. 30GB
까지는 무료다. 만약 리눅스를 만들면 8GB, 윈도우를 만들면 30GB로 세팅된다.
Volume Type
은 우리가 만든 저장장치가 어떤 형식으로 할지 정하는 것이다. 아무래도 SSD가 훨씬 빠르다. Provisional IOPS는 우리가 속도를 정할 수 있는데, 이 속도를 높게 잡을수록 가격이 뛴다.
Delete on Termination
이 체크되어있으면 저장장치도 삭제된다(하드디스크도 같이 폐기되는 개념). 체크가 해제되어있으면 저장장치는 남아있다. 나중에 인스턴스를 폐기해야 하는데, 체크가 해제되어있으면 남아있는 저장장치에 대해서는 요금이 과금될 수 있다.
EBS의 특징은 아래와 같다.
필요한 용량에 맞게 구입 할 수 있다. 이를테면 EC2 인스턴스를 웹서버의 용도로만 쓰고 파일 저장은 S3를 사용한다면 넉넉 잡고 1기가바이트만 구입하면 된다.
필요에 따라서 즉시 생성하고, 제거 할 수 있다.
사용한 만큼 과금 되는 종량제다. 자세한 내용은 설명서의 비용예측을 참고한다.내부적으로 데이터를 실시간 복제하고 있기 때문에 하드디스크에 비해서 데이터를 잃어버릴 확률이 현저히 낮다.
스냅샷 기능을 제공해서 EBS의 현재 상태 그대로 보존 할 수 있다.
CloudWatch를 통해서 EBS의 통계를 열람 할 수 있다.
EC2 인스턴스를 제거해도 EBS는 독립적이기 때문에 데이터가 유지 된다.
2-5. 태그 추가하기 (Add Tags)
우리가 인스턴스를 만들 때, 만든 인스턴스가 어떤 역할을 하는지, 누가 관리를 하는지의 태그를 달아줄 수 있다.
2-6 보안그룹 설정하기 (Configure Security Group)
인스턴스에 접근하는 권한을 지정할 수 있다. 네트워크를 통해 누가 접속할 수 있게 할건지 일종의 방화벽 역할을 한다. 네트워크에 대한 지식이 필요한 부분이다. 만약 지식이 조금 부족하다고 느껴지면 여기서 강의를 들을 수 있다.
인스턴스를 새로 만드는 경우라면 Create a new security group을 선택하고, 그룹 이름과 설명을 달아줄 수 있다.
그리고, Security Group
에 대해 정책을 설정할 수 있다. 우리가 만든 인스턴스에 접속할 수 있는 여러가지 방법들이 있다. 원격접속도 있고, FTP를 이용해 파일 업로드를 위한 접속도 있고, 일반 사용자들이 접속하는 경우 등 여러가지 방법이 있다.
모든 경우의 접근을 허용하면 문을 활짝 열어놓는거나 다름없으므로, Type
을 통해 접근 제한을 가할 수 있다. SSH(Secure Shell)
은 원격제어를 통해 접근하는 경우(유닉스, 리눅스 계열)의 방식이다. 우리가 만든 인스턴스가 리눅스 계열이라면 SSH
를 설정해줘야 한다. Source
에서 everywhere
는 모든 SSH의 접속을 허용한다는 의미다. 만약 접근 제한을 가하려면 My IP
를 지정해줘야 한다.
만약 인스턴스를 웹서버로 활용한다고 한다면, 다른 사람들의 접속 역시 허용해야 한다. 이 경우에는 Add Rule을 눌러서 HTTP
타입을 설정한 뒤 80번 포트를 이용해 접근하도록 해야 한다.
만약 Window 환경의 인스턴스라면 RDP
타입을 사용해서 원격제어가 가능하다.
2-6. 인스턴스 비밀번호 생성 (Key Pair)
키 페어를 설정하면, AWS가 비밀번호를 만들어서 다운로드 받게 만들어준다. 그리고 우리가 생성한 인스턴스에 비밀번호를 심어놓는다. 우리가 인스턴스에 접속하려고 한다면, 이 비밀번호를 같이 들고 통과해야 한다.
위에서 Launch
를 누르게 되면 key pair
를 생성하라고 한다.
인스턴스를 처음 만든다면 Download Key Pair
를 눌러서 받은 .pem
확장자의 파일을 .ssh
폴더로 옮겨주자.
최종적으로 .ssh
라는 폴더 안에 practice.pem
을 옮겨놔야 한다. 다시 설정창으로 돌아간 뒤, Choose an existing key pair
를 선택해 방금 받은 key pair를 선택하자.
그러면 Instance를 클릭해보면 AWS 자원위에 컴퓨터 하나가 올라갔다고 볼 수 있다.
2-7. 리눅스에서 웹서버 사용
만약 다른 사용자에게 웹페이지를 보여주려고 한다면, Security Group
을 지정해줘야 한다.
80번 포트가 지정되어 있지 않다면 사용자들은 웹서버로 접속할 수 없다. 만약 설정되어 있지 않다면, Security Group
- Inbound
에서 Type이 HTTP
이고 Port Range가 80번을 설정해줘야 한다.
3. AWS 인스턴스 연결하기
이제 AWS에 컴퓨터를 하나 올려놨으니, 이 컴퓨터(인스턴스)에 연결할 수 있다.
이 단계에서 아까 옮겨놓은 .pem
파일과 방금 생성한 인스턴스의 Public DNS
가 쓰이게 된다.
[가상머신 고유 유저명]은 가상머신 설정(AMI)에 따라 달라진다.
Amazon Linux : ec2-user
Ubuntu : ubuntu 또는 root
Centos : Centos
Fedora : ec2-user
yes를 입력
yes를 입력하면 Permission 0664 에러를 일으킨다.
우리가 .ssh
폴더로 가져온 .pem
의 권한을 수정해줘야 한다.
practice.pem
의 권한을 바꿔줘야 한다.
- <파일타입> rwx <user권한> rwx <group권한> rwx <other권한>
4(read) : 읽기 권한
2(write) : 쓰기 권한
1(execute) : 실행 권한
chmod 400
이라면, (user)에게 읽기 권한만 준 것을 의미한다. (즉, -r--------)
chmod 700
이라면, (user)에게 모든 권한을 준 것을 의미한다. (즉, -rwx------)
chmod 777
이라면, (user, group, other)에게 모든 권한을 준 것을 의미한다. (즉, -rwxrwxrwx)
이제는 아마존 쉘 접속이 가능하게 되었다. 다시 로컬환경으로 돌아오고자 한다면 exit
명렁어를 입력한다.
그러나 아직 문제점이 남아있다. ssh -i ~/.ssh/[].pem ubuntu@[public DNS]
라는 길고 험난한 명령어를 처야 AWS의 인스턴스로 연결이 가능하다. 이러한 비효율적인 불상사를 막기 위해 alias
설정을 한다.
본인은 zsh
를 쓰고 있기 때문에 vim ~/.zshrc
로 들어가서 맨 하단에 alias
설정을 해주었다.
alias 설정은 포스팅 하단 번외에서 다루도록 하겠다.
4. 인스턴스 연결 후 세팅
지금까지 우리는 컴퓨터 자원(인스턴스)을 만들고, 이를 AWS 서버에 올리고, 연결까지 했다. 이제 우리는 AWS 위에 있는 컴퓨터를 쓰려고 한다. 인스턴스 연결에 성공했다면 순정이나 다름없는 컴퓨터 한 대를 쓰게되는 것이다.
이번 파트에서는 각자 환경에 맞는 세팅을 실시하면 된다. 본인은 python-pip
, zsh
, oh-my-zsh
, pyenv
, tree
를 설치했다.
python-pip 설치
zsh 설치
oh-my-zsh 설치
설치 후에 AWS 인스턴스 연결을 해제한 뒤(exit
) 다시 들어오면 셸이 변경된다.
쉘 변경에서 "Password: chsh: PAM: Authentication failutre" 라는 오류가 발생한다면 아래와 같은 명령어를 입력한다.
$ sudo chsh ubuntu -s /bin/zsh
pyenv requirements 설치
pyenv 설치
pyenv 설정 .zshrc에 기록
처음에 python --version
을 치게되면 Python 2.7.12
다.
pyenv install 3.6.1
을 설치한 뒤 pyenv versions
를 해보면 system이 메인 python이라면, pyenv local 3.6.1
을 실행해 로컬폴더의 파이썬 환경을 3.6.1
버전으로 바꿔준다.
그리고 다시 pyenv versions
를 해보면 *
모양이 옮겨진 것을 확인해야 한다.
tree 설치
5. 로컬 환경 폴더를 AWS 인스턴스로 옮기기
5-1 AWS 인스턴스 환경
AWS 인스턴스 연결후, 가장 상위 폴더로 올라가보면 srv
이라는 폴더가 있다. 이 폴더에는 서비스 디렉토리의 준말로, 주로 ftp, http, cvs 등의 데이터가 존재한다. 로컬 환경이나 AWS 인스턴스 환경은 cdrom
폴더만 제외하고는 구조가 똑같다.
아무튼, 로컬 환경에서 AWS 인스턴스로 복사하고자 한다면 이 srv
폴더의 권한을 수정해야 한다.
이때, SCP
(Secure Copy)라는 개념이 들어가는데 자세한 내용은 번외에서 설명한다.
폴더의 소유권한(chown)을 ubuntu
로 srv
폴더 안까지 모두(-R
옵션) ubuntu
로 바꿔준다.
5-2 로컬환경으로 돌아가야 한다.
AWS 인스턴스 내 복사하고자 하는 폴더의 권한을 변경하는데 성공했다면, 다시 로컬환경으로 돌아가야 한다. 이때 리눅스의 서버와 서버간 파일 또는 폴더 복사는 scp
라는 명령어를 이용하게 된다.
간단하게 쓰려해도, 디렉토리의 경로 전체를 써줘야하기 때문에 길어질수밖에 없다.
실제 예제를 살펴보면 위와 같다. 파일의 폴더복사 역시 .ssh
폴더내에 key
를 통해서 이루어진다는 것과 -R
옵션을 기점으로해서 왼쪽이 복사하려는 폴더(파일) 위치, R
옵션 오른쪽이 계정@DNS:복사 위치
로 나뉜다는 것을 볼 수 있어야 한다.
이 역시 명령어가 길어지기 때문에, alias
설정을 할 수 있다. alias
에 관해서는 번외에서 설명하도록 하겠다.
VPC <--- Security GROUP <-- EC2 <-- Django(런서버))
직접 겪은 에러
1. Permission Denied
모든걸 똑같이 쳤는데, Permission Denied
가 떠서 당황했다. 구글링해도 안나오고, 수십번을 확인해도 나오지 않은 에러였다. 내가 저지른 실수는 AWS 인스턴스를 만들 때, 가상환경 이미지를 잘못설정했기 때문이다.
서버 인스턴스를 만들때 가상환경 이미지를 ubuntu
가 아니라 red hat
으로 만들었기 때문에 발생했던 문제였다. 이후에는 정상적으로 작동했다. 참고로 가상환경 이미지에 따라서 user 이름
이 달라질 수 있으니 확인해야 따로 확인해야 한다.
이 블로그를 참고해 AWS 인스턴스 내 쉘 환경(vim ~/.vimrc
)을 수정했다.
2. 아마존 쉘 내 한글깨짐 문제
3. 로컬에서 AWS인스턴스로 파일 복사할때 발생하는 문제
AWS 인스턴스 내 복사하고자 하는 폴더의 권한을 변경해야 한다.
본문 5-1
에서 문제를 해결하는 방법이 나와있다.
번외
1. AWS CLI를 통한 인스턴스 연결법
AWS CLI(Command Line Interface)는 명령줄을 통해 AWS를 제어하고, 스크립트를 자동화할 수 있는 인터페이스를 제공한다.
위 명령어로 설치 가능하다.
우리가 만든 서버 인스턴스는 콘솔을 출력할 수 있는 모니터가 없다.get-console-output
의 명령어는
퍼블릭키를 hash를 이용해 짧게 만들어준 서버에서 주는 지문값이랑 같은지 비
AWS CLI 에러 해결법
아마, 높은 확률로 위와 같은 에러 메시지를 만나게 될 것이다. AWS CLI를 설치하고 처음 해야 할 일은 Access Key
및 Secret Access Key
그리고 기본 region
및 출력 format
을 설정하는 것이다. 참조(AWS 한국블로그)
이때, 접근 키(Access Key, Secret Access Key)는 Root 권한이 아닌, IAM
(Identiy & Access Management)라는 개별 서비스 권한 사용자를 생성하고 만든 키를 사용하는 것이 안전하다.
IAM을 통한 키 생성
먼저, 메인 페이지로 돌아가서 IAM
을 검색하자.
왼쪽 사이드바에 Users
를 클릭하고, 유저를 추가하자. 그러면 4단계를 거친다.
1단계 user 세부사항 설정
접근타입은 Programmatic access
을 체크해야 Access Key
와 Secret Access Key
를 발급해준다. Secret Access Key
는 한번 확인하고나면 다시 확인할 수 없기 때문에 생성 후에 잘 복사해두어야 한다.
2단계 user에 대한 권한 설정
말 그대로, 우리가 만든 user에게 권한을 어디까지 줄 것이냐?를 선택하는 항목이다.
여기서는 AmazoneEC2FullAccess
에만 항목을 체크한다.
3단계, 4단계 검토 및 완성
우리가 만든 user에 대해 검토를 하고, 4단계에서는 완료페이지다. 만든 유저가 생성되면 Success
라는 메시지를 출력한다. 그리고 우리가 원했던 Access key
와 Secret Access Key
가 나온다.
AWS configure
다시 콘솔로 돌아가서, 위의 명령어를 입력한다.
차례대로 한줄씩 방금 만든 IAM
유저의 키와 비밀키를 입력한다.
region
에는 한국을 의미하는 ap-northeast-2 (참고로 1은 일본) 을 입력하고,
output format
은 json타입으로 정한다.
만약, 입력을 잘못했다면 홈폴더로 돌아가 .aws
폴더로 이동한 뒤, vim credentials
를 통해 수정한다.
2. IAM 이란?
이미지 출처(http://realmojo.tistory.com/178)
root 계정은 모든 권한이 다들어있어서 잘못 사용했다가는 위험을 초래할 수 있다.
따라서 IAM
을 통해 그룹을 만들고, 권한을 다르게 지정해하게 함으로써 AWS읙 각 리소스에 접근제어 및 권한관리를 하게 할 수 있다.
3. alias 설정하기
자신이 사용하고 있는 쉘 종류에 따라 조금씩 차이가 난다. 본인은 zsh
를 쓰고 있기 때문에 이를 기준으로 설명하고자 한다.
vim ~/.zshrc
명령어를 친 뒤, 하단부에 위와 같이 입력한다.
kkk
부분에는 자신이 만들고 싶은 명령어를 사용하면 된다.
이후에 source ~/.zshrc
를 하거나 터미너를 재부팅함으로써 alias 사용이 가능해진다.
kkk
만 입력했는데도 AWS 서버 내 인스턴스 연결이 가능해진다.
3. SCP(Secure Copy)란?
리눅스 서버 간에 파일다 또는 폴더 복사에 사용되는 명령어는 scp
가 대표적이다.
로 이루어진다. 서버2의 특정계정의 비밀번호를 알고 있어야 하며, 서버2의 특정계정의 쓰기 권한이 있어야 한다.
폴더를 복사하고자 한다면, scp앞에 -r
이라는 명령어를 붙인다.
참고한 사이트
'프로그래밍 > 배포' 카테고리의 다른 글
[AWS] AWS StepFunction을 이용한 이미지 처리 (0) | 2017.11.10 |
---|---|
docker non-zero code 127 error (0) | 2017.08.12 |
[배포] 도커에서 uwsgi, nginx연동 확인하기 (1) | 2017.07.07 |
Nginx 이해하기 및 기본 환경설정 세팅하기 (3) | 2017.07.03 |