ssh-keygen
우선 ssh-keygen에 대해서 알아보자
SSH를 이용하여 서버에 접속하는 방법은 다양하게 존재합니다. 그 중 가장 단순한 방법은 비밀번호로 접속하는 것입니다. 하지만 비밀번호의 문제점은 보안이 취약하다는 점입니다. 물론 비밀번호도 보안되어서 전달되지만, brute force에 의해서 해킹을 당하는 경우가 종종있다고 합니다. 그에 반해 Key를 이용한 ssh접속은 보안적으로 믿을만하다고 증명된 바 있습니다.
key는 private key와 public key의 쌍으로 이뤄져 있고 이를 비대칭 키라고 부릅니다. private key는 client에서 안전하게 보관되어야 하는 key이고 public key는 server(EC2등)에 공유되는 key를 말하게 됩니다. 밑에서 다시 한번 설명하겠지만 ~/.ssh/authroized_keys에 public key를 저장하면 됩니다.
client가 ssh 명령으로 접속을 시도하면 server에서는 상대방이 private key를 가졌는지 테스트를 통해 확인하고 연결 여부를 결정하게 되는 것입니다.
ssh key 생성
$ssh-keygen -t rsa -b 2048 -C "user@email.com"
- t는 암호화하는 타입입니다. 특별한 경우가 아니라면 가장 자주 사용하는 rsa타입으로 설정해 주면 됩니다.
- b는 암호의 bit수를 의미하며 default값은 2048입니다.
- f는 저장할 파일 위치와 이름입니다.
- C는 주석 부분으로 역할이 특별히 없습니다.
위 명령을 치게 되면 /home/username/.ssh/id_rsa위치에 id_rsa(private key), id_rsa.pub(public key)가 생성이 됩니다. 하지만, 만약 이미 이전에 생성한 적이 있다면 Override되면서 이전에 이미 연결해놓은 서버와의 연결은 끊어지게 됩니다. ( 비밀키가 덮어씌워 지므로 )
그리고 passphrase를 적으라고 할 수도 있는데, 이는 RSA방식의 단점인 누군가 악의적으로 내 컴퓨터를 컴트롤 할 수 이쎅 된다면, 내 컴퓨터 안에 있는 SSH Key를 가진 모든 시스템에 접근 권한이 생기기 때문에 SSH Key에 추가적으로 비밀번호를 추가하는 보안 레이어를 설정하는 것입니다.
- 기존의 서버 A와 연결하기 위해서 서버 A에 id_rsa.pub키 값을 ~/.ssh/authroized_keys에 저장했던 적이 있습니다.
- 그 당시의 public_key와 한 쌍이던 private key가 덮어쓰기로 인해 나중에 서버 A와 접속을 시도할 떄, 즉 서버가 나에게 private key가 있는지 확인하는 테스트를 진행할 때에 값이 불일치 하여 실패하게 됩니다.
Git서버에서 로그인 없이 Github사용하기
간혹 배포서버 등에서 GitHub에 접속해서 commit을 한다거나 pull을 받아와야 하는 경우가 있습니다. 하지만 배포서버 같은 공용 서버는 말 그대로 공용이기 때문에 특정 사용자로 로그인을 하기 난감한 경우가 있습니다.
이런 경우 respository에 서버 자체에 인증해 두고, ssh를 통해 로그인을 하지 않고 접근할 수 있는 방법이 있습니다.
공용 서버에서 ssh-keygen명령어를 통해 GitHub에 등록할 RSA키를 생성합니다.
여기에서 Title은 구분할 수 있는 이름을 주면 되고, Key에는 위에서 생성한 RSA키의 public key를 적어주면 됩니다. 그리고 잘 연결 되었는지 확인하려면 아래 명령어를 쳐서 확인하면 됩니다.
그리고 배포하기 위해 python virutal env가 무엇인지 조금 살펴보겠습니다.
python virtualenv
python의 virtualenv는 어플리케이션별로 독립된 가상 환경을 사용할 수 있게 해줍니다.
하나의 PC혹은 서버 환경에서 어떤 어플리케이션은 버전 1의 라이브러리를 필요로 하고, 다른 어플리케이션은 버전 2의 라이브러리를 필요로 한다면, 어떻게 이 두 라이브러리를 관리할 수 있을까요? Host파이썬에 각각 다른 두 패키지를 설치하려고 한다면 당연히 conflict가 발생할 것입니다.
간단히 그림으로 표현하면 위와 같습니다. 이제 git에 만든 django project를 배포하고 이를 백그라운드에서 실행시켜 보겠습니다.
시작
먼저 django virtual env에 설치한 의존성을 나중에 배포 환경에서도 다운받기 위해서 requirements.txt에 모든 의존성을 적어주겠습니다.
$conda activate django
$pip list --format=freeze > ./requirements.txt
를 하게 되면 아래와 같은 django project의 의존성 파일이 나오게 됩니다.
/fastcampus/requirements.txt
asgiref==3.4.1
certifi==2022.6.15
Django==3.2.5
djangorestframework==3.13.1
mysqlclient==2.0.3
pip==21.2.4
pytz==2022.1
setuptools==61.2.0
sqlparse==0.4.1
typing_extensions==4.1.1
wheel==0.37.1
이제 이를 위한 EC2인스턴스를 만들어 주겠습니다.
또한 이에 대한 인바운드 규칙을 8000번 포트에 대해 IPv4모든 곳에서 열어주도록 하겠습니다. 나중에 runserver하기 위해서 입니다.
그리고 이를 git에 배포 하고 deploy-key, public-key를 서버에서 key-gen을 통해 id_rsa.pub을 다 옮겨 주도록 하겠습니다.
그 후 ssh로 git clone을 해주어 만들어진 ubuntu서버에 clone하겠습니다.
그리고 이전에 만들어준 의존성파일인 requirements.txt을 아래 명령어로 설치해 주겠습니다. 이전에는 당연히 sudo apt-get update, sudo apt-get install python3, sudo apt-get install python3-pip, sudo apt-get install mysqlclient등.. django프로젝트에 의존하는 많은 의존성을 설치해 주어야 합니다.
또한 virtual env를 하나 따로 파서 python3위에서 돌리도록 하겠습니다. 이를 위해서 아래 명령어를 쳐주도록 하겠습니다.
$python -m pip install --user -U virtualenv
$cd [환경을 만들고자 하는 경로]
$vrtualenv django-env
$source env/bin/activate
를 해주어 가상환경을 실행합니다.
그리고 이 가상환경에 기존에 개발할 때 만든 의존성을 설치해 주기 위해 아래 명령어를 쳐 줍니다.
$pip install -r requirements.txt
이를 통해 아마 django, djangorestframework등을 설치 할 것입니다. 또한 하다가 또 오류가 뜰 것인데 아래 의존성을 추가로 설치해 주셔야 합니다.
$sudo apt-get install libmysqlclient-dev
그럼 이제 의존성 설치는 끝난겁니다.
그리고 아래 명령어로 django project를 실행해 보도록 하겠습니다.
$python manage.py runserver 0.0.0.0:8000
그리고 이 상태에서 이 프로세스가 죽더라도 계속 실행되게 백그라운드에서 실행시켜 주도록 하겠습니다. 우선 ctrl + z를 눌르고 bg를 쳐서 실행중이 프로세스를 확인합니다.
그후로는 disown -h를 쳐줍니다.
그리고 중요한 과정이 하나 더 있는데 ec2의 도메인을 settings.py에 allowed-host에 추가해 주는 것입니다.
/fastcampus/fastcampus/settings.py
...
ALLOWED_HOSTS = ['ec2-43-200-2-33.ap-northeast-2.compute.amazonaws.com']
...
그리고 이제 위 호스트의 8000번 포트로 들어가면 아래와 같은 화면이 뜹니다.
즉 EC2환경에서 Django프로젝트가 정상적으로 배포 되었습니다.
'DevOps > AWS Architecture' 카테고리의 다른 글
[ DevOps ] - AWS 기반 소규모 & 중규모 아키텍트 설계 - ALB에 인스턴스 연결하여 웹서비스 실행하기 (0) | 2022.07.01 |
---|---|
[ DevOps ] - AWS 기반 소규모 & 중규모 아키텍트 설계 - 로드밸런서 (L4, L7)의 동작원리와 AWS ELB (0) | 2022.07.01 |
[ DevOps ] - AWS 기반 소규모 & 중규모 아키텍트 설계 - 데이터베이스 구축 (AWS RDS) (0) | 2022.06.30 |
[ DevOps ] - AWS 기반 소규모 & 중규모 아키텍트 설계 - Delivery 백엔드 개발 (0) | 2022.06.29 |
[ DevOps ] - AWS 기반 소규모 & 중규모 아키텍트 설계 - Boss 백엔드 개발 2 (0) | 2022.06.29 |