2016년 12월 25일 일요일

[AWS] AWS EC2에 Elastic IP 연결하기

[AWS] AWS EC2에 Elastic IP 연결하기


AWS EC2는 중지되었다가 다시 시작하면 Public IP가 변경됩니다.
그래서 Public IP로 SSH접속을 하거나 DNS에 연결시켜 놓기가 불편합니다.
이런 불편함을 없앨 수 있는 방법이 AWS Elastic IP를 사용하는 것입니다.
Elastic IP는 EC2 인스턴스의 상태와 관계없이 고정적으로 유지되는 IP주소라고 볼 수 있습니다.
그리고 다행히 AWS에서는 EC2 인스턴스 하나당 EIP(Elastic IP) 하나를 무료로 사용할 수 있게 해줍니다.
이번 포스팅에서는 EIP를 만들고 EC2 인스턴스에 할당하는 방법을 정리해 봅니다.

1. Elastic IP 메뉴로 이동
AWS EC2 서비스에서 왼쪽 Elastic IP 메뉴를 선택합니다.
그리고 'Allocate new address'를 누릅니다.




2. Elastic IP 생성
우측의 'Allocate' 버튼을 누릅니다.



3. 생성된 Elastic IP 확인
바로 Elastic IP가 생성됩니다.
딱히 기록할 필요는 없습니다. 언제나 확인할 수 있습니다.



4. EC2 인스턴스와 연결
다시 Elastic IP 메뉴로 돌아오면 생성된 EIP가 보입니다.
해당 EIP를 선택하고 위의 'Actions'메뉴에서 'Associate address' 옵션을 선택합니다.



5. EC2 인스턴스 선택
EIP를 연결할 EC2 인스턴스를 선택합니다.
EC2 인스턴스를 선택하면 아래에 Private IP도 자동으로 선택됩니다.
EIP는 한개의 EIP가 한개의 Private IP와 매핑되어야합니다.
그래서 EC2 인스턴스에 여러 Private IP가 있다면 그중 하나를 선택하는 것 같습니다.
선택이 완료되면 하단에 'Associate'를 누릅니다.


6. 끝
끝났습니다.
이제 인스턴스 목록에 가서 EIP를 연결한 인스턴스의 정보를 보면 EIP가 잡혀있고, Public IP가 생성한 EIP로 변경되어 있을 것입니다.





2016년 11월 14일 월요일

[AWS] AWS Route53에서 도메인 등록하기

[AWS] AWS Route53에서 도메인 등록하기

1. 도메인 등록 시작

'Register Domain' 버튼을 눌러서 도메인 등록 과정을 시작합니다.

2. 도메인 검색

등록하고자 하는 도메인을 (1)에 입력하고 (2)에서 확장자를 선택하고 (3)을 클릭하여 등록하고자 하는 도메인이 등록 가능한지 확인합니다.

3. 도메인 선택

검색한 도메인을 사용할 수 있다면 'Add to cart'를 눌러서 선택합니다. 오른쪽 (2)에서 선택한 도메인들과 금액을 확인할 수 있습니다.
모두 선택했으면 (3)을 눌러서 다음으로 넘어갑니다.

4. 등록자 정보 입력

등록자에 대한 정보를 입력합니다.
자신의 정보에 맞게 입력합니다.

5. 등록 완료

(1)에 체크하고 (2)를 누르면 등록이 완료됩니다. 등록 완료후에는 등록자의 이메일로 입력한 이메일로 확인 메일이 갑니다.
이메일에서 확인을 누르고 조금 있으면 등록한 도메인을 사용할 수 있게 됩니다.
사용 예로, AWS Route53의 'Hosted Zone'에서 등록한 도메인과 AWS EC2 인스턴스의 고정 IP를 연결시켜서 사용할 수 있습니다.

2016년 9월 25일 일요일

[AWS] AWS EC2에 생성한 우분투의 루트 계정 활성화하기.

AWS EC2에 생성한 우분투의 루트 계정 활성화하기.

AWS EC2에 우분투 인스턴스를 생성하면 기본적으로 Root계정은 막혀있습니다.
그래서 기본적으로 우분투에 SSH접속하려면 암호로 접속하지 않고 AWS에서 다운로드 하는 키파일로 접속해야합니다.
여러모로 루트 계정을 사용하지 못하는 것은 때때로 불편하니깐 루트 계정을 활성화합니다.

