프로그래밍 일기 — AWS

배우는 자(Learner Of Life)
17 min readJul 20, 2023

--

웹프로그래밍의 밀림 아마존에서 웹사이트 배포하기

#AWS, #웹프로그래밍, #클라우드, #배포, #Elastic Beanstalk, #CLI

웹프로그래밍 세계에서는 많은 개발자들이 아마존의 밀림에서 자신의 거주지를 만든다.

아마존(Amazon)은 1994년 미국에서 설립된 E-Commerce 회사로써, 현재는 전세계 온라인 쇼핑뿐 아니라 클라우드(Cloud) 시장까지 장악한 거대 기업이다. AWS(Amazon Web Service)는 아마존에서 제공하는 클라우드 플랫폼으로써 많은 이들이 웹사이트 배포를 위해 활용하기도 한다.

이 아마존이라는 회사는 웹프로그래밍 세계에서 매우 거대한 제국으로 성장했다. 특히 AWS는 클라우드 시장을 선점함으로써 웹플랫폼으로써 거대한 영토(사용자를) 확보했다. 이제 AWS 없이는 많은 온라인 기반 비즈니스들이 일을 하기 어려울 정도가 되었다.

자연스럽게 많은 개발자들도 이 거대한 아마존 밀림 제국에서 자신들만의 거주지를 만들기 시작했다. 각자 자신들만의 웹서비스를 만들어 이곳에서 론칭을 하는 것이다. 나 역시, JavaScript, Python, MongoDB 및 Flask를 이용한 기본적인 웹 프로젝트를 이제 완수하였으니, 이제 남은 것은 웹프로그래밍세계에 나만의 공간을 만들어 보는 것이다. 내가 만든 웹사이트를 배포하여 내 프로젝트에 생명을 불어넣는 것이다.

이는 이전 GitHub에서 업로드하여 자동으로 웹 링크를 만드는 것과는 확연히 다른 것이다. 거기서는 GitHub이 기본적으로 제공하는 기능만을 활용했기 때문에 웹사이트를 어떤 주소로 어떻게 배포할지에 대한 제약이 있었다. 그러나 AWS를 활용하면 웹서비스 배포에 있어서 더 큰 자유도를 누릴 수 있다.

그렇다면 AWS를 어떻게 활용하여 웹서비스를 론칭할 수 있을까? 이번에는 이전까지 작업한 웹사이트를 배포하는 과정을 밟아보면서 웹서비스 론칭의 방법을 배우는 시간을 가져야할 것 같다는 생각이들었다.

AWS(Amazon Web Services)

위에서 설명한 것처럼 AWS는 아마존에서 제공하는 웹 클라우드 플랫폼으로써, 많은 온라인 기반 비즈니스들이 자신의 웹서비스를 론칭하기 위해 활용하는 서비스다. 우리 역시 마찬가지로 이 플랫폼을 활용해 우리의 웹사이트를 론칭할 것이다. 우선 모든 웹서비스는 회원가입을 필요로한다. 따라서 AWS홈페이지에 들어가 자신의 계정을 만드는 것이 가장 첫 순서일 것이다. 아마 비용지불계정을 요구할 수 있는데 1달러 를 결제하고 바로 반환하여 연결이 되는지만 확인하는 과정이므로 크게 걱정할 것은 없다.

AWS에 먼저 가입하여 서비스를 이용할 수 있는 기본 준비를 한다.

클라우드 서버

이전에 서버와 클라우드간의 관계에 대해 설명하면서 이렇게 하나의 서버 컴퓨터와 여러개의 클라이언트 컴퓨터로 이루어진 마치 거미줄처럼 연결되어 정보를 교화할 수 있는 상태가 된 것을 네트워크라고 정의했다. 서버와 클라이언트는 정보를 교환하는데 있어 API라는 창구를 이용해 POST/GET HTTP 요청을 한다. 즉, 서버와 클라이언트는 각각 컴퓨터로써, 하나는 요청된 정보를 전달하는 역할이며 다른 하나는 그 요청에 대한 응답을 받는 역할을 할 뿐이다. 따라서 그 어떤 컴퓨터도 서버나 클라이언트가 될 수 있다.

만약 웹 서비스를 론칭한 후에, 클라이언트로써 서버에 그 서비스에 대한 접근을 요청한다면, 그 요청에 항상 응답을 해 줄 수 있는 서버가 필요할 것이다. 서버가 클라이언트의 요청에 항상 응답하기 위해서는 아래와 같은 조건이 필수다.

  • 서버 컴퓨터가 항상 켜져있을 것
  • 프로그램이 항상 실행되어 있을 것
  • 모두가 접근할 수 있는 Public IP Address로 웹사이트에 접근이 가능해야함

