ubuntu에서 pyenv 설치하기

pyenv 설치하기

동일한 파이썬 버전아래서 virtualenv를 통해 가상환경만 격리하는 방식을 사용해왔다. 하지만 파이썬 3.7 버전이 나온 이후로 파이썬 버전도 관리해야 할 필요성을 느껴서 pyenv를 설치하고 사용하고 있는 중이다. pyenv 설치가 어려운 편은 아니지만 설치 과정을 남겨본다.

pyenv 설치

git을 통해서 설치할 수 있다.

1
curl https://pyenv.run | bash

환경변수 설정

shell에서 pyenv 명령어를 바로 사용할 수 있게 환경변수를 세팅해주는 것이 편하다. 각자 사용하는 shell에 따라서 설정해주어야 한다.

1
2
3
4
5
# bash shell
vi ~/.bashrc

# z shell
vi ~/.zshrc
1
2
3
export PATH="~/.pyenv/bin:$PATH"
eval "$(pyenv init -)"
eval "$(pyenv virtualenv-init -)"

여기까지 문제 없이 했다면 pyenv 명령어를 사용할 수 있다. 하지만 pyenv를 통해 python을 설치하려면 몇가지 패키지 들이 필요한데 우분투를 사용한다고 가정하고 shell에서 다음의 명령어를 수행해준다.

1
2
3
sudo apt-get install -y make build-essential libssl-dev zlib1g-dev libbz2-dev \
libreadline-dev libsqlite3-dev wget curl llvm libncurses5-dev libncursesw5-dev \
xz-utils tk-dev

지금까지 우분투에 pyenv를 설치하는 과정을 알아보았다. 설치과정만큼 사용하는 법도 어렵지 않으며 같이 정리해 보기로 한다.


pyenv 사용법

설치가능한 파이썬 출력

거의 모든 버전을 지원하고 있다. pure python 뿐만 아니라 miniconda / anaconda 와 같은 파이썬도 지원함을 알 수 있다.

1
pyenv install -list

파이썬 설치

install 뒤에 버전을 입력해서 원하는 버전의 파이썬을 설치할 수 있다.

1
pyenv install <python_version>

설치된 목록 확인

현재 시스템에 어떤 파이썬들이 설치되어있는지 확인할 수 있다. system으로 라벨링 되어있는 건 현재 시스템이 default로 사용하고 있는 파이썬을 의미한다.

1
pyenv versions

파이썬 버전 선택

시스템에 설치된 파이썬 중에서 하나를 선택하여 사용하려고 할때 두 가지의 방법이 있다. *하나는 global하게 전역적으로 사용하며 다른 하나는 local로서 지정된 폴더에서만 사용하는 방법이다. *

1
2
3
4
5
# system global
pyenv global <python_version>

# locally
pyenv local <python_version>

참고

http://blog.jeonghwan.net/2016/08/11/pyenv.html

Share

CreateServiceLinkedRole 에러 해결하기

eb-cli를 통해 deploy할 때 CreateServiceLinkedRole 에러 해결하기

AWS의 웹 콘솔을 벗어나 EB-CLI 환경에서 배포하던 도중에 CreateServiceLinkedRole 이라는 에러가 발생했다. 과정중에 잘못된게 있나 싶어서 테스트 프로젝트를 가지고 두 세번정도 시험삼아 해보았지만 에러는 계속해서 발생했다. 구글에서 검색을 통해 해결책을 찾던 중 IAM에서 인라인으로 정책을 부여하는 방법을 찾았고 에러를 해결할 수 있었다.

어떠한 이유로 위와 같은 에러가 발생했는지는 알 수 없었지만 문제 해결 과정을 정리해본다.

1
2
3
4
5
6
7
8
9
10
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "iam:CreateServiceLinkedRole",
"Resource": "arn:aws:iam::*:role/aws-service-role/*"
}
]
}

