AWS
Amazon Web Services(AWS)는 전 세계적으로 분포한 데이터 센터에서 굉장히 다양한 서비스들을 제공하는 클라우드 플랫폼이다. 특히 스타트업처럼 빠르게 서비스를 개발해서 출시까지 해봐야 하는 상황에서 AWS는 필수적이다.
먼저 AWS에서 가장 핵심적인 개념들을 알아보자.
AWS 기본 설계 구조
AWS를 이용한 가장 단순한 서비스 구조도이다.
1. 인스턴스 (EC2)
인스턴스는 AWS 에서의 하나의 가상 서버를 의미한다. 즉 하나의 가상화된 컴퓨팅 환경으로 RAM이나 코어와 같은 하드웨어 스펙을 설정할 수 있고, 어떤 OS를 설치할 것인지도 정할 수 있다. (인스턴스는 AWS에서의 가장 핵심적인 개념이며 이것들이 모인 집합을 클라우드라 부른다.) 만약 우리가 서버 개발을 통해 어떤 프로그램을 만들었다면 그 프로그램은 이 인스턴스 위에 올라가게 될 것이다.
AWS에서는 인스턴스를 Elastic Compute Cloud(EC2)라는 서비스를 통해 지원해준다.
보안그룹
AWS에서 보안그룹이란 인스턴스의 인바운드, 아웃바운드 트래픽을 제어할 수 있는 가상 방화벽을 의미한다. VPC와 Subnet가 구조적인 차원에서의 네트워크를 분리한다면, 보안그룹은 인스턴스 차원에서 네트워크에 대한 접근을 설정한다. 그리고 보안그룹은 트래픽을 거부하는 개념이 아니라 허용하는 개념으로 정의되어 있기 때문에, 인스턴스로 통신이 가능하도록 하면 해당 프로토콜을 직접 하나씩 열어 주어야 한다. (예를들어 원격으로 해당 인스턴스에 붙도록 하려면 RDP를 위한 포트를 보안그룹을 통해 따로 열어주어야 한다.)
보안그룹은 인바운드, 아웃바운드로 나누어지는데 인바운드는 인스턴스 외부에서 내부로 들어오는 요청을 의미하고, 아웃바운드는 내부에서 외부로 나가는 요청을 의미한다. (보통 보안상의 문제가 생기는 대부분의 이슈는 외부에서 내부로 들어오는 요청에 의해 발생하기 때문에 인바운드를 더 디테일하게 설정하곤 한다.)
로드밸런싱
AWS에서는 Elastic Load Balancing 서비스를 지원해주는데 이는 위 설계 구조에 그림에서처럼 클라이언트로부터 들어오는 요청들에 대한 트래픽을 어느 하나의 인스턴스에 집중되지 않도록 분배해주는 서비스를 의미한다. AWS 웹페이지에서 EC2 서비스를 통해 로드밸런싱 인스턴스를 설정할 수 있다.
2. 가상 네트워크 (VPC)
Virtual Private Cloud(VPC)는 사용자의 AWS 계정 정용 가상 네트워크이다. VPC는 AWS 클라우드에서 다른 가상 네트워크들과 논리적으로 분리되어 있다. 만약 VPC와 같은 가상 네트워크 개념이 없다면 어떻게 될까? 인스턴스들은 서로 거미줄처럼 연결될 것이고 이러한 구조는 시스템의 복잡도를 높일 뿐만 아니라 새로운 인스턴스가 붙을때 다른 인스턴스들을 각각 붙여주어야하는 불편함이 생긴다.
VPC를 적용한다면 VPC 별로 네트워크를 구성할 수 있고 각각의 VPC에 따른 네트워크 설정을 구성할 수 있다. 또한 네트워크가 논리적으로 독립적이기 때문에 외부로부터 발생되는 문제의 범위를 축소시킬 수 있다.
서브넷
할당된 네트워크를 더욱 작은 단위로 쪼개어 효율적으로 망을 구성할 수 있도록 돕는다. VPC가 하나의 큰 망이면 서브넷은 작은 단위의 망이라고 볼 수 있다. 이렇게 쪼개어진 각각의 서브넷 영역안에 인스턴스(EC2)나 DB들이 붙게 된다.
라우팅 테이블, 라우터
어떤 네트워크 요청이 생겼을 때, 데이터는 일단 라우터를 향해 전송된다. 그리고 라우터는 라우팅 테이블을 참조하여 전파된 데이터를 어디로 전송시킬지를 결정한다.
인터넷 게이트웨이
인터넷 게이트웨이는 VPC와 인터넷을 연결해주는 문이다.
3. 접근 권한 (IAM)
AWS의 Identity and Access Management(IAM) 서비스는 AWS 리소스에 대한 엑세스를 안전하게 제어할 수 있는 웹 서비스이다. IAM을 통해 리소스를 사용하도록 인증 및 권한을 부여할 수 있다.
로그인 자격 증명
AWS 계정 을 처음 생성하는 경우에는 전체 AWS 서비스 및 계정 리소스에 대해 완전한 액세스 권한을 지닌 단일 로그인 자격 증명으로 시작한다. 이 자격 증명은 AWS 계정 루트 사용자라고 하며, 계정을 생성할 때 사용한 이메일 주소와 암호로 로그인하여 액세스한다. 터미널(AWS CLI)를 통해 접근하든, 어플리케이션(AWS SDK)을 통해 접근하든 인증작업이 선행되지 않는다면 정상적인 응답을 받을 수 없다. 그러므로 반드시 로그인 인증 작업을 선행해야한다. 이 작업은 AWS의 Identity and Access Management(IAM) 서비스를 통해 설정할 수 있다.
AWS도 기본적으로 일반적인 웹사이트처럼 아이디와 비밀번호와 같은 인증 정보를 사용자로 부터 받아 검증하는 방식으로 인증을 처리한다.
Access Key ID: 일반 웹사이트의 아이디에 해당된다. (접근키)
Secret Access Key: 일반 웹사이트의 비밀번호에 해당된다. (보안키)
하나의 AWS 계정은 여러 개의 Access Key ID와 Secret Access Key 쌍을 생성할 수 있다. 인증정보를 생성하기 위해서는 아래 링크를 참고하도록 한다.
https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/id_root-user.html#id_root-user_manage_add-key
링크를 통해 로그인 인증 키를 성공적으로 생성하였다면 다음 디렉토리에서 credential 파일을 찾는다.
C:\Users\.aws\credentials
credential 파일을 열어 생성한 Access Key ID와 Secret Access Key를 넣는다.
[default]
aws_access_key_id = AfdsjflkdsjfkldHTIMGW
aws_secret_access_key = wfkdsasdflgklgfdfdjfgkfkkvKiES
output=json
region=us-east-2
toolkit_artifact_guid=f5f49ee6-acc9-4676-a563-54e0be255f16
이제 이 파일을 이용한다면 CLI를 이용하던, SDK를 이용하던, Visual Studio와 같은 IDE를 이용하던 AWS에 대한 자격증명을 수행할 수 있다.
역할 & 정책
AWS IAM에서는 역할과 정책을 추가할 수 있다. 먼저 역할은 각 인스턴스에 부여되는 개념이고 여러개의 정책들을 갖는다. 그리고 정책은 인스턴스의 기능에 권한을 설정하도록 구성되어 있다.
예를 들어서 현재 AWS 서비스에 3개의 서버 인스턴스, 1개의 포워딩 서버 인스턴스, 2개의 DB 인스턴스가 배포되어 실행중이라고 가정해보자.
여기서 포워딩 인스턴스에게는 서버 인스턴스을 위한 기능들만 가능하도록 권한을 부여하는것이 바람직할 것이다. 이 작업을 위해 포워딩 인스턴스 역할을 먼저 정의하고 이 역할 안에 인스턴스에 대한 기능 정책들을 추가하도록 한다. 만들어진 역할을 포워딩 인스턴스에 부여한다.
그리고 서버 인스턴스는 디비에 접근하기 위한 기능 권한들을 부여해야할 것이다. 위와 마찬가지로 서버 인스턴스 역할을 정의하고 그 안에 디비를 위한 기능 정책들을 추가한다. 만들어진 역할을 각각의 서버 인스턴스들에 부여한다.
마찬가지로 디비 인스턴스도 역할을 만들고 정책들을 넣도록 한다. 이 작업을 통해 각 인스턴스들이 기능 단위로 권한이 부여되어 딱 필요한 만큼의 기능만 수행가능하도록 설계할 수 있다. 이는 단순한 서비스를 구축하는 경우에는 크게 필요성을 느끼기 어렵지만 서비스가 복잡해지면서 인스턴스 종류가 다양해지고 개수가 많아진다면 반드시 필요한 기능중에 하나이다.
4. 데이터베이스 (RDS, DynamoDB)
AWS에서는 여러가지 데이터베이스 서비스들을 지원해준다. 기본적으로는 데이터베이스용 인스턴스에 데이터베이스 프로그램을 올려서 기존 웹서버 인스턴스와 연동시키도록 지원한다. 하지만 그 외에도 서버리스 구조로, 따로 인스턴스를 유지하지 않더라도 쿼리를 날리면 해당 쿼리에 대한 데이터를 보내주는 서비스도 지원해준다.
RDS
Relational Database Service(RDS)는 AWS에서 지원해주는 관계형 데이터베이서 서비스이다. 이 서비스는 관계형 데이터 테이블을 이용하고 SQL 쿼리를 통해 데이터를 접근하는 전통적인 데이터베이스 시스템이다. 이용 시 데이터베이스 인스턴스를 생성하며, 역할과 정책을 설정해주고 서버 인스턴스들과 연동시킬 수 있다.
DynamoDB
DynamoDB는 AWS에서 지원해주는 No SQL 데이터베이스로 키-값 및 문서를 이용하여 데이터를 저장한다. SQL을 모르더라도 키 값 규칙만 이해한다면 쉽게 이용할 수 있고, RDS와 달리 서버리스를 지원하기 때문에 데이터베이스 인스턴스를 개발자가 따로 유지하지 않아도 된다.
(DynamoDB도 마찬가지로 역할과 정책을 설정해주어야 이 DB의 기능들을 이용할 수 있다.)
5. 배포 자동화 (Elastic Beanstalk)
가장 기초적인 AWS 구조를 잡기 위해 지금까지의 개념들을 알아보았는데, 사실 여기까지만 해도 충분히 복잡하다. 단순히 클라우드를 통해 서버를 배포하려고 했을 뿐인데 VPC, 인스턴스, 로드밸런싱, 접근권한, DB 등등 너무 많은 개념들을 알아야하고 일일히 다 세팅해주어야 한다. AWS에서는 이러한 복잡한 과정을 자동화시켜둔 Elastic Beanstalk라는 서비스를 제공해준다. 이 서비스는 웹 서버를 배포함에 있어서 필요한 모든 개념들을 생성해주고, 환경이라는 하나의 단위로 묶어준다.
'Back End' 카테고리의 다른 글
[AWS] AWS에 Dot Net ASP 배포 (0) | 2021.09.27 |
---|