일반적인 회사들은 자신의 서비스를 제공하기위해 중앙서버 컴퓨터를 24시간 켜놓는다. 만약, 우리 스스로가 웹서비스의 제공자라면 클라우드가 등장하기 전까지는 그렇게해야 했을 것이다. 그러나 AWS, Azure등 클라우드 플랫폼이 등장하고 나서는 굿이 별도의 기기를 사지 않고도 가상의 서버환경을 만들 수 있다. 즉, 우리의 서비스를 론칭하고 고객에게 제공할 수 있도록 컴퓨터를 빌리는 것에 가깝다. 이렇게 가상의 서버 컴퓨터 환경을 매월 정액제를 통해 빌리는 사람이나 비즈니스가 요즘은 매우 많고, 바로 이렇게 가상 서버 환경을 대여하는 비즈니스로 AWS와 같은 클라우드 서비스가 엄청난 돈을 벌고 있는 것이다.

배포하기(Deployment)

웹서비스를 배포하는 방법은 간단하다. 우리가 만든 프로그램 코드를 클라우드 상에 업로드하고 프로그램을 실행하여 끄지 않고 계속 놔두는 것이다. 이를 위해 가장 널리 활용되는 것 중 하나가 AWS Elastic Beanstalk 서비스이다. 이 서비스를 활용해 론칭하는 것은 그리 어렵지않다. AWS가 제공하는 서비스는 우리가 활용할 배포 서비스를 포함해 여러가지가 있지만, 그 중에서도 배포를 쉽게해주는 이 서비스가 아무래도 웹사이트를 만들어보고자하는 모든 입문 개발자들이 가장 많이 이용하는 서비스들 중 하나일 것이다.

사실 배포는 입문 개발자가 하기에는 그렇게 쉬운 작업은 아니다. 개발자가 배포를 위해 잡아주어야할 설정이 생각보다 복잡하고 많기 때문이다. 아마도 AWS는 이 분야에서 솔루션을 제공할 수 있다고 판단한 것 같다. 그래서 누구나 쉽게 자신의 웹서비스를 배포할 수 있는 서비스를 만든 것으로 보인다. 실제로 AWS에게 이 서비스가 정말 큰 수입원이 되고 있으니까 말이다.

AWS Elastic Beanstalk의 장점은 코드를 압축하여 배포를 관리할 수 있다는 점이며, 배포의 링크를 생성해주고 코드를 업데이트할 수 있는 기능까지 제공한다. 이러한 것들은 아무래도 AWS와 같은 서비스가 없다면 훨씬 복잡할 수 있는데, 이것을 단순화시켜 누구나 자신의 웹서비스를 쉽게 론칭할 수 있도록 한 것이 참 좋은 먹거리를 발견했다는 생각이든다.

배포 과정

배포는 터미널 상에서 절차적인 커맨드를 입력함으로써 이루어진다. 물론 현재 배포하고자하는 프로젝트 폴더내에서 이루어져야한다. 터미널 상에서 아래와 같은 순서로 커멘드를 입력한다. 순서로 보자면 deploy 라는 이름의 폴더를 만들고, 그곳에 app.py 서버 프로그램의 코드를 application.py 라는 파일을 만들어 그곳에 복사한다. 다음으로 index.html 파일이 포함된 templates 폴더의 파일들을 deploy 내 같은 이름의 폴더를 만들어 복사한다.

다음으로 deploy 폴더로 들어가 application.py 프로그램을 열어, 이곳에서 어플리케이션을 인스턴스화하는 코드를 추가한다. 이후 awsebcli 라는 이름의 AWS Elastic Beanstalk 라이브러리를 설치한다. 설치 후 pip freeze 를 통해 현재 가상환경에 설치된 라이브러리 정보를 deployrequirements.txt 라는 파일에 기록하여, 해당라이브러리들이 서버 컴퓨터에 설치될 수 있도록 준비한다. 마지막으로 eb init명령어를 통해 배포를 위한 repo를 설정할 수 있도록 한다. 이제 eb create {프로젝트 이름} 을 입력해 프로젝트를 배포할 수 있다. 또한 코드변경사항이 있을시 수정 및 업데이트할 수 있도록 한다. eb deploy {프로젝트 이름} 명령어는 코드에 대한 업데이트 반영 및 배포를 시작할 수 있게한다.