IAM에서 Role에 관한 정책을 설정해주는 것 같은데 아직까지 IAM을 그룹 / 유저 생성 및 기존의 정책 부여하는 식으로만 사용해봐서 자세히 이해할 수는 없었다(나중에 꼭 Role에 관한 부분을 보고 다시 정리해보자)


참고

https://www.paulleasure.com/how-to/aws-elastic-beanstalk-resolved-not-authorized-to-perform-iamcreateservicelinkedrole-on-resource/

Share

IP어드레싱

3계층 - 네트워크 계층

세그먼트 내에서의 송수신은 2계층에 제한된 영역이다(세그먼트라는 키워드는 1계층와 2계층에서만 사용한다고 보면 된다). 만약 세그먼트 범위를 벗어난 네트워크와 통신하려면 어떻게 해야할까? 일단 세그먼트와 네트워크를 명확히 구분 지어야 할 것 같다.

세그먼트 : 라우터없이 스위치나 허브(분배기)로 연결되는 범위(1계층과 2계층에서 사용하는 단어)

네트워크 : 라우터와 라우터로 분배된 컴퓨터 그룹

같은 네트워크 내의 컴퓨터끼리는 2계층에 의해 연결되어 있다. 즉, 같은 네트워크 안에 있다면 2계층 만으로도 통신을 할 수 있다고 생각하면 될 것 같다. 하지만 느껴지는 것처럼, 2계층의 네트워크만으로는 큰 네트워크를 형성 할 수 없다. 할 수는 있겠지만 허브와 스위치 만으로 거대한 네트워크를 만드는 것은 힘든 일이며, 브로드캐스트와 관련된 문제도 발생할 확률이 높아진다.

허브와 스위치를 생각해보자. 허브의 플러딩 문제를 방지하기 위해서 스위치를 사용한다고 했다. 스위치는 MAC 주소 필터링과 버퍼링을 통해서 문제를 해결하려고 하지만 100% 대응할 수 있는 것은 아니다. MAC 주소 필터링의 학습 과정에서 학습되지 않았거나 멀티캐스트 / 브로드캐스트를 플러딩하기 때문이다.

위와 같은 이유로 2계층까지의 기능만으로는 큰 네트워크를 구성하기 힘든 것이다. 하지만 3계층의 라우터를 사용하게 되면 해결할 수 있는데 그 이유는 라우터를 넘어가는 브로드캐스트는 송신되지 않기 때문이다. 즉 한 개의 큰 네트워크를 작게 나눔으로써 브로드캐스트의 영향력을 줄일 수 있는 것이다. 그러기 위해서는 인터넷 작업(3계층)을 꼭 필요로한다.

인터넷 작업 : 네트워크와 네트워크를 연결해서 다른 네트워크의 컴퓨터와 통신을 가능하게 만들어 준다.

인터넷 프로토콜(Internet Protocol)

앞에서 3계층의 역할은 다른 네트워크와 통신을 하기 위한 인터넷 작업을 수행하는 것이라고 했다. 인터넷 작업을 실행하기 위해서는 크게 두 가지가 있고 어드레싱(addressing)과 라우팅(routing)이라고 부른다.

어드레싱

어드레싱은 앞에서 MAC 주소를 다룰 때 한 번 했다. 어드레스를 어떻게 써서 어떻게 배당하는 지에 대한 작업이었다. 2계층에서는 MAC 주소를 사용하여 어드레싱을 했지만 3계층에서는 MAC 주소 이외의 논리적 주소를 같이 사용해야 한다. 왜냐하면 MAC 주소는 물리적 주소로써 장소를 특정할 수 없는 주소이기 때문이다. 2계층에서 한번에 연결하는 기기의 수가 크지 않기 때문에 MAC 주소만으로 통신이 가능했다면 3계층에서는 다른 네트워크와의 통신이기 때문에 “어디”라는 정보를 더 필요로 하는 것이다. 3계층에서 사용하는 논리 주소는 어디에 있는지와 같은 위치정보를 가지고 있으며 MAC 주소와 함께 사용하여 수신처를 특정지을 수 있는 것이다(어디 네트워크에 있는 어느 컴퓨터라는 정보의 조합으로 생각해보자)