1. 루트 계정 비밀번호 설정

아래 명령어를 입력하여 루트 계정의 비밀번호를 설정합니다.
$sudo passwd root

2. SSH 비밀번호로 접속 가능하게 설정

/etc/ssh/sshd_config 를 에디터로 열어서 'PasswordAuthentication no'항목을 'PasswordAuthentication yes'로 수정합니다.
또한 root를 비밀번호로 사용하는 것이기 때문에
PermitRootLogin without-password
를 찾아서 맨앞에 #를 붙여서 주석처리하고 아랫줄에 다음을 추가합니다.
PermitRootLogin yes
수정이 완료되었으면 저장하고 에디터를 나와서 아래 명령어로 ssh를 재시작 합니다.
$sudo service ssh reload

2016년 9월 24일 토요일

[Web] 우분투(Ubuntu)에 Tomcat 8 설치하기

우분투에 Tomcat 8 설치하기

1. Tomcat 8 다운로드

Tomcat 8 다운로드 페이지( http://tomcat.apache.org/download-80.cgi ) 다운로드 할 톰캣의 다운로드 링크를 알아냅니다.
저는 8.0.37(현재 최신)을 다운로드 받기 위해서 'Core'의 'tar.gz'에 우클릭해서 링크 주소 복사하기를 하였습니다.(http://mirror.navercorp.com/apache/tomcat/tomcat-8/v8.0.37/bin/apache-tomcat-8.0.37.tar.gz)
우분투에서 wget으로 위의 링크의 파일을 다운로드합니다.
$wget http://mirror.navercorp.com/apache/tomcat/tomcat-8/v8.0.37/bin/apache-tomcat-8.0.37.tar.gz

2. Tomcat 8 파일 압축해제 및 폴더 이동

다운로드 받은 Tomcat 8 파일을 압축해제 합니다.
$tar xvfz apache-tomcat-8.0.37.tar.gz
압축을 해제한 폴더를 /usr/local 이하로 이동시킵니다.
$sudo mv apache-tomcat-8.0.37 /usr/local/

3. Tomcat 8 환경설정

/etc/profile를 에디터(vi, nano 등)로 열어서 맨 아래에 아래와 같이 Tomcat 8에 대한 설정을 추가 합니다.
export CATALINA_HOME=/usr/local/apache-tomcat-8.0.37
export CLASSPATH=.:$CATALINA_HOME/lib/jsp-api.jar:$CATALINA_HOME/lib/servlet-api.jar
PATH=$PATH:$CATALINA_HOME/bin
저장하고 나왔으면 아래 명령어로 설정파일을 적용시킵니다.
source /etc/profile

4. 포트 변경

톰캣을 처음 설치하면 접속 포트가 8080으로 되어 있습니다.
이를 HTTP(80) 포트로 변경해줍니다.
설정 파일을 엽니다.
$cd /usr/local/apache-tomcat-8.0.37/conf
$nano server.xml
아래 부분을 찾습니다.
 <Connector port="8080" protocol="HTTP/1.1"
               connectionTimeout="20000"
               redirectPort="8443" />
이 부분에서 8080을 80으로 수정합니다.
<Connector port="80" protocol="HTTP/1.1"
           connectionTimeout="20000"
           redirectPort="8443" />

5. Tomcat 8 구동

톰캣 폴더의 bin 폴더로 가서 톰캣을 구동시킵니다.
$cd /usr/local/apache-tomcat-8.0.37/bin
$sh startup.sh
주의사항! 반드시 루트 권한으로 startup시켜야합니다. 루트 계정인 상태로 진행하거나 sudo를 꼭 붙여줘야 포트가 제대로 열립니다.
웹브라우저에서 http://{ip주소}를 입력하여 웹서버가 구동되었는지 확인합니다.
톰캣 설정 페이지가 나타나면 정상적으로 구동이 된 것입니다.

2016년 6월 26일 일요일

[AWS] AWS EC2 시작하기.

AWS EC2 시작하기.



우선 먼저, 리전을 'Seoul'로 선택한다. 한국에서 사용할 거라면 리전이 가까울 수록 좋을거니깐..
리전은 AWS의 Data Center라고 생각하면 된다. 옛날엔 Seoul이 없었던 것 같지만 이제는 있다. AWS 웹페이지에 로그인한 후에 오른쪽 상단에 계정 우측에서 리전을 선택할 수 있다.
이제 EC2를 사용하기 위해 EC2 Instance를 생성한다.
먼저 'AWS Management Console' 페이지로 들어간다.
거기서 'EC2'를 클릭한다.

그리고 가운데 'Launch Instance'를 클릭한다.

Instance를 생성할 때는 어떤 종류의 Instance를 생성할지 정해야 한다.
여기서는 AMI(Amazon Machine Image)를 선택한다.
오른쪽의 'Select'를 클릭하면 된다.

그 다음으로는 Instance의 성능을 선택하게 되는데, 당연히 성능에 따라서 요금이 다르다.
Free tier는 t2.micro가 무료로 제공되기 때문에 t2.micro를 선택하고 'Review and Launch'를 클릭한다.

다음 페이지에서 경고 문구를 보니, 웹서버를 쓸꺼면 HTTP 포트를 열어주라고 한다.
이 작업은 Security Groups에서 할 수 있다. 'Edit security groups'를 클릭하여 수정 페이지로 간다.

기본적으로 EC2에 접속하기 위한 SSH가 설정되어 있다.
'Add Rule'을 눌러서 방화벽에 통과시킬 포트를 설정한다.

나는 웹서버로 쓸거라서 HTTP와 HTTPS를 추가하였다.
Source에 0.0.0.0/0은 모든 IP로부터의 접속을 허용한다는 것이다.
특정 IP만 허용하게 하려면 수정하면되지만 난 그냥 뒀다.

마지막으로 Review Instance Launch 단계에서 'Launch'를 눌러서 Instance를 생성한다.

마지막!으로 SSH접속을 위한 key를 다운로드 받는다.
Key는 [C:\user{yourusername}.ssh{key이름}.pem] 위치에 저장하는 것이 좋다.(Windows환경)
(Mac/Linux에서는 홈 디렉토리의 .ssh 하위에 저장하는 것이 좋다. [~/.ssh/{key이름}.pem])
Tip. Windows에서 '.ssh' 폴더가 없으면 폴더를 새로 만들고 이름을 '.ssh.'으로 하면 마지막 점은 사라지면서 점으로 시작하는 폴더를 만들 수 있다.


끝났다. 끝났다.
View Instance를 클릭하면 생성한 Instance의 상태정보를 볼 수 있다.



EC2에 접속하기 위해서 나는 Github의 Shell 프로그램을 이용했다.
AWS에서는 Git Bash를 이용하라고 했지만 나는 어차피 Github를 설치 해놔서 Github의 Shell을 썼는데 잘 접속 된다.

접속 방법은 Shell에서 아래의 명령어를 입력하면 된다.
ssh -i 'c:\Users\{yourusername}\.ssh\{key이름}.pem' ec2-user@{IP_Address}
(예: ssh -i 'c:\Users\pcm\.ssh\mykey.pem' ec2-user@52.27.212.125)

ip주소는 EC2 대시보드에서 확인 할 수 있다.

2016년 6월 25일 토요일

[AWS] AWS 가입하기.


AWS 가입하기.




AWS에 가입해서 1년간 무료로 일부 서비스를 이용할 수 있는 Free tier 혜택을 받으려면
이메일, 전화번호, 신용카드가 필요하다.
AWS Korea 웹페이지 링크 : http://aws.amazon.com/ko/
링크에 접속해서 '계정 생성하기'를 통하여 계정을 생성한다.
이메일 주소를 입력하고, 새 사용자를 선택하고, 로그인을 클릭한다.


그럼 가입을 위한 기본정보를 입력하는 페이지가 나온다.
전부 입력하고 '계정 생성'을 클릭한다.
이때 이름은 영문으로 입력해야 한다. 나는 (GilDong Hong) 형식으로 입력했다.


다음페이지에서는 연락처 정보를 입력하는데, 거주지 정보를 입력하면 된다.
이때, 모든 정보는 영문으로 작성해야 한다.
전체 이름은 이전 페이지에서 입력한 것 처럼 GilDong Hong 형식으로 입력했다.
영문 주소 변환은 네이버에서 '영문주소 변환'을 검색하고 주소를 검색하면 된다.


다음은 결제를 위한 정보를 입력한다.
카드정보 입력인데, 프리 티어를 이용하더라도 카드 정보는 반드시 입력해야한다.
그리고 최초 가입 때 1달러가 결제된다.
카드 소유자 이름은 카드에 나온대로 입력하면 된다.


다음은 ID확인이라는데 전화를 통해서 본인 인증 하는 단계이다.
정보를 입력해 놓았으니 바로 전화 걸리를 하면된다. 그러면 전화가 온다.
전화는 한국어로 안내가 나온다. 안내를 받고 가입페이지에 나오는 PIN번호를 입력하면 끝난다.
가입 페이지에서 계속버튼을 누른다.


계획 지원 단계는 서비스 제공 등급인건데...등급이 높을 수록 아마존에서 수준 높은 고객지원 서비스를 제공하는 것 같다.
무료로 이용할 것이므로 '기본'을 그대로 두고 계속 진행한다.

가입 끝~

2016년 5월 19일 목요일

[Python] Python을 이용한 OpenCV에서 TCP socket을 통해서 Image 전송하기.

Python을 이용한 OpenCV에서 TCP socket을 통해서 Image 전송하기.

TCP통신만 보면 일반적인 Python의 TCP통신 기법을 이용한다.
python의 tcp socket에서는 문자열을 보내고 받을 수 있는데, 이를 따르기 위해서 OpenCV에서는 Image를 문자열(string)으로 변환할 수 있다.
즉, 이미지 송신단에서는 OpenCV를 이용해서 캡처한 Image를 문자열로 변환한 뒤 TCP Socket으로 전송(send)한다.
이미지 수신단에서는 TCP Socket으로 수신한 문자열을 OpenCV를 이용해서 Image로 변환한다.

(출처 : http://stackoverflow.com/questions/20820602/image-send-via-tcp)

client.py (송신단)

#!/usr/bin/python
import socket
import cv2
import numpy

#연결할 서버(수신단)의 ip주소와 port번호
TCP_IP = 'localhost'
TCP_PORT = 5001

#송신을 위한 socket 준비
sock = socket.socket()
sock.connect((TCP_IP, TCP_PORT))

#OpenCV를 이용해서 webcam으로 부터 이미지 추출
capture = cv2.VideoCapture(0)
ret, frame = capture.read()

#추출한 이미지를 String 형태로 변환(인코딩)시키는 과정
encode_param=[int(cv2.IMWRITE_JPEG_QUALITY),90]
result, imgencode = cv2.imencode('.jpg', frame, encode_param)
data = numpy.array(imgencode)
stringData = data.tostring()

#String 형태로 변환한 이미지를 socket을 통해서 전송
sock.send( str(len(stringData)).ljust(16));
sock.send( stringData );
sock.close()

#다시 이미지로 디코딩해서 화면에 출력. 그리고 종료
decimg=cv2.imdecode(data,1)
cv2.imshow('CLIENT',decimg)
cv2.waitKey(0)
cv2.destroyAllWindows() 

server.py (수신단)

#!/usr/bin/python
import socket
import cv2
import numpy

#socket 수신 버퍼를 읽어서 반환하는 함수
def recvall(sock, count):
    buf = b''
    while count:
        newbuf = sock.recv(count)
        if not newbuf: return None
        buf += newbuf
        count -= len(newbuf)
    return buf

#수신에 사용될 내 ip와 내 port번호
TCP_IP = 'localhost'
TCP_PORT = 5001

#TCP소켓 열고 수신 대기
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((TCP_IP, TCP_PORT))
s.listen(True)
conn, addr = s.accept()

#String형의 이미지를 수신받아서 이미지로 변환 하고 화면에 출력
length = recvall(conn,16) #길이 16의 데이터를 먼저 수신하는 것은 여기에 이미지의 길이를 먼저 받아서 이미지를 받을 때 편리하려고 하는 것이다.
stringData = recvall(conn, int(length))
data = numpy.fromstring(stringData, dtype='uint8')
s.close()
decimg=cv2.imdecode(data,1)
cv2.imshow('SERVER',decimg)
cv2.waitKey(0)
cv2.destroyAllWindows()