1. 터미널 준비
1) "deploy"라는 이름의 폴더 생성
$ mkdir deploy
2) app.py의 코드를 deploy/application.py라는 파일을 만들어 그곳에 복사
$ cp app.py deploy/application.py
3) templates 폴더의 파일들을 deploy내 templates폴더를 만들어 그곳으로 복사
$ cp -r templates deploy/templates
5) deploy 폴더로 들어가기
$ cd deploy
2. appication.py 세팅하기 (파일에 들어가서 아래 코드 입력)
> application = app = Flask(__name__)
> app.run()
3. 패키지 설치하기
1) 사전 준비 후 아래 명령어로 AWS EB CLI 설치
$ pip3 install awsebcli --upgrade
2) pip freeze 명령어로 설치된 라이브러리 정보를 가져와 deploy폴더내 requirements.txt 파일에 기록
$ pip freeze > deploy/requirements.txt

4. 보안 자격증명 (로그인 과정)
$ eb init
5. 초기 설정
$ eb create {프로젝트 이름} (프로젝트 폴더 이름에 따라 배포)
6. 코드 수정 & 업데이트 (코드 변경사항 있을시 반영)
$ eb deploy {프로젝트 이름}

주의: 배포용 폴더의 구조

주의할 사항이 하나 있는데, 배포용 폴더는 위 우리가 입력한 명령어들에 따르면 아래와 같이 구성되어야한다. venv 폴더가 들어있어서는 안된다. 그 이유는 우리가 필요한 라이브러리의 정보를 requirements.txt 에 저장했기때문에, 별도로 라이브러리가 설치된 가상환경이 있으면 이 라이브러리와 겹치거나 다른 버전의 라이브러리들이 설치될 가능성이 있기에 호환성 문제를 잡는 것이 복잡해 질 수 있다. 결국 이 파일에 pip freeze 를 통해 가져온 라이브러리 정보를 저장하는 것은 성공적으로 프로그램이 돌아가는 나의 로컬 환경과 서버환경을 맞추기 위함이다. 또한 app.py 가 아닌 application.py 라는 이름의 파일이어야한다. 우리가 위에서 이 파일내 application = app = Flask(__name__) 코드를 추가한 이유가 이것 때문이다. app.run() 으로 대신쓰고 그 안에 IP주소와 포트넘버를 날리는 이유는 이제 더 이상 고정 IP주소가 아닌 웹 서버상의 유동 IP주소로 접속하게 하기 위함이다. templates 폴더와 그 안의 index.html 파일은 기존 프로젝트 구성과 일치한다.

상위: Deplpy(배포 폴더)

> application.py (app.py 파일 아님)

> templates 폴더 (index.html 파일 포함)

> requirements.txt (패키지들의 이름이 담긴 txt 파일)

위 1번과 2번의 과정까지는 위 보여지는대로 그대로 수행할 수 있다. 이후 3번의 AWS EB CLI를 설치하기전 몇가지 사전 준비가 필요할 수 있다.

사전 준비: 가상환경에서의 필요한 라이브러리 설치(2)

먼저 가상환경에서의 라이브러리 설치가 필요하다. 우리가 배포할 폴더에서는 가상환경이 필요하지 않지만, 라이브러리간의 충돌을 피하기 위해 가상환경에서의 설치가 조금 더 안전하다.

먼저 가상환경 설치를 위해 배포용 폴더에서 나와 프로젝트 폴더로 간다. 여기서 pip3 install — user virtualenv 명령어를 통해 가상환경을 설치한다. 이후 virtualenv venv 를 입력하여 가상한경 폴더를 만든다. 다음으로 source venv/bin/activate 를 통해 가상환경을 활성화한다. 이 상태에서 pip3 install awsebcli --upgrade 명령어를 통해 AWS EB CLI를 설치한다.

사전 준비: PATH 설정하기(4)

배포를 하는데 있어 필요한 파일이나 라이브러리를 잘 찾지 못하면 문제가 생길 수 있다. 이에 정확하게 필요한 라이브러리가 존재하는 경로가 잘 지정되어야하고, 그러자면 환경설정의 기본 경로인 PATH 가 잘 설정되어있어야한다. 또한 터미널상의 커맨드가 잘 입력될 수 있도록 profile script의 경로 역시 찾아야한다.

