컨테이너로 어플리케이션 워크로드를 운영하는 것은 일반 가상 환경에서 서버를 운영하는 것과 다르다.

특히 실제 서비스 운영 단계에 봉착하면 컨테이너 자체의 관리 뿐 아니라 Docker 설정 환경 상 이슈, 컨테이너 들 간에 Dependency 관리 및 스케일링과 같은 다양한 문제를 만나게 되며, 이러한 문제를 마주치면 컨테이너가 무조건 좋은 기술만은 아니라는 생각이 들게 된다.

 

이 문제를 해결하기 위해 실제 프로덕션 환경에서는 Container 들 간에 논리적인 Orchestration 을 수행하게 된다. 이를 통해 컨테이너를 적절히 배치하고 스케줄링하며 죽은 컨테이너를 재구성해준다.

 

이를 통해 실제로 컨테이너 기반의 서비스를 한다는 것은 기존 전통적인 방식대로 몇개 컨테이너 위에서 서비스를 구동하고 직접 유지보수하는 것이 아니라 수많은 컨테이너를 띄워놓고 Container Orchestration Tool 을 통해 수많은 컨테이너의 관리 및 제어를 하는 것을 의미하게 된다.

이를 통해 각종 리소스의 관리, 컨테이너 라이프사이클 관리 및 서비스 관리 전반을 포괄하는 Container Orchestrator 에 대해서는 반드시 알아야하는 필수 지식이 되게 된다. 컨테이너 오케스트레이터는 YAML, JSON 과 같은 설정 파일을 기반으로 컨테이너 클러스터를 서술하며 이를 통해 어플리케이션 환경, 네트워크 구성 방법, 로그 저장 방식 등 어플리케이션 전체 환경을 포괄하는 코드 파이프라인을 구성한다.

 

가장 유명한 서비스는 역시 구글의 Kubernetes(k8s) 이다. 사실상 컨테이너 오케스트레이션 툴의 스탠다드가 되어가고 있으며, 이를 클라우드 위에서 활용한다면 아마존의 EKS(Elastic Kubernetes Service) 등 위에서 매니지드 인프라를 통해 제공받게 된다.

 

쿠버네티스는 구글에서 시작되어 CNCF 재단에서 기증받아 운영되는 오픈소스 프로젝트로, 운영 환경의 기본 사상 자체가 모든 클러스터 환경의 관리를 kubectl 과 같은 CLI 를 통해 YAML 파일 형태로 관리하는 것을 추구한다. (실제로 수많은 컨테이너를 중앙 관리하려면 코드 없이 관리가 사실 상 불가능하다..)

 

쿠버네티스에서 컨테이너들은 일종의 클러스터(Cluster)를 구성하며 이는 노드들의 집합으로 이해하면 된다.

쿠버네티스는 위와 같이 제어부(Control Plane)와 데이터부(Data Plane)을 갖고 있으며, Control Plane 에서는 Worker Node 들과 Cluster 내의 Pod 들을 관리하고 제어하는 역할을 수행하고, 사용자가 제어할 수 있는 인터페이스를 API 서버 형태로 제공한다.

Data Plane 은 워커 노드(Worker Node)들로 구성되어 있으며 컨테이너화된 어플리케이션의 구성 요소인 파드(Pod)를 호스팅하게 된다.

 

데이터 플레인에는 Kube-proxy 라는 일종의 프록시 서버가 존재하는데, Data Plane 내에서 네트워크의 조작을 담당하며, 특히 각 Pod 가 Failover 될 수 있기 때문에 해당 부분에 대한 제어 등 Access 를 위한 엔드포인트로써 사용되어진다.

Data Plane 의 kubelet 은 컨테이너 제어를 위한 런타임 인터페이스로 초창기에는 Docker 에 종속적인 내부 모듈이었지만, 이제는 표준화된 런타임인 Container Runtime Interface(CRI) 를 기반으로 구성되어 컨테이너 관리를 위한 추상화된 계층 형태를 제공한다.

 

개발자 및 관리자는 Kubectl 이라는 쿠버네티스 API 명령어를 인터페이스로 k8s 클러스터의 컨트롤 플레인과 통신하며, 내부를 CLI 로 제어한다. 

 

 

기초적인 개념에 대한 1차 정리는 여기까지 마치고, 내부 구성 요소들에 대한 개념은 다음 포스팅에 정리합니다. :) 

 

 

Amazon Web Service 에서 제공되는 EBS (Elastic Block Store) 서비스는 대규모의 워크로드에도 안정적인 퍼포먼스를 보여줄 수 있는 Block Storage Service 의 일종이다.

 

서비스로써는 일종의 하드디스크를 제공해준다고 이해하면 쉽다.

따라서 제공되는 서비스도 그에 알맞게 SSD, 프로비저닝된 IOPS(SSD) 등의 서비스가 제공된다.

 

가용영역(Availability Zone) 내에 자동으로 복제되며 스냅샷을 S3 에 저장하는 방식으로 안정적으로 운영된다.

 

