ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Web] 배포 - #3. IaaS 사용법(AWS EC2)
    Environment(개발환경)/Web 2021. 3. 27. 02:32
    반응형

    마찬가지로, 이번엔 3차 프로젝트(나이키) 배포에 사용한 인프라, 바로 AWS EC2 사용법에 대하여 정리해보았다.


    💻 AWS(Amazon Web Service)

    AWS는 아마존닷컴의 클라우드 컴퓨팅 서비스이다. 다른 웹사이트나 클라이언트 응용 프로그램에 대한 온라인 서비스를 제공한다.

    네트워크를 기반으로 가상 컴퓨터뿐만 아니라 스토리지, 네트워크 인프라 등 다양한 서비스를 제공한다.

     

     

    - 장점

    • 저렴한 비용: 사전 확약금이나 장기 약정 없이 저렴한 종량 과금제 방식으로 운영된다. 
    • 속도 및 민첩성 개선: 데이터 센터 유지보수 불필요함. AWS는 희망하는 언어 및 운영 체제를 선택해서 적용할 수 있다.
    • 유연성: 새로운 앱을 즉각적으로 배포하고 수요를 기준으로 축소할 수 있다. 설치가 빠르고 관리가 편함.
    • 단시간에 전세계 배포 가능

    - 주요용어

    1) 리전(Region, 지역)

     

    리전은 AWS 서비스들이 제공되는 서버의 물리적인 위치(지역)을 의미한다.

     

    이렇게 여러개의 리전을 두는 이유는 네트워크 속도를 확보하기 위함이다. (한국에서 미국서버에 접속하면 느리므로!)

    또한, 큰 재해를 대비할수도 있다. AWS는 장애에 대응하기 위한 여러 대책을 강구하는데, 단순한 에러뿐만 아니라 재해(전쟁, 지진, 화재) 역시 포함된다.

     

    우리나라도 서울 리전이 2016년 1월에 추가되었으며, 서울리전에는 2개의 가용영역(AZ)이 포함되어 있다.

     

    2) 가용영역(Availability Zone, AZ)

     

    리전 안의 데이터센터(IDC)를 의미한다. 기본적으로 AWS 각 리전 안에는 2개 이상의 가용영역을 가지고 있다.

    서울리전 역시 2개의 AZ를 포함한다고 했는데, 이는 2개의 독립적인 IDC를 운영한다는 의미이다.

    이렇듯 복수의 가용영역을 둔다면, 로드 밸런싱을 통해 트래픽을 분산시켜 한쪽 IDC에 문제가 생겨도 다른 쪽에서 무중단 서비스를 제공하게 된다.

     

    3) 엣지 로케이션(Edge Location)

     

    위 개념과는 별개로, AWS의 CDN(콘텐츠 전송 네트워크) 서비스인 CloudFrontDNS(도메인 네임 시스템) 서비스인 Route 53의 캐시서버를 의미한다.

    이러한, CDN과 DNS 서비스는 서버들의 리전과 별개로 여러개의 엣지 로케이션에서 운용된다. 우리나라에는 3개의 엣지 로케이션이 존재.

     

    - 종류

    위에서 언급했듯, AWS는 다양한 형태의 클라우드 서비스를 제공한다. 각각의 종류와 간단한 특징에 대해 소개해보도록 하겠다.

    1) Computing

    • EC2(Elastic Compute Cloud): 클라우드 서버 인스턴스, AWS의 대표적인 서비스 중 하나이다. 내가 배포에 사용한 서비스!
    • ECS(EC2 Containser Service): 클라우드 서버인 EC2를 Docker 컨테이너로 관리 가능하도록 나온 서비스.
    • EB(Elastic Beanstalk): 웹 어플리케이션용 클라우드 플랫폼 서비스. 배포, 모니터링, 확장, 관리 등 간단한 서비스 용도로 사용.
    • AWS Lambda: AWS 클라우드 Function 서비스 없이 작성한 프로그래밍 코드를 실행하는 환경을 제공
    • ELB(Elastic Load Balancing): L4 서비스(Load Balancing) 트래픽을 분산해주는 역할. 고가용성 서비스 구축을 지원.
    • Auto Scaling: 트래픽에 따라 EC2 인스턴스들을 확장해주는 서비스. 위 ELB와 함께 활용된다.

    2) Storage

    • S3(Simple Storage Service): HTTP 프로토콜과 연동되는 스토리지, 정적 사이트를 호스팅하는데 사용할 수 있다.
    • Glacier: 데이터 보관 및 백업용도를 위한 저렴한 스토리지. S3와 다르게 저장에만 특화되어있는 저가의 스토리지 서비스
    • EBS(Elastic Block Store): EC2 인스턴스에 가상하드를 달아주는 서비스. EC2 인스턴스 데이터 영구보관 가능

    3) Network

    • CloudFront: AWS의 CDN 서비스. 엣지 로케이션 기준 가장 가까운 곳에서 파일 캐시를 가져오기 때문에 빠르고 저렴
    • Route 53: AWS의 DNS 서비스. EC2, ELB 등과 결합이 가능하다.
    • VPC(Virtual Private Cloud): 클라우드 가상 네트워크 구축 서비스. VPN(내부망)을 구축하거나 서브넷을 나눠 네트워크를 관리

    4) Database

    • DynamoDB: AWS의 NoSQL 데이터베이스 서비스
    • RDS(Relational Database Service): RDBMS 클라우드 서비스. Amazon Aurora, MySQL, MariaDB, Oracle 등을 지원
    • ElasticCache: 데이터베이스 캐싱 서비스.

    5) Management Tools

    • CloudWatch: AWS 서비스들을 모니터링하거나 알람을 받는 설정을 하는 서비스. 금액초과 알람, EC2 CPU 사용량 알람 등이 있음.
    • CloudFormation: AWS 서비스 생성 및 배포 자동화 템플릿 서비스. AWS 서비스들을 이용할 아키텍쳐 구현시 JSON 템플릿 제공.

    이외에도, 개발자 도구, 보안, 분석, 위성 등 다양한 기능을 제공한다.


    💻 AWS EC2(Elastic Compute Cloud)

    EC2는 AWS의 대표적인 서비스로, 크기를 조정할 수 있는 컴퓨팅 용량을 제공하는 웹 서비스이다. (30기가까지 무료)

    다양한 형태의 타입과 서비스에 따른 사양 설정이 가능하며, 서비스를 사용하는 만큼 비용을 지불하는 합리적인 서비스이다.

     

    - EC2 주요기능

    • 인스턴스: 가상 컴퓨팅 환경
    • Amazon 머신 이미지(AMI): 서버에 필요한 운영체제와 여러 소프트웨어들이 적절히 구성된 상태로 제공되는 템플릿
    • 인스턴스 유형: 인스턴스를 위한 CPU, 메모리, 스토리지, 네트워킹 용량의 여러 가지 구성 제공
    • 키 페어를 사용하여 인스턴스 로그인 정보 보호(AWS는 퍼블릭 키를 저장하고 사용자는 개인 키를 안전한 장소에 보관하는 방식)
    • 인스턴스 스토어 볼륨: 임시 데이터를 저장하는 스토리지 볼륨으로 인스턴스 중단, 최대 절전 모드로 전환 또는 종료 시 삭제됨
    • Amazon Elastic Block Store(Amazon EBS), 즉 Amazon EBS 볼륨을 사용해 영구 스토리지 볼륨에 데이터 저장
    • 인스턴스와 Amazon EBS 볼륨 등의 리소스를 다른 물리적 장소에서 액세스할 수 있는 리전  가용 영역
    • 보안 그룹을 사용해 인스턴스에 연결할 수 있는 프로토콜, 포트, 소스 IP 범위를 지정하는 방화벽 기능
    • 탄력적 IP 주소(EIP): 동적 클라우드 컴퓨팅을 위한 고정 IPv4 주소
    • 태그: 사용자가 생성하여 Amazon EC2 리소스에 할당할 수 있는 메타데이터
    • AWS 클라우드에서는 논리적으로 격리되어 있지만, 필요시 고객 네트워크와 연결할 수 있는 가상 네트워크 Virtual Private Clouds(VPC)

    - EC2 선정 이유

    EC2를 사용한 이유는 위 웹 서비스 최적화와 비용의 이유가 메인이다. 또, 웹사이트 배포에 널리 사용된다는 오픈소스의 이점도 고려했다.

    이외에 널리 쓰이는 서비스에서, S3는 프론트앤드에 최적화된 이유, RDS는 DB 서비스인 이유로 EC2를 최종적으로 선택하게 되었다.


    💻 EC2 사용방법

     

    1. EC2 인스턴스 시작

    AWS 사이트에 가입 및 접속해서 EC2 인스턴스를 새로 생성해줘야 한다.

     회원가입 및 로그인을 진행하고, EC2 서비스로 들어오면 위와 같은 대시보드가 보인다. 좌측 메뉴에서 인스턴스를 클릭한다!

     

    위 인스턴스들이 내가 3차 프로젝트(React, Express)를 각각 배포한 인스턴스이다.

    인스턴스 시작 버튼을 클릭하여 새로운 인스턴스를 커스터마이징 한다.

     

    AMI(Amazon Machine Image)를 선택한다. 우리가 터미널에서 서버운용에 사용할 OS를 선택한다고 생각하면 된다.

    아마존이나 MacOS 등을 사용해도 무방하지만, 소개가 가장 많고 프리티어를 지원하는 우분투로 나는 배포를 진행했다.

     

    프리티어를 지원하는 인스턴스 유형을 추천한다. 해당 인스턴스가 선택된 상태로, 우측 하단의 인스턴스 세부 정보 구성 버튼을 누른다.

     

    세부 정보 구성 메뉴인데, 간단한 배포에선 설정할 필요가 없으므로 패스한다!

     

    스토리지 용량을 추가한다. 1개 스토리지의 30GB까지는 무료이므로 30으로 설정했다.

     

    다음은 태그 추가인데, 여기 역시 아무 값이나 입력하고 다음 메뉴로 패스한다!

     

    인스턴스에 연결된 보안 그룹 인바운드/아웃바운드 규칙을 설정하는 메뉴이다.

    규칙추가를 통해 HTTP, HTTPS를 추가해준다. HTTP 접근을 HTTPS로 redirect 하기 위해 두 규칙이 모두 필요하다고 한다.

    또한, 본인이 사용하는 포트도 함께 열어준다. 나는 Express를 5000번 포트로 사용하므로 사용자 지정 TCP 규칙을 추가했다.

     

    검토 및 시작을 진행하면, 인스턴스 런칭이 시작된다. 우측 하단의 시작하기 버튼을 누르면 위처럼 키 페어 생성 모달메뉴가 표현된다.

    첫 배포라면 새로운 키를 위처럼 만든 다음, 키 페어를 다운로드한 다음 인스턴스를 시작한다.

    해당 키 페어가 다운로드된 폴더에서 터미널 작업이 진행되므로 별도의 폴더를 만들 것을 권장한다. 

     

    이러한 화면이 나오면 정상적으로 인스턴스가 생성된 것이다. 우측 하단의 인스턴스 보기 버튼을 클릭한다.

     

    인스턴스 관련 정보들을 볼 수 있다. 우측 상단의 연결 버튼을 클릭하면 해당 인스턴스에 디렉토리를 연결하는 방법이 잘 나와있다.

     

     

    2. EC2 인스턴스 터미널에서 접속하기

    pem2, nginx 등과 같은 프로그램을 통해 간단하게 터미널 작업을 진행하는 방법들도 있었다.

    하지만 추가적인 러닝커브가 소요되므로, 기본적인 터미널과 우분투 커맨드를 통해 배포하는 방법으로 설명하고자 한다.

     

    위 인스턴스 메뉴에서 연결버튼을 누르면, 인스턴스에 접속하는 방법이 잘 설명되어있다.

    우선 터미널을 실행하고 해당 키가 있는 디렉토리에 접근한다.

     

    이처럼 키를 다운받은 디렉토리로 우선 이동한다.

     

    4번의 연결 커맨드를 바로 실행하면 위와 같은 에러 메세지가 발생한다. (WARNING: UNPROTECTED PRIVATE KEY FILE!)

    이를 위해, 3번의 키 비공개화 커맨드를 우선 실행시켜줘야 하는 것이다.

     

    비공개화 이후 다시 연결 커맨드를 실행하면 정상적으로 우분투에 접속한 형태이다. 이 환경에서 작업을 계속하게 될 것이다!

     

    3. EC2에 구동할 서버 코드 올리기

    이제 우리의 프로젝트를 올리기만 하면 된다! 새로운 서비스를 만들어도 되지만, 나는 기존의 git repository에서 클론하였다.

     

    sudo apt-get update

    먼저 우분투 서버 업데이트를 진행한다. (sudo는 관리자 권한 커맨드 문법이라고 생각하면 된다. 일부 커맨드는 관리자 권한이 필요하기에)

     

    sudo apt-get install nodejs
    sudo apt-get install npm

    Node.js 와 NPM도 각각 설치해준다. 터미널 화면이 너무 길어서 별도로 첨부하진 않았다.

     

    git clone [Repository 주소]
    npm install

    git clone 커맨드로 우리가 Github에서 불러올 Repository의 프로젝트를 클론한다. npm install로 모듈들을 설치한다.

     

    npm start

    이제 어플리케이션을 실행해주기만 하면 된다! 아래와 같은 화면이 표현되면 정상적으로 실행되는 것이다.

    출처: https://blog-han.tistory.com/58

     

    인스턴스로 돌아와서, DNS와 주소 도메인이 바로 클라이언트의 사이트 주소, 서버의 API 주소가 되는 URL 값이다.

     

    4. 백그라운드 실행하기

    웹 서비스를 위해 내 컴퓨터의 터미널을 24시간 켜놓을 순 없기 때문에 백그라운드로 실행시키는 커맨드를 입력한다.

     

    sudo nohup npm start &

     

    ps -ef

    이제 터미널을 종료해도 웹 서비스가 정상적으로 접속 가능하다. 위 커멘드로 상황 확인도 가능하다.


    🤒 결론

    정말 긴 여정이었다. 확실히 AWS 배포의 경험이 큰 의미를 가지게 되는 것을 이번 기회에 새삼 느끼게 되었다. (왜 자격증이 있는지도.!)

    또한 막상 구현할때는 구글링, 구글링을 반복하면서 고초를 겪었더라도,

    다시 복습해보니 안내된 절차들을 준수하고 기본적인 Flow를 이해하면(nodejs, npm 설치나 clone 후 install 등) 어렵지많은 않으리라 생각되었따.

     

    마지막으로, 내가 EC2 배포관련 소스를 검색하면서 정말 다양한 방법들이 나와있었다. (다양한 OS, pem/nginx 툴 활용 등)

    나는 아주 기본적인 방법으로 배포할 수 있는 방법을 화면 이미지를 첨부하면서 쉽게 이해할 수 있도록 소개하고자 노력해보았다.

    이 글이 앞으로 AWS 배포를 도전하는 많은 분들께 적잖은 도움이 됬으면 하는 바램이다!

     

    [출처]

    - AWS 공식 DOCS : docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/concepts.html

    - AWS 서비스 포트폴리오 : cloud-img.hosting.kr/wp-content/uploads/2018/06/29180750/AWS_%ED%95%B5%EC%8B%AC_%EC%84%9C%EB%B9%84%EC%8A%A4_%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0.pdf

    - 권윤학 님의 블로그 : web-front-end.tistory.com/74

    - 개발비 님의 블로그 : blog-han.tistory.com/58

     

    [배포(클라우드 컴퓨팅) 시리즈]

    - #1. Cloud Service : abangpa1ace.tistory.com/136

     

    [Web] 배포 - #1. Cloud Service

    😆 서론 방금 막, 내 프로젝트 및 포트폴리오 사이트를 성황리에 배포하고 온 참이다! 뿌듯한 한편, 다양한 서비스를 통해 배포하다보니 각각의 방법도 아직까지 헷갈리고 있는 것 같다. 배포

    abangpa1ace.tistory.com

    - #2. PaaS 사용법(Netlify, Heroku) : abangpa1ace.tistory.com/140

     

    [Web] 배포 - #2. PaaS 사용법(Netlify, Heroku)

    바로 드루가보도록 하겠다! 이번 포스팅에선, 2차 프로젝트와 포트폴리오 배포에 사용한 Netlify(클라이언트) 와 Heroku(서버) 사용법을 간단히 설명하려고 한다. 💻 Netlify : www.netlify.com/ Netlify: Develo

    abangpa1ace.tistory.com

    반응형
Designed by Tistory.