먼저echo $SHELL 명령어를 입력하여 본인의 Shell이 어떤 것인지 파악한다. 나의 경우 Zsh — .zshrc 이다. 이때 이 것의 경로가 어디에 있는지에 대한 정보도 나오는데, 이것이 LOCAL_PATH이다. 나의 경우 /usr/bin 으로 나왔다. export 명령을 통해 이 LOCAL_PATH를 PATH 로 설정한다. 명령어는 나의 경우 아래와 같다.

  • export PATH=/usr/bin:$PATH

다음으로 profile script를 불러와야한다. source 명령어를 통해 profile script를 불러온다.

  • source ~/usr/bin/.zshrc

위 설정이 모두 끝났다면 다시 배포 폴더로 돌아간다. 여기에 가상환경 상에서 설치한 라이브러리 정보를 가져오는 작업을 이후에 진행할 것이기 때문이다.

초기화(eb init) (5)

앞서 설명한 사전 준비가 끝났다면, 3번까지의 과정은 끝난것이다. 위 4번 로그인 과정에서 아마도 AWS Access ID와 Secret Key를 요구할 것이다. 아래 AWS 화면에서 자신의 계정 이름아래 Security Credentials 메뉴를 클릭하여 조금 더 아래로 내려간다. 여기서 Secret Key 메뉴를 볼 수 있는데, 여기서 Create access key 버튼을 눌러 access key를 생성한다.

Create secret key 버튼으로 secret key를 생성한다.

생성된 ID와 Secret Key를 활용하여 로그인을 하면된다. Secret key는 한번 만 보여지기 때문에 반드시 어디에다 적어놓아 활용할 수 있도록 한다.

Access key ID와 Secret Key를 생성하면 다시 찾을 수 있는 곳에 적어둔다.

다음으로 pip freeze > deploy/requirements.txt 를 입력하여 배포 폴더에 필요한 라이브러리의 목록이 기록되도록 한다. 배포시 여기에 있는 라이브러리를 자동으로 설치할 것이기 때문이다. 우리가 설치한 AWS EB CLI와 이에 관련된 라이브러리를 모두 포함한다.

다음으로 eb init -p python3.8 {프로젝트 어플리케이션 이름} --region ap-northeast-2 를 입력하여 배포에 사용할 EB CLI의 프로젝트 Repo를 초기화한다. 로컬상에서 이 repo를 설정하여 최신 버전의 Python 3.8 플랫폼기반 배포환경을 구축할 것이다.

다시한번 추가적인 설정을 위해 eb init을 입력한다. 터미널에서 eb init 실행시 몇가지 설정들을 요구할 수 있는데, Python은 3.8 버전을 쓴만큼, 해당 버전에 맞는 Linux Platform을 설정하는 것이 좋다. keypair는 무엇을 설정하든 크게 상관없고, passphrase는 아무것도 입력하지 않아도 상관없다. 이후에 아마 SHA256 키를 생성할 것인데, 혹시라도 나중에 쓰일 수 있으니 이 역시 어디에 적어두는 것이 좋겠다. 보안 문제상 이 모든 것들을 터미널에서 보여주는 캡쳐화면은 넣지 않도록 하겠다. 또한 지역 설정은 서울로 설정하여 WARNING: Uploaded SSH public key for “aws-eb” into EC2 for region ap-northeast-2 메시지를 볼 수 있도록 한다.

마지막으로 eb create {프로젝트 환경 이름} 을 통해 프로젝트 배포를 시작한다. 위 eb init 명령어를 통해 로컬에 설정한 Repo를 그대로 가져다가 클라우드 플랫폼 상에 올리는 것이다. 이 과정에서 Python 3.8 플랫폼 기반으로 만들어진 repo의 설정을 그대로 활용하고, requirements.txt 에 명기된 어플리케이션에 필요한 모든 라이브러리를 설치한다.

eb create {프로젝트 이름}을 입력해 프로젝트를 사실상 배포 시작한다.

만약 업데이트 및 수정된 코드가 있다면 eb deploy {프로젝트 이름} 명령어를 통해서 자동으로 업데이트를 진행할 수 있다. 하지만 별도의 수정된 코드가 없다면 eb create {프로젝트 이름} 으로 충분할 것이다. 변경할 코드를 application.pyindex.html 에 반영하고 터미널에서 eb deploy {프로젝트 이름} 명령어만 입력해 주면 잠시후에 변경사항이 곧바로 반영된다.

배포 환경 접속