다음과 같은 라이프사이클(Life Cycle)을 지닌다.

 

(1) 생성 : 사용되지 않은 볼륨을 사용할 수 있게끔 할당하는 작업이다.

 

(2) 연결 : 만들어진 EBS 볼륨을 EC2 인스턴스와 연결한다.

 

(3) 사용 : 포맷된 형태로 EC2 인스턴스에 탑재되어 사용된다.

 

(4) 스냅샷 생성 : Block Store 의 상태에 대한 스냅샷을 생성하고 S3 에 기록된다.

 

(5) 분리 : 연결된 EC2 인스턴스에서 분리된다.

 

(6) 삭제 : 할당된 볼륨의 사용을 해제한다.

 

EBS 는 기존 EC2 인스턴스가 휘발성을 가진 로컬스토리지라는 특성으로 인해 인스턴스 중지 시 데이터의 손상이 발생한다는 점을 보완하기 위해 별도로 운용될 수 있는 스토리지 시스템이다.

 

하드디스크의 특성을 지님에도 고가용성 및 안정성을 갖춘 설계 덕분에 이슈 상황에서도 데이터 유실을 방지할 수 있도록 데이터를 복제하고 스냅샷을 활용해 복원시킬 수 있는 솔루션을 지니고 있다.

 

또한 자체적으로 데이터 암호화를 제공하고 파일시스템으로써 동작하기 때문에 S3 와 같은 스토리지 서비스에 비해서도 매우 빠른 성능을 보여준다.

 

또한 사용한만큼 지불되는 S3와 달리 프로비저닝한 만큼만 요금을 지불한다.

 

클라우드 서비스를 잘 모르는 경우 익숙치 않을 수 있는 서비스이지만 비용 대비 효용성이 좋고 편의성이 우수하기 때문에 사용하기 좋은 서비스이다.

 

 

 

서버 / 네트워크쪽 혹은 클라우드쪽 일을 하는 엔지니어라면 베어메탈 서버라는 단어를 심심치않게 들을 수 있다.

 

Bare-metal Server 란 간단히 요약하자면, "싱글 테넌트 물리 서버 장비(Single tenant physical server)" 라고 할 수 있겠다.

 

근래 들어 가상화된 서버와 클라우드 호스팅과 비교되어 많이 등장하는 개념으로, "싱글 테넌트" 이기 때문에 물리 장비 하나에서 여러 가상 호스트가 떠있지않은, 그야말로 전통의 서버 인프라라고 할 수 있겠다.

 

최근에는 Data Center 를 구축해서도 안에 Multi-tenant 환경을 구축해놓는 방식이 많은데, 그 방식이 아닌 서버 머신 하나에 하나의 환경이 구축되는 환경을 말한다.

 


클라우드 환경에서 AWS 의 솔루션들을 사용하는 데 있어서 AWS Auto Scale 은 그 꽃이라고 할 수 있다.

AWS 의 Auto Scale 솔루션은 서비스의 스케일링(Scaling) 을 자동화할 수 있게 해주는 클라우드 인프라 솔루션이다.

AWS 의 Auto Scaling Group / Launch Configuration / Scaling Plan 와 같은 핵심 구성 요소들을 포함한다.

오토 스케일링 정책을 통한 설정을 바탕으로 몇 개의 인스턴스를 운용할지, 어떤 시점에 Scale 을 늘리고 어떤 시점에 낮출지 결정할 수 있다.

