AWS

클라우드 개념 & AWS EC2 생성 & 설정

자바니또 2021. 3. 21. 16:16

AWS 서버 환경을 만들어 보자 (AWS EC2)

개요

내가 만든 서비스를 외부에서 접근하기 위해서는 24시간 작동하는 서버가 필요하다. 24시간 작동하는 서버에는 3가지 선택지가 있다.

  • 내 PC를 24시간 구동시킨다.
  • 호스팅 서비스(Cafe 24, 코리아호스팅 등)를 이용한다.
  • 클라우드 서비스(AWS, AZURE, GCP 등)을 이용한다.

이번 포스팅에서는 클라우드란 무엇인지와 클라우드 서비스 중 AWS의 EC2 인스턴스를 만들어 Putty를 통해 접속 해보고, EC2에서 해야할 설정들에 대해 알아본다.

목차

  • 클라우드
  • 클라우드 컴퓨팅
  • 클라우드 컴퓨팅의 서비스 모델
  • AWS
  • EC2 인스턴스 시작
  • Elastic IP(EIP)로 고정 아이피 할당
  • Putty로 윈도우에서 EC2 에 접속하기
  • 아마존 리눅스 1 서버 생성 시 꼭 해야할 설정들

클라우드

클라우드인터넷을 통해 액세스할 수 있는 서버와 이러한 서버에서 작동하는 소프트웨어데이터베이스를 의미한다. 클라우드 서버는 전 세계 데이터 센터에 위치한다. 사용자와 기업은 클라우드 컴퓨팅을 사용함으로써, 직접 물리적 서버를 관리하거나 자체 서버에서 소프트웨 애플리케이션을 실행하지 않아도 된다.

클라우드 컴퓨팅

클라우드 컴퓨팅이란, 인터넷(클라우드)을 통해 서버, 스토리지, 데이터베이스, 네트워크, 소프트웨어, 모니터링 등의 컴퓨팅 서비스를 제공하는 것이다. 예를 들어 AWS의 EC2는 서버장비를 대여하는 것 뿐만 아니라, 로그 관리, 모니터링, 하드웨어 교체, 네트워크 관리 등 인프라 관리를 기본적으로 지원한다.

이번 포스팅에서는 AWS라는 클라우드 서비스를 이용하여 EC2 인스턴스를 생성하고 putty를 사용하여 외부에서 접속해 보는 것까지 해본다.

클라우드 컴퓨팅의 서비스 모델

클라우드에는 크게 다음의 형태가 있다.

< 출처 : https://www.cloudflare.com/ko-kr/learning/cloud/what-is-the-cloud/ >

  • Infrastructure as a Service(IaaS, 아이아스, 이에스)
    • IaaS는 클라우드를 통해 인프라를 제공하는 서비스
    • 기존 물리 장비를 미들웨어와 함께 묶어둔 추상화 서비스
    • 가상머신, 스토리지, 네트워크, 운영체제 등의 IT인프라를 대여해 주는 서비스
    • 비유하자면 내가 원하는 집(서비스)을 지을 토지(인프라)를 임대하는 것과 같다. 하지만 집을 짓는 도구와 설계는 내 몫이다.
    • ex) AWS의 EC2, S3 등
  • Platform as a Service(PaaS, 파스)
    • IaaS에서 한 번 더 추상화한 서비스로서, 많은 기능이 자동화 되어 있다.
    • PaaS업체는 개발 도구, 인프라, 운영체제제 뿐만 아니라 애플리케이션 구축에 필요한 모든 것을 인터넷을 통해 제공.
    • 비유하자면 내가 원하는 집(서비스)을 지을 수 있는 도구를 빌리고, 토지를 임대하는 것과 같다.
    • ex) AWS의 Beanstalk, Heroku 등
  • Software as a Service(SaaS, 사스)
    • 소프트웨어 서비스를 이야기한다.
    • 비유하자면 집을 빌리는 것과 같다. 임대인이 집을 유지하지만 임차인이 집을 소유한 것 처럼 집을 주로 사용한다.
    • ex) 구글 드라이브, 드랍박스, 와탭 등

AWS

AWS를 선택한 이유는 다음과 같다.

  • 첫 가입 시 1년간 대부분 서비스가 무료이다.
  • 클라우드에서는 기본적으로 지원하는 기능(모니터링, 로그관리, 백업, 복구, 클러스터링 등등)이 많아 개인이나 소규모일 때 개발에 좀 더 집중할 수 있다.
  • 사용자가 많아 레퍼런스가 많다.

EC2 인스턴스 시작

EC2 (Elastic Compute Cloud)AWS에서 제공하는 성능, 용량 등을 유동적으로 사용할 수 있는 서버이다.

이제 EC2를 생성하기 위해 다음의 단계를 천천히 따라가 보자.

1. Amaznon Linux AMI선택