다음으로 배포환경에 접속한다 AWS 콘솔에서 Elastic Beanstalk을 클릭한다. 아마도 상단 검색창에서 Elastic만 검색해도 찾을 수 있을 것이다.

Elastic Beanstalk 서비스를 찾아 클릭한다.

Environment 탭으로 들어가면 배포한 서비스를 볼 수 있다. 배포한 서비스의 이름과 현재 보안 상태(Health) Applicaiton의 이름이 나온다. 아래 Domain 부분 아래에 보이는 파란색 링크 주소가 우리의 배포 주소로 볼 수 있다. 도메인 주소 링크를 클릭하면 배포된 웹사이트를 확인할 수 있다. 혹은 터미널 상에서 eb open 명령어를 입력해도 바로 열어볼 수 있다.

성공적으로 배포되었다면 MongoDB에 있는 데이터가 그대로 나타날 것이며, POST요청으로 데이터를 입력하면 바로 MongoDB 데이터 베이스에 입력될 것이다. 또한 GET요청을 통해 바로 새롭게 입력된 데이터가 웹페이지상에 보여질 것이다.

배포된 환경을 확인할 수 있다. 여기서 도메인 주소를 클릭하면 배포한 웹사이트에 접속가능하다.
배포한 사이트를 확인할 수 있다. MongoDB 데이터베이스에 있는 데이터가 그대로 보인다.
POST 요청해 입력한 데이터 역시 MongoDB에 성공적으로 나타난다.

주의: 지역 설정

자신이 초기에 설정한 지역에 해당하는 메뉴를 선택해야 배포한 웹서비스를 볼 수 있다. 예를 들어 우리가 설정한 지역은 ap-northeast-2 인 만큼 이 지역을 선택해 주어야 우리가 배포한 어플리케이션을 볼 수 있다.

설정한 지역을 반드시 선택해야 배포한 어플리케이션을 볼 수 있다.

주의: AWS의 과금 구조

AWS는 eb create {프로젝트 이름} 을 통해 배포한 새로운 서비스에 대한 과금을 한다. 따라서 원하지 않는다면 정말 배포를 하고 싶은 사이트가 아닌 프로젝트는 이 명령어를 써서 배포를 하지 않는 것이 좋을 수 있다. 이 명령어 하나당 새로운 서버 컴퓨터를 대여하는 것인데, 쓰지도 않을 컴퓨터를 매달 돈을 내면서 대여할 이유는 없을 것이다.

웹서비스의 종료

따라서 만약 프로젝트를 더 이상 배포하고 싶지 않다면, 관련 Elastic Beanstalk 인스턴스를 종료하여 그 프로젝트를 서비스하는 서버를 반납해야한다. Elastic Beanstalk에 들어가 종료하고 싶은 서비스의 체크박스를 클릭하고 우측 상단 tasks 메뉴에서 terminate environment 를 통해 종료할 수 있다. 혹은 터미널에서 eb terminate {프로젝트 환경 이름} 명령어를 활용할 수 있다.

Terminate envionment 메뉴를 통해 웹서비스를 종료할 수 있다.

팁: 최종 정리 — AWS 배포시 주의사항

  1. 배포는 가상환경이 활성화(venv)된 상태에서 진행하는 것이 권장된다.
  2. 배포 시작전(eb init) 반드시 deploy 배포용 폴더에 들어간 상태에서 진행한다(cd deploy).
  3. pip3 install awsebcli -- upgrade 를 통해 AWS EB CLI만 설치하고 pip3 install awscli 는 설치하지 않아도된다.
  4. 위 두 조건을 만족했는데도 되지 않으면 위 사전준비 사항 중 PATH 설정을 했는지 확인한다.

참조:

(1) https://pixabay.com/photos/suspension-bridge-rainforest-amazon-959853/

(2) https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb-cli3-install-virtualenv.html

(3) https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb-cli3-configuration.html

(4) https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/eb-cli3-install-advanced.html

(5) https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create-deploy-python-flask.html

--

--

배우는 자(Learner Of Life)
배우는 자(Learner Of Life)

Written by 배우는 자(Learner Of Life)

배움은 죽을 때까지 끝이 없다. 어쩌면 그게 우리가 살아있다는 증거일지도 모른다. 배움을 멈추는 순간, 혹은 배움의 기회가 더 이상 존재하지 않는 순간, 우리의 삶은 어쩌면 거기서 끝나는 것은 아닐까? 나는 배운다 그러므로 나는 존재한다. 배울 수 있음에, 그래서 살아 있음에 감사한다.

No responses yet