라우팅

경로 선택이라고 부르곤 한다. 목적지까지 어떤 경로를 지나쳐 갈지 결정하는 것을 의미하며, 이러한 역할을 하는 기기를 라우터라고 부른다.

위의 어드레싱과 라우팅에 의해 인터넷 작업을 수행하기 위한 프로토콜로서 TCP/IP 프로토콜군에서 사용되는 것이 IP(Internet Protocol)인 것이다.

IP

TCP/IP에서는 IP를 반드시 사용한다. 기존에 사용하던 IPv4가 있고 IP의 고갈로 인해서 나온 것이 IPv6이다.(그래도 v4를 일반적으로 사용하고 있다). IP가 인터넷 작업을 위해 하는 일은 3계층 PDU - IP 데이터그램 - 을 보면 된다. 그리고 이 IP 데이터그램은 IP 헤더가 붙은 상태일 것이다.

내용 비트 설명
1 버전 4 IP 버전
2 헤더 길이 4 IP 헤더 길이
3 서비스 타입 8 패킷의 우선도 / 중요도
4 데이터 길이 16 IP 헤더와 페이로드를 합친 길이
5 ID 16 데이터그램 식별번호(ID)
6 플래그 3 데이터그램을 분할했는지 판별
7 글래그먼트 오프셋 13 분할한 경우 본래대로 되돌릴 때 사용
8 TTL 8 Time To Live - 패킷의 생존시간
9 프로토콜 8 상위 프로토콜 지정
10 헤더 체크섬 16 IP 헤더의 에러 체크용 코드
11 송신처 IP 32 송신자의 IP 주소(논리 주소)
12 수신서 IP 32 수신자의 IP 주소(논리 주소)
(13) 옵션 n 특별한 설정을 위해 사용(없어도 됨)

IP 주소의 특징

논리 주소는 계층형이다는 특징을 가지는데, IP 주소도 동일한 특징을 갖는다. NIC와 같은 인터페이스에 고정되어 있는 MAC 주소와 달리 네트워크 관리자가 할당한다. 즉, MAC 주소처럼 고정이 아니라는 점이다. IP 주소가 어디에 있는 어느 컴퓨터라는 것을 의미하는 것처럼 소속된 네트워크가 바뀐 경우에 논리 주소가 바뀌는 것이다. 논리 주소에도 유니캐스트 / 멀티캐스트 / 브로드캐스트 세 종류의 주소가 있다. 그리고 마찬가지로 유니캐스트 주소의 논리 주소중에서 네트워크를 표시하는 번호는 접속되어 있는 모든 네트워크에서 유일해야만 한다. 접속되어있는 네트워크에서 유일해야 한다는 것에 유의해야한다. 독립한 네트워크끼리라면 상관 없으며 소속된 네트워크에서 유일해야 한다는 의미이다!

네트워크의 번호 + 컴퓨터의 번호 => 를 조합해서 유일해야 한다.

그래서 다른 네트워크라면 주소가 같아도 문제가 되지 않는다!

다시 정리를 해보자 - 네트워크 번호는 접속되어 있는 모든 네트워크에서 유일해야하고, 컴퓨터 번호는 네트워크 내에서 유일해야 한다

IP 주소

진짜 IP 주소에 대해서 보자. MAC 주소는 48비트 16진수 12자리. IP 주소는 8비트마다 10진수로 표기하며 총 32비트. 그리고 이 8비트 단락은 옥텟(octet)이라고 부른다. 다시 말해 32비트 주소로 네트워크의 번호와 컴퓨터 번호를 나타내야한다.

Share