인스턴스 생성하기를 눌러 위의 AMI를 선택한다. 아마존 리눅스 2 대신에 리눅스 1을 선택한 이유는 아직 국내 자료가 리눅스 1이 더 많기 때문이다. 센토스 AMI 대신 아마존 리눅스 AMI를 사용한 이유는 다음과 같다.

  • 아마존이 개발하고 있어서 지원받기가 쉽다.
  • AWS의 각족 서비스와의 상성이 좋다.
  • Amazon 독자적인 개발 레포지터리를 사용하고 있어 yum이 매우 빠르다.

2. 인스턴스 유형 선택

AWS에서 무료로 제공하는 프리티어 플랜에서는 t2.micro 사양만 가능하기 때문에 이것을 사용한다. t2는 요금 타입을 이야기하며, micro는 사양을 이야기한다. t2 외에 t3도 있으며 이들을 T 시리즈 혹은 범용 시리즈라고 한다.

이들은 다른 서비스와 달리 크레딧이란 일종의 CPU를 사용할 수 있는 포인트 개념이 존재한다. 인스턴스 크기에 따라 정해진 비율로 CPU크레딧을 계속 받게 되며, 사용하지 않을 때는 크레딧을 축적하고, 사용할 때는 이 크레딧을 사용한다. 정해진 사양보다 더 높은 트래픽이 발생하면 크레딧을 좀더 적극적으로 사용하면서 트래픽을 처리한다. 크레딧이 모두 사용되면 더이상 EC2를 사용할 수 없다.

3. 세부정보 구성

기업에서 사용할 경우 화면상에 표기된 VPC, 서브넷 등을 세세하게 다루지만, 여기서는 혼자서 1대의 서버만 사용하니 그냥 넘어가도록 한다.

4. 스토리지 추가

스토리지란 흔히 하드디스크라고 부르는 서버의 디스크(SSD 포함)를 이야기하며, 서버의 용량을 얼마나 정할지 선택하는 단계이다. 프리티어 고객은 최대 30GB의 EBS범용(SSD) 또는 마그네틱 스토리지를 사용할 수 있다. 여기서는 30GB의 EBS 범용 SSD를 선택한다.

5. 태그 추가

태그에는 웹 콘솔에서 표기될 태그인 Name태그를 등록한다. 태그는 해당 인스턴스를 표현하는 여러 이름으로 사용될 수 있는데, EC2의 이름을 짓는다고 생각하면 된다.

6. 보안 그룹 구성

보안 그룹은 방화벽을 이야기한다. '서버로 80 포트 외에는 허용하지 않는다'는 역할을 하는 방화벽이 AWS에서는 보안 그룹으로 사용된다. 기존에 생성된 보안 그룹이 없으므로 보안 그룹 이름엔 유의미한 이름으로 변경한다.

여기서 프로토콜 유형이 SSH(Secure Shell Protocl)이면서 포트가 22인 항목은 AWS EC2에 터미널로 접속 할 때를 이야기 한다. pem 키로 보안이 된다고 접근을 전체 오픈(0.0.0.0/0, ::/0)하면 pem 키가 노출되는 순간 심각한 문제를 가져올 수 있다. 따라서 우선 내 컴퓨터의 IP로만 접근이 가능하도록 설정한다.

현재 프로젝트의 기본 포트인 8080을 추가하도록 한다. 이때는 내가 만든 프로젝트에 접근하는 것이니 전체 오픈되어도 상관 없다.

다 마쳤다면 '검토 및 시작' 버튼을 누른다. 경고가 나오는데 그대로 '시작하기' 버튼을 다시 한 번 누른다.

7. 키 페어 생성

인스턴스를 생성하기 전에 인스턴스로 접근하기 위해 필요한 pem키(비밀키)를 발급 받는데, EC2는 pem 키와 매칭되는 공개키를 가지고 있어, 해당 pem키 외에는 접근을 허용하지 않는다. 때문에 절대 유출되면 안된다.

새 키 페어 생성을 통해 키 페어 이름을 짓고 다운로드 버튼을 클릭하여 디렉터리에 저장하고 '시작하기'버튼을 클릭하면 성공 적으로 인스턴스가 생성되는 것을 볼 수 있다.

Elastic IP(EIP)로 고정 아이피 할당

인스턴스도 하나의 서버이기 때문에 IP가 존재하는데, 문제가 있다. 요금을 아끼기 위해 잠깐 인스턴스를 중지하고 다시 시작하면 IP가 변경된다는 것이다. 이것을 EIP(탄력적 IP)를 통해 고정 IP로 바꿀 수 있다.

한 가지 주의해야 하는 것은 EIP를 발급 받으면 반드시 바로 EC2 주소와 연결해놔야 한다. 그렇지 않으면 과금이 발생하므로 주의 하자.