(Scaling 에 대해 잘 모른다면 다음 포스트를 참조하자. 

https://jins-dev.tistory.com/entry/Scaling-%EC%9D%98-%EC%A2%85%EB%A5%98%EC%97%90-%EB%8C%80%ED%95%9C-%EC%A0%95%EB%A6%AC)


이에 따라 Auto Scale 솔루션은 다음과 같은 장점들을 갖고 있다.

1. Cost Optimization

Scale 이 커져서 AWS 의 인프라들을 많이 사용하게 되면 비용이 증가하고 Scale 을 낮출 경우 비용을 절감시킬 수 있기 때문에 비용적인 측면을 같이 고려해서 사용해야 하며,

이러한 측면이 고려된 설계를 한다면 Auto Scale 을 통해 필요한만큼만 리소스를 사용함으로써 비용을 최적화할 수 있다.

(단, Auto Scale 솔루션 자체는 추가 비용이 들지 않는다.)


2. High Availability

Auto Scale 솔루션을 이용하면 Auto Scaling Group 에 대해 여러 Availability Zone 들에 고르게 인스턴스들을 할당하고 해제할 수 있다.

가령 Scale Out 을 통해 인스턴스들의 숫자가 많아질 때 하나의 영역에만 할당하는 것이 아니라 여러 영역에 고르게 분포시킬 수 있고, 해제할 때에도 균등하게 할당을 해제할 수 있다.

 


3. Well-Architectured Service

Auto Scale 을 통해 실제 요구량보다 많은 리소스를 사용하는 Over-Provisioning(오버 프로비저닝) 이나 실제보다 적은 리소스를 할당하는 Under-Provisioning(언더 프로비저닝) 을 방지할 수 있다.

이는 아키텍처를 설계함에 있어 유연성을 가져다줄 수 있다.


Auto Scale 솔루션은 다음과 같은 수명주기를 갖고 있다.

출처 : https://docs.aws.amazon.com/ko_kr/autoscaling/ec2/userguide/AutoScalingGroupLifecycle.html


수명 주기에 따라 Scale Out 된 인스턴스들은 Pending 상태 이후 In-Service 상태로 전환되며 Scale In 될 때에는 Terminating 프로세스를 수행하게 된다.

진행 중인 인스턴스를 Attach 하거나 Detach 하는 과정 역시 라이프사이클에 포함된다.

위와 같은 수명 주기 내에서 Auto Scale 은 주로 CloudWatch 지표를 바탕으로 이벤트가 트리거되며 이벤트를 통해 Lambda 함수를 호출한다던지, SNS 알림을 생성한다든지 하는 다른 작업을 같이 진행할 수 있다

Amazon EC2 Auto Scaling API 에 대한 호출은 AWS CloudTrail 을 통해 추적해볼 수 있다.

 

분산처리 환경을 구축하는 데 있어서 로드밸런서의 역할은 핵심적이다.

클라우드 환경에서 분산처리를 위한 아키텍처를 설계한다면, AWS 의 Load Balancer 를 이용해볼 수 있다.

 

Amazon Web Service 가 Provisioning 하는 Load Balancer 는 ELB(Elastic Load Banacing) 서비스라 하며, 기본적으로 Logging, Cloud Watch 를 통한 지표, 장애 복구, Health Check 와 같은 기능들을 제공한다.

ELB 서비스의 종류로는 2019년 8월 기준으로 3가지 종류가 있다.

 

 (1) Classic Load Balancer

가장 기본적인 형태이자 초기에 프로비저닝되던 서비스로, 포스팅 등에 나오는 설명에 단순히 ELB 라고 나와있으면 Classic Load Balancer 를 말하는 경우가 많다.

L4 계층부터 L7 계층 까지 포괄적인 로드밸런싱이 가능하며, 따라서 TCP, SSL, HTTP, HTTPS 등 다양한 형태의 프로토콜을 수용할 수 있고 Sticky Session 등의 기능도 제공해준다.

특징적으로 Classic Load Balancer 는 Health Check 를 할 때, HTTP 의 경우 /index.html 경로를 참조한다.

즉, 웹서버 인스턴스의 경로에 /index.html 가 포함되어있지 않다면(404) Health Check 를 실패한다는 뜻이다...

따라서 이럴 때에는 Health Check 를 위한 프로토콜만 TCP 로 바꾸고 포트만 80 으로 체크하게 하는 방법이 있다.

중요한 특징으로... CLB 는 로드밸런서가 url 하나를 가질 수 있다. 즉, CLB 로 매핑되어있는 인스턴스들은 무조건 하나의 URL 을 통해 접근하게 된다.

 

 (2) Application Load Balancer

Classic Load Balancer 이후 출시된 서비스로 HTTP 및 HTTPS 트래픽 로드밸런싱에 최적화되어있다.

L7 계층에서 작동하며 Micro Service Architecture 와 같은 Modern 환경을 겨냥한 많은 강점들이 있는데, WebSocket 이나 HTTP/1.1 이상의 프로토콜에 대한 지원, 향상된 라우팅 정책과 사용자의 인증 까지도 지원을 해준다.

웹서비스를 목적으로 한다면 기존 Classic Load Balancer 가 갖고 있던 장점 이상의 강점들을 많이 포함하고 있다.

단 L7 계층에서 작동하기 때문에 TCP 등에 대한 밸런싱은 지원되지 않는다.

직접 사용해서 구축 할때에 Classic Load Balancer 에 비해 좀 더 구축이 편하고 웹서버 밸런싱에 있어서는 확실히 다양한 옵션이 있다. Health Check 경로 또한 지정할 수 있으며, 기본이 / 로 정해져있다.

CLB와 다르게 ALB 는 host-based Routing 과 path-based Routing 을 지원한다. Content Based Routing 이라고도 하며 ALB 에 연결된 인스턴스들은 여러개의 URL 과 path 를 가질 수 있다.

 

 (3) Network Load Balancer

Load Balancer 중 성능적으로 최적의 로드밸런싱을 지원한다. TCP, UDP 등의 서버를 구축할 때 해당 프로토콜 들에 대해 굉장히 낮은 지연 시간으로 최적의 성능을 보여준다고 한다. 

사용해본적이 없는데... 사용해본다면 좀 더 포스팅 내용을 보강해야겠다.

 

 

로드밸런서에 EIP 를 직접 붙일 수는 없고, 필요하다면 DNS 의 도메인 네임 대신 CNAME 을 사용하거나 Route53 서비스와 같이 사용해야 한다. 그 이유는... ELB 역시 서버이기 때문에, 부하 상황에서 오동작의 위험이 있고 그에 따라 자체적으로 Scale In - Scale Out 을 수행하기 때문이다. (즉, IP 를 지정할 서버가 한대가 아니게 될 수 있다.)

또한, ELB 는 Multi-AZ 환경에서 "내부적으로는" 각 Availability Zone 별로 구성된다. 이 때 트래픽의 분배는 AZ 당 ELB 사정에 맞게 분배되므로... Multi AZ 환경에서는 각 Availability Zone 별 인스턴스의 숫자를 동일하게 맞춰주는 것이 좋다. (동일하게 맞추지 않으면 특정 Zone 의 인스턴스들에 트래픽이 몰릴 수 있다.)

 

로드밸런서를 통해 Cloud 환경에서 아키텍처를 설계할 때에는 Private Subnet 들에 EC2 인스턴스들을 배치해둔 상태에서, ELB로 트래픽을 연결할 수 있도록 인스턴스들을 연결시켜주고, Public 영역에 위치시켜 놓는 식으로 구성을 한다.

 

혹은, ELB 자체는 VPC 내부에 형성시켜 두고, ELB로 들어온 트래픽을 Private Subnet 으로 전개시켜주며, 인터넷에 연결을 위한 Public NAT 를 두고 출력을 해당 NAT 를 거치게 하는 방식도 있다.

 

다음은 AWS 공식 홈페이지의 Well architectured 를 위한 5가지 성질을 정의한 내용이다.

https://aws.amazon.com/ko/architecture/well-architected/

 

AWS Well-Architected – 안전하고 효율적이며 클라우드가 지원되는 애플리케이션을 구축

Well-Architected 프레임워크는 애플리케이션에 사용할 보안, 성능, 복원력 및 효율성이 뛰어난 인프라를 구축하는 클라우드 아키텍트를 돕기 위해 개발되었습니다. 5가지 기반인 운영 우수성, 보안, 안정성, 성능 효율성 및 비용 최적화를 기반으로 하는 이 프레임워크는 고객 및 파트너가 아키텍처를 평가하고, 지속적으로 확장되는 설계를 구현하기 위한 일관적인 접근 방식을 제공합니다. 이제 AWS Well-Architected Tool을 사용할 수 있습

aws.amazon.com

1. 운영 우수성(Operational Excellence)

비즈니스 가치를 제공하고 시스템을 실행 및 모니터링하는 데 중점을 둔다.

변경관리 및 자동화, 이벤트 응답, 일상적인 운영의 성공적인 관리 와 같은 항목들이 고려되어야 한다.

Operational Excellence 를 위한 다음과 같은 원칙들이 있다.

 

 - Perform operations as code : Cloud 환경에서도 일반 어플리케이션 코드를 만들 때처럼 작업의 프로시저와 이벤트에 대한 동작을 구현해야 한다. 휴먼 에러를 배제하고 이벤트 중심으로 구동되게끔 설계해야 한다.

 

 - Annotate documentation : 매빌드 이후에 Document 를 만들도록 자동화시키는 것이 중요하다. Cloud 환경에서는 documentation 을 자동화시킬 수 있다.

 

 - Make frequent, small, reversible changes : Component 들의 주기적 업데이트를 가능하게 하고, 실패 시 Rollback 이 가능해야 한다.

 

 - Refine operations procedures frequently : 주기적으로 프로세스를 향상시킬 방법을 고안해야 한다.

 

 - Anticipate failure : 프로세스가 실패로 이어질 상황을 시뮬레이션 해보는 것이 필요하다.

 

 - Learn from all operational failures : Operation failure 에 대해 정리하고 학습해야 한다.

 

* Operational Excellence 를 위해 AWS Config 를 통해 테스트를 준비하고, Amazon CloudWatch 를 통해 모니터링하며, Amazon ES(Elastic Search Service) 를 통해 로그를 분석하는 것이 좋다.

 

2. 보안(Security)

정보 및 시스템을 보호하는 중점가치이다.

데이터 기밀성 및 무결성, 권한 관리를 통한 사용자 작업 식별 및 관리, 시스템 보호와 보안 이벤트 제어와 같은 항목들이 고려되어야 한다.

Security 요소를 위해 다음과 같은 원칙들이 있다.

 

 - Implement a strong identity foundation : 최소 권한의 원칙과 의무에 대한 권한을 AWS Resources단위로 부여한다.

 

 - Enable traceability : 모든 동작은 모니터링과 알람이 가능하게끔 해야한다. 로그 시스템을 통합시켜놓음으로써 자동화가 가능하다.

 

 - Apply security at all layers : 모든 계층에 보안 요소를 포함시킨다. (edge network, VPC, subnet, Load Balancer, instances, OS, application)

 

 - Automate security best practices : Security mechanism 을 자동화시킨다. 버전관리를 하듯 템플릿을 관리한다.

 

 - Protect data in transit and at rest : 데이터에 대해서도 Encryption, Tokenization, Access control 등을 적용한다.

 

 - Prepare for security events : 갑작스런 보안 사고에 대비해 simulation 해보고, 탐지 속도, 탐지력, 복원력 을 측정해보는 것이 좋다.

 

* Security 를 위해 IAM, CloudTrail(API Call 추적), Amazon VPC, Amazon CloudFront(CDN 데이터의 보안), 데이터 보안을 위한 RDS, S3, AWS KMS(Key management system), CloudFormation / CloudWatch(시뮬레이션 및 모니터링) 등을 이용하는 것이 좋다.

 

3. 안정성(Reliability)

비즈니스 및 고객 요구를 충족시키기 위해 장애를 예방하고 신속하게 복구할 수 있는 능력에 중점을 둔다.

기본요소, 복구계획 및 변경 처리와 같은 항목들이 고려되어야 한다.

Reliability 를 위해 고려해야할 원칙들은 다음과 같다.

 

 - Test recovery procedures : System fail 및 fail 에 대한 recovery 상황을 테스팅하고 전략을 수립할 수 있기 때문에, 시나리오에 알맞게 recover 동작을 테스트해보는 것이 필요하다.

 

 - Automatically recover from failure : Key Performance Indicator(KPI) 를 모니터링함으로써 이상상태에 대한 Threshold 값을 세팅할 수 있고 복구를 자동화할 수 있다.

 

 - Scale horizontally to increase aggregate system availability : Horizontal scaling 은 Single Failure 가 전체 시스템에 영향이 미치지않게끔 구성할 수 있게 한다. 구조를 수평적으로 작게 나누고 합치는 형태의 구조를 사용한다.

 

 - Stop guessing capacity : 온프레미스 환경의 흔한 오류 원인은 Resource 포화상태이다. 클라우드 환경에서는 Load 를 모니터링하고 System utilization 을 통해 Provisioning 을 자동화할 수 있다. (Under/Over provisioning 의 방지)

 

 - Manage change in automation : 인프라 구성의 변화는 자동화되어야 한다.

 

* 사용가능한 AWS 서비스들로 AWS IAM, AWS CloudTrail, AWS Config, AWS CloudFormation, AWS KMS 등의 서비스가 있다.

 

4. 성능 효율성(Performance Efficiency)

IT 및 컴퓨팅 리소스를 효율적으로 사용하는데 중점을 둔다.

요구사항에 적합한 리소스 유형 및 크기, 성능 모니터링 정보를 바탕으로 한 효율성 유지와 같은 항목들이 고려되어야 한다.

Performance Efficiency 를 위해 고려해야할 원칙들은 다음과 같다.

 

 - Democratize advanced technologies : 새로운 기술이 있을 때, 클라우드 환경에서는 쉽게 적용시킬 수 있다.

 

 - Go global in minutes : Multiple Region 에 몇번의 클릭만으로 배포가 가능하다. 이는 고객 입장에서도 적은 비용으로 만족감을 느낄 수 있는 서비스의 특성이 된다.

 

 - Use serverless architecture : 클라우드의 서버리스 아키텍쳐는 서버를 직접 구동하고 운용할 필요성을 크게 줄여준다. 

 

 - Experiment more often : 가상의 자동화된 환경에서 테스트는 좀 더 빠르게 이루어질 수 있다.

 

 - Mechanical sympathy : 기술적 접근 방법을 고려한다.

 

* Performance Efficiency 를 위해, Auto Scaling, Amazon EBS, Amazon RDS, Amazon Route53, ElastiCache, CloudFront 와 같은 서비스들이 활용될 수 있다.

 

5. 비용 최적화(Cost Optimization)

불필요한 비용의 발생을 방지하고 지출 내용을 파악하여 가장 적합한 수의 적절한 리소스 사용에 초점을 둔다.

지출분석을 통해 초과비용 없이 비즈니스 요구사항을 만족시키는 조정 항목들이 고려되어야 한다.

Cost Optimization 을 위해 다음 원칙들이 고려되어야 한다.

 

 - Adopt a consumption model : 필요한 만큼의 컴퓨팅 리소스에 대해서만 비용이 지출되어야 하고 비즈니스 요구에 따라 사용량이 조절되어야 한다. (예측해서 많이 잡거나 해서는 안된다.)

 

 - Measure overall efficiency : 비즈니스의 전체 workload 와 output 을 측정해야 한다.

 

 - Stop spending money on data center operations : 인프라 관리비용 자체에 돈을 더 쓰면 안된다.

 

 - Analyze and attribute expenditure : Cloud 환경에서는 시스템의 사용량을 조회하고 비용을 산정하기 쉽다. ROI 를 측정하고 Resource 를 최적화하자.

 

 - Use managed services to reduce cost of ownership : Cloud 환경을 이용하면 email 을 보낸다던지하는 운영의 비용이 감축된다.

 

* AWS Cost Explorer 를 사용해서 비용 산정량을 확인할 수 있다. AWS Budget 은 사용량에 따라 향후 사용량을 예측할 수 있게 지원한다.

또한 Resource 를 Amazon Aurora 와 같은 것을 사용하면 라이센스 비용을 절감할 수 있고, Auto Scaling 은 스케일링의 효율성을 증가시켜준다.

 

 

처음 클라우드 기반 아키텍처를 설계할 때 상당히 도움이 되었었던 내용들이다.

클라우드 기반 아키텍처 설계를 담당하게 되었다면 꼭 알아두고 복습하자.

 



IAM(Identity and Access Management)이란 AWS 리소스에 대한 접근을 안전하게 제어할 수 있는 서비스이다.

프로비저닝된 서비스들에 대한 인증 및 권한을 관리하는 또하나의 클라우드 서비스로 이해하면 간단하다.



AWS 서비스를 이용 시, AWS 리소스에 대한 사용 권한을 설정할 수 있다. 즉 아무나 자신의 리소스를 관리할 수 없도록 하는 보안 장치같은 것이다.



이를 위한 방법으로는 다음과 같은 방법들이 있다.


(1) AWS 계정을 직접 생성하여 해당 계정을 통해 직접 AWS 리소스에 접근하는 방법이 있다.


(2) IAM 계정 생성을 통해 해당 리소스에 접근하는 방법이 있다.



위 방법들에 대한 간략한 설명은 다음과 같다.


처음 AWS 에 계정을 생성하면 Root User Credential 이라는 자격증명을 받게 되고, 이를 루트 사용자 권한이라 한다.

이를 이용하면, AWS 의 모든 리소스에 무제한으로 접근 및 제어가 가능하지만, 이 Credential 은 계정과 직접적으로 연결되어 있기 때문에 일반적인 Access 시나 협업을 할 때에는 사용하지 않는 것이 좋다. (1번 방법)


보통은 Root User Credential 을 이용해 서비스에 알맞게 IAM Credential 을 생성하여 사용자를 인증하고 리소스에 접근할 수 있도록 한다. (2번 방법)



IAM 은 계정에 대한 인증 및 권한 부여를 제어하는 데 필요한 인프라를 제공한다. IAM 인프라에는 다음과 같은 요소들이 포함되어 있다.


- Principal(보안 주체) : AWS 리소스에 대한 작업을 수행할 수 있는 개체를 말한다. AWS 계정 루트 사용자, IAM 계정 사용자 및 IAM 역할 사용자 등이 있다.


- 요청 : 보안 주체가 AWS Management Console, AWS API 및 CLI 를 사용하려고 할 때의 요청이다. 


- 인증 : 보안 주체는 리소스를 사용하기 위해 요청을 만들 때, 인증 과정을 거치게 된다.


- 승인 : 인증된 보안주체의 요청을 허가할지 말지 승인 과정을 거치게 된다. 각 리소스별로 정책을 명시하고 이 정책에 부합하는지를 확인한다.


- 작업 또는 연산 : 인증된 요청의 승인이 완료된 후 서비스가 실행된다. 주로 AWS 리소스들에 대한 CRUD 가 제공된다.


- 리소스 : 작업을 통해 리소스에 반영 및 조회가 가능하다. 



이렇게 생성된 IAM 자격 증명을 통해 IAM User가 AWS 계정의 리소스들에 접근하고 사용할 수 있다.


이러한 IAM User 들에 대한 관리는 IAM Policy 라 하는 일종의 정책으로 관리가 되는데, 정책을 통해 어떤 리소스의 어떤 Credential 들에 대해 허용(Allow) 또는 비허용(Disallow) 할지 결정한다.


IAM Policy 는 IAM User 들을 개별 관리할 수도 있지만 IAM Group 의 형태로 묶어서 권한을 할당할 수도 있다. 혹은 Role 을 정해서 Role 에 적합한 권한들만을 부여한 뒤, 해당 자격증명을 통해 관리하게 할 수도 있다.

이처럼 IAM 을 사용하면 보안과 권한 관련 설정들에 대해 인프라 담당자에게만 권한을 부여하거나 해당 팀원들에게만 최소한의 권한을 부여하도록 할 수 있다.



자세한 내용은 AWS 공식 문서를 참조하면 잘 설명 되어 있다.

(출처 : https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/introduction.html)


Docker는 가상화 컨테이너에 Application 배포를 자동화시켜주는 오픈소스 엔진으로 마이크로서비스 아키텍처와 함께 각광받고 있는 엔진이다

서버 환경이 전통적인 온프레미스 환경에서 클라우드로 바뀌면서 가상서버를 손쉽게 늘리고 관리할 수 있게 되었지만 이에 따른 배포는 불편한 점이었다

Docker가 제공하는 경량화된 가상화 컨테이너 기술은 환경의 배포와 확장을 하는데 엄청난 이점을 제공해준다.


Docker 엔진은 다음과 같은 구성요소들로 이루어져 있다.


<출처 : https://docs.docker.com/engine/docker-overview/#docker-engine>


Docker 는 Container 와 Image 라는 개념으로 구성되며, Network 및 Data 와 같은 리소스들을 각 엔진별로 다룰 수 있고 이를 위한 인터페이스로 Docker 서버에서 REST API 를 제공한다.


 * Image

Docker의 이미지는 Docker 컨테이너를 만들기 위한 Read Only Layer이다. 각 Image 들은 Docker 엔진 위에서 다른 Image 들을 Base로 하는 Image Layer 를 구성하고 있기 때문에 여러 Image들을 재사용해서 새로운 Image를 빌드하는 것이 가능하다.


 * Container

컨테이너는 실행가능한 Docker 이미지를 말한다. 각 Container 들은 Host 및 다른 Container 들과 완전히 격리된 공간을 구성하며 Image 를 Base로 한 환경에서 격리된 공간의 리소스에 접근할 수 있게 구성되어 있다.


여기서 중요한 사실은, Container Hypervisor와 완전히 다른 개념이라는 것이다.


가상화를 목표한 다는점은 같지만, 하이퍼바이저가 OS 및 커널이 통째로 가상화되는 반면, Container FileSystem의 가상화만 이루어진다. Container Host PC의 커널을 공유하고, 따라서 init(1) 등의 프로세스가 떠있을 필요가 없으며, 가상화 프로그램과는 다르게 적은 메모리 사용량, 적은 Overhead를 보인다

많은 벤치마크 결과가 입증하듯 Container Host PC의 자원을 격리(Isolation)된 상태 그대로 활용하기 때문에 VM에 비해 성능 저하가 눈에 띄게 적다.



여기서 Docker 가상화를 위한 다음과 같은 기술들을 이해하는 것이 중요하다.


-  Namespace : 리눅스에서는 접속한 게스트 별로 독립적인 공간을 제공하고 서로가 충돌하지 않도록 리소스를 격리시키는 namespace 기능을 커널에 내장하고 있다. 일반적으로 Linux 커널에서 지원하는 6가지 namespace 는 다음과 같다.


(1)  Mnt(파일 시스템 마운트) : 호스트 파일시스템에 구애받지 않고 독립적으로 파일시스템을 마운트하거나 언마운트 가능


(2)  Pid(프로세스) : 독립적인 프로세스 공간을 할당


(3)  Net(네트워크) : namespace 간에 network 충돌을 방지 (중복 포트 바인딩 등을 방지)


(4)  Ipc(System IPC) : 프로세스 간의 독립적인 통신통로 할당


(5)  Uts(hostname) : 독립적인 hostname 할당


(6)  User(UID) : 독립적인 사용자 할당

 

namespace 를 지원하는 리눅스 커널을 사용한다면 다음 명령어를 통해 바로 namespace를 만들 수 있다.


> Sudo unshared –fork –pid –mount-proc bash


위와 같은 명령어를 통해 별도의 PID Namespace를 할당할 수 있고, bash pid 1로 할당할 수 있다. 독립된 공간을 할당한 뒤에는 nsenter 라는 명령어를 통해 접근할 수 있으며 Docker에서는 이 역할을 docker exec 라는 명령어가 대신한다.


 네트워크 관점의 namespace 에서 트래픽은 network namespace로 분산한 만큼 방화벽 룰셋이 줄어들며, 결과적으로 지연시간도 줄어든다. Network namespace에 해당하는 conntrack slab allocator를 통해 관리되는데 이 conntrack 도 줄어들게 되므로 자원의 효율이 보장된다.


- Cgroup(Control Groups) : Control Groups 는 자원에 대한 제어를 가능하게 해주는 리눅스 커널의 기능이다. Cgroup은 다음과 같은 리소스들을 제어할 수 있다.


(1)   메모리


(2)   CPU


(3)   I/O


(4)   네트워크


(5)   Device 노드(/dev/)


 만들어진 실행 프로세스들의 그룹은 계층구조를 가지며 시스템의 자원할당, 우선순위 지정, 거부, 관리, 모니터링 등의 제어기능을 수행하므로 자원의 효율성을 향상시킨다. 단순 그루핑을 제공하므로 실제 자원 분배를 위해서는 각 자원마다 해당하는 서브시스템이 필요하다.


- Union File System : Union FS 는 Docker 가 관리하는 각 Layer에서 각 컨테이너가 이용할 수 있는 독립된 파일 시스템 블록을 말한다. 이 FileSystem 은 리눅스 커널이 제공하는 것이 아니기 때문에 Linux 의 종류별로 다른 형태를 제공한다. 가령 Ubuntu 계열의 Linux 는 AUFS 라는 형태의 Storage Backend 를 제공하지만 Redhat 계열은 그렇지 않다.


- Container Format : Docker Engine 을 구성하는 핵심 기술 스택인 namespace, cgroup, UFS 는 컨테이너를 이용하기 위한 Container Wrapper 를 갖고 있으며 이를 맞추기 위한 Container Format 을 관리하게 된다. Default Container 는 libcontainer 를 이용한다.




RDS는 AWS를 사용해서 웹서비스를 한다면 반드시 알아두어야할 서비스이다.


Amazon RDS는 클라우드에서 RDB의 사용을 설정, 관리 및 확장할 수 있게 도와주는 서비스이다. Amazon Aurora, PostgreSQL, MySQL, MariaDB, ORACLE, MSSQL 등을 지원한다.


RDS는 백업, Software patching, automatic failure detection, recovery 를 지원한다.

RDS의 기본적인 요소는 DB Instance이고, 이는 클라우드에 있는 독립적인 DB 환경이다. 

DB Instance는 정의하는 DB Instance class에 따라 Capacity(Memory) 등이 결정된다. (5Gb ~ 6Tb)

RDS 세팅을 하기 위해선 다음 과정을 거친다.


(1) AWS 접속


(2) IAM 계정 생성(Recommand) - Amazon에서는 RDS의 사용에 있어서 AWS 계정이 아닌 IAM 계정 사용을 권고한다. IAM User 계정을 만들고 그룹에 관리자 권한을 준다. 

이후 계정에 대해 Access Key를 발급받고, 그룹에 계정을 추가한 후 Security Credentials 탭에서 password를 설정한다.


(3) RDS의 DB Instance는 endpoint를 갖고 있으며 Application은 이 Endpoint로 접속하여 사용할 수 있는 구조로 되어있다.


(4) 필요한 기능에 맞게 설정한 후 Endpoint로 연결해서 사용하면 된다.


RDS에서는 이중화를 통해 장애에 대응할 수 있는 다중 사용 영역 복제와 고성능 I/O를 제공하는 Provisioned IOP Storage를 제공한다.(추가 요금 발생) 

RDS의 Instance 설정으로 License, DB Engine, DB Instance class, Storage Type, Allocated Storage, Network, Backup, Maintenance 등의 설정이 가능하다.

DB Instance를 생성하면 Instance의 Security group을 변경, MySQL Type의 Security group을 생성한다. 


RDS가 DB Instance를 Provisioning 한 이후에는 MySQL Client 또는 Utility로 Instance에 연결할 수 있다. 

연결 문자열에는 Host parameter로 DB Instance의 Endpoint DNS, Port parameter로 포트번호를 지정한다.

(ex) myinstance.123456.us-east-1.rds.amazonaws.com


> Mysql –h myinstance.123456.us-east-1.rds.amazonaws.com –p 3306 –u root -p



 Amazon RDS 는 몇가지 형태의 스토리지 옵션을 제공하며, 서버 엔지니어는 목적에 맞는 스토리지를 선택해서 사용해야 한다.

만약 인프라를 직접 설정해야한다면 종류를 잘 알아두지 않으면 불필요한 추가비용을 감당하게 될 수도 있다.


- 마그네틱(표준) : 보통 수준의 I/O 요구 사항에 대해서 적합한 비용효율적인 표준스토리지로, 크기 범위는 DB 인스턴스 엔진에 따라서 5Gb ~ 3Tb 정도이며, 경량화되어있기 때문에 현업에서는 주로 개발 및 검증용으로만 사용한다.


- 범용(SSD) : gp2라 불리고 SSD 이기 때문에 엑세스 속도가 매우 빠르며 지연시간이 한자릿수의 ms 단위이다. 중소규모의 운영용 DB에 이상적이다.


- 프로비저닝된 IOPS : 성능에 민감하고 I/O 집양적인 워크로드 및 DB 워크로드를 충족하게끔 설계되어있다. 주로 Massive 한 규모의 운영용 DB로 최적이다.




Scalability 와 Elasticity 는 클라우드 환경에서의 중요한 개념이고 면접에서도 심심치않게 등장하는 질문이다.


Scalability Cloud 에서 workload 증가할 부하를 감당할 있을만한 Resource Capacity 갖고 있느냐에 대한 내용이다

예상되는 요청에 대해서 아키텍쳐적인 관점에서 Scalable 하다는 것은 예상치를 충분히 감당할만한 Resource 갖고있다는 의미가 된다


반면에 Elasticity 막대한 양의 resource 용량에 대해서 순간적으로 할당하거나 해제하는 능력에 대한 성질이다. 요구에 걸맞는 resource 얼마나 빠르고 효과적으로 할당하는지를 말한다.


서버는 많은 양의 요청을 처리하기 위해 충분한 Scalability 를 갖추고 있어야 하며, 그를 위한 Scale Out 이나 Scale Up 등을 통해 리소스를 확보한다. 


이처럼 Scalable 한 시스템을 구축하기 위해서는 Elasticity 를 갖고 있어야 하며, 클라우드 환경에서는 리소스 추상화를 통해 빠른 할당과 회수를 가능하도록 환경을 구축하는 것이 중요하다.



+ Recent posts