Putty로 윈도우에서 EC2 에 접속하기

EC2에 접속하는 방법은 운영체제가 Mac이냐, 윈도우냐에 따라 다른데, 필자의 경우 윈도우10이기 때문에 윈도우로 접속하는 방법을 소개한다.

윈도우에서는 Mac과 같이 ssh 접속하기엔 불편한 점이 많기 때문에 별도의 클라이언트(Putty, PuttyGen)가 필요하다.

puttygen으로 pem 키를 ppk 파일로 변환하기

putty는 pem 키를 사용할 수 없기 때문에 pem 키를 ppk 파일로 변환해서 사용해야 한다. puttygen은 이 과정을 진행해 주는 클라이언트이다.

상단에 Conversions -> Import Key를 선택해서 내려받은 pem 키를 선택한다. 그다음 다음과 같이 설정한 후 'Save private key'버튼을 클릭하여 ppk 파일을 생성한다. 경고 메시지가 뜨는데 '예'를 클릭하고 넘어가면 된다.

putty로 접속하기

접속 정보 설정

putty.exe를 실행하여 표시한 부분을 변경하도록 한다.

  • Host Name : 우리가 생성한 Amazon Linux는 ec2-user가 username이라서 ec2-user@탄력적 IP주소를 등록하면 된다.
  • Saved Sessions : 접속 정보를 저장할 이름이다. 원하는 대로 지으면 된다.

ppk파일 등록

저장 하기 전에 ppk파일을 등록을 해야한다. Connection -> SSH -> Auth로 이동하여 Browse버튼을 통해 PPK파일을 선택한다. 선택했다면 Session탭으로 다시 돌아와 Save버튼을 클릭하여 접속 정보를 저장한다.

Open버튼을 누르면 접속을 시도하는데 SSH접속 알림이 뜰 것이다. '예'를 누르면 다음과 같이 SSH 접속이 성공한 것을 확인 할 수 있다.

ec2 서버 접속 성공 시

아마존 리눅스 1 서버 생성 시 꼭 해야할 설정들

아마존 리눅스 1 서버를 처음 받았다면 몇 가지 설정들이 필요하다. 이 설정들은 모두 **자바 기반의 웹 애플리케이션 (톰캣과 스프링부트)가 작동해야 하는 서버들에선 필수로 해야하는 설정들이다.

  • Java 8설치 : 현재 프로젝트의 버전은 Java 8이다.
  • 타임존 변경 : 기본 서버의 시간은 미국 시간대이므로 변경해줘야 한다.
  • Hostname 변경 : 현재 접속한 서버의 별명을 등록한다. IP만으로 어떤 서버가 어떤 역할을 하는지 알 수 없으므로 호스트 네임을 필수로 등록한다.

Java 8설치

아마존 리눅스 1의 경우 기본 자바 버전이 7이다. 다음의 명령어를 통해 java8을 설치한다.

sudo yum install -y java-1.8.0-openjdk-devel.x86_64

설치가 완료되었다면 인스턴스의 Java 버전을 8로 변경한다.

sudo /usr/sbin/alternatives --config java

코드를 입력하고 설치한 java8의 selection number를 입력하면 된다. java -version을 통해 현재 java 버전을 알 수 있다. 변경이 되었다면 다음의 명령어로 이제 필요없는 java7을 삭제한다.

sudo yum remove java-1.7.0-openjdk

타임존 변경

sudo rm /etc/localtime
sudo ln -s /usr/share/zoneinfo/Asia/Seoul /etc/localtime

위의 명령어를 입력한 후 date명령어로 확인하면 타임존이 KST로 변경된 것을 확인할 수 있다.

Hostname 변경

sudo vim /etc/sysconfig/network

위의 명령어로 편집 파일을 열어본다. HOSTNAME을 원하는 이름으로 변경 후 저장하고 sudo reboot명령어로 서버를 재부팅한다. 재부팅이 끝나고 나서 다시 접속해 보면 HOSTNAME이 잘 변경된 것을 확인 할 수 있을 것이다.

한 가지 작업을 더 해야한다. 호스트 주소를 찾을 때 가장 먼저 검색해보는 /etc/hosts에 변경한 hostname을 등록해야한다.

sudo vim /etc/hosts

위의 명령어로 편집 파일을 열고 맨 마지막줄에서 한 줄 띄고 127.0.0.1 등록한 호스트 이름을 등록한다.

정상적으로 등록되었는지 확인하는 방법은 다음 명령어를 수행한다.

curl 등록한 호스트 이름

잘 등록하였다면 다음과 같이 80포트로 접근이 안 된다는 에러가 발생한다. 이는 아직 80포트로 실행된 서비스가 없음을 의미하므로 curl 호스트 이름의 명령어는 잘 실행 되었음을 의미한다.

hostname 정상 등록시 

참고