[ 고지 사항 (Disclaimer) ]
- 본 글은 Amazon Web Services Korea YouTube channel의 ‘Amazon EC2 Deep Dive’를 기초로 작성 되었습니다(글에 첨부된 이미지는 Amazon Web Services Korea SlideShare의 ‘ Amazon EC2 Deep Dive — 이창수 (AWS 솔루션 아키텍트) : 8월 온라인 세미나’자료입니다). 원본 내용은 해당 글의 링크로 연결 되어 있으며, 해당 원작자에게 저작권이 있습니다.
- 본 컨텐츠는 고객의 편의를 위하여 AWS 서비스 설명을 위해 제작, 제공된 것입니다. 만약 AWS 사이트와 컨텐츠 상에서 차이나 불일치가 있을 경우 AWS 사이트(AWS.amazon.com)가 우선합니다. 또한 AWS 사이트 상에서 한글 번역문과 영어 원문에 차이나 불일치가 있을 경우(번역의 지체로 인한 경우 등 포함), 영어 원문이 우선합니다.
이번 글에서는 Amazon EC2에 대하여 심도 있게 알보겠습니다.
주요 주제는 총 5가지 입니다.
1. Amazon EC2 개요
2. Amazon EC2 생성 및 시작하기
3. AMI (Amazon Machine Image) & 부트스트래핑
4. 유지 관리와 모니터링
5. 오토스케일링
#1. Cloud Computing 이란?
EC2는 엘라스틱 컴퓨트 클라우드의 줄임말로 aws 방대한 글로벌 리전에 있는 물리 서버들 위에서 수행이 되는 클라우드에서의 탄력적인 가상 서버를 의미합니다.
2006년을 시작으로 m1 small 인스턴스부터 현재까지 굉장히 다양한 인스턴스가 존재하고 있습니다. 이미지에서 파란색으로 표기된 인스턴스의 종류가 현재(2017년) 서울 리전에서 가용한 인스턴스를 나타냅니다.
인스턴스 유형 및 표기법에 대해서 좀 더 상세히 살펴보도록 하겠습니다. 어플리케이션 요구에 따라 인스턴스 패밀리, 세대 및 크기가 결정이 됩니다. ‘c4.large’ 인스턴스를 예를 들면 가장 앞에 있는 ‘c’가 인스턴스 패밀리이며 이어서 나오는 ‘large’가 인스턴스의 크기를 의미합니다. 인스턴스의 패밀리는 굉장히 다양하게 존재하기 때문에 어플리케이션 요구에 따라 선택할 수 있습니다. 그리고 인스턴스 칩이 발전함에 따라 인스턴스 세대가 올라가고 있습니다. 현재는 5세대까지 제공을 하고 있습니다. 또한 다양한 인스턴스 크기가 제공되고 있어 어플리케이션 요구에 따라 인스턴스의 크기를 선택하셔서 운영할 수 있습니다.
ec2 인스턴스는 굉장히 광범위한 컴퓨팅 스팩트럼을 제공하고 있는데 범용, 컴퓨팅 최적화, 메모리 최적화, 가속화된 컴퓨팅, 스토리지 최적화로 분류 할 수 있습니다(2019년 8월 현재).
- 범용: 범용 인스턴스는 균형 있는 컴퓨팅, 메모리 및 네트워킹 리소스를 제공하며, 다양한 여러 워크로드에 사용할 수 있습니다. 이 인스턴스는 웹 서버 및 코드 리포지토리와 같이 이러한 리소스를 동등한 비율로 사용하는 애플리케이션에 적합합니다.
- 컴퓨팅 최적화: 컴퓨팅 최적화 인스턴스는 고성능 프로세서를 활용하는 컴퓨팅 집약적인 애플리케이션에 적합합니다. 이 제품군에 속하는 인스턴스는 배치 처리 워크로드, 미디어 트랜스코딩, 고성능 웹 서버, HPC(고성능 컴퓨팅), 과학적 모델링, 전용 게임 서버 및 광고 서버 엔진, 기계 학습 추론 및 기타 컴퓨팅 집약적인 애플리케이션에 매우 적합합니다.
- 메모리 최적화: 메모리 최적화 인스턴스는 메모리에서 대규모 데이터 세트를 처리하는 워크로드를 위한 빠른 성능을 제공하기 위해 설계되었습니다.
- 가속화된 컴퓨팅: 가속화된 컴퓨팅 인스턴스는 하드웨어 액셀러레이터 또는 코프로세서를 사용하여 부동 소수점 수 계산이나 그래픽 처리, 데이터 패턴 일치 등의 기능을 CPU에서 실행되는 소프트웨어보다 훨씬 효율적으로 수행합니다.
- 스토리지 최적화: 스토리지 최적화 인스턴스는 로컬 스토리지에서 매우 큰 데이터 세트에 대해 많은 순차적 읽기 및 쓰기 액세스를 요구하는 워크로드를 위해 설계되었습니다. 이러한 인스턴스는 애플리케이션에 대해 지연 시간이 짧은, 수만 단위의 무작위 IOPS(초당 I/O 작업 수)를 지원하도록 최적화 되었습니다.
이중에서 t2 인스턴스에 대하여 살펴보면 t2 인스턴스는 가장 비용이 저렴한 인스턴스 타입으로 t2.micro 인스턴스를 기준으로 한 달에 750시간까지 프리티어로 12개월간 제공 되고 있습니다. 버스팅 기능을 통해 cpu 기본 성능보다 더 높은 성능을 제공 받을 수 있는 이는 크레딧 기반으로 작동합니다.
ec2 인스턴스 크기는 예를 들어 c4.8xlarge를 살펴보면 c4.xlarge 2대, c4.xlarge 4대, c4.xlarge 8대와 동일한 성능을 가지게 됩니다.
#2. Amazon EC2 생성 및 시작하기
AWS 환경에 접속하기 위해서는 3가지 방법이 있습니다. 첫번째 AWS 관리 콘솔(웹브라우저)에서 접속하거나 두번째 AWS에서 제공하는 CLI 명령어를 통해 접근이 가능하며 마지막으로 AWS가 제공하는 AWS API를 통해 SDK 개발 환경에서 API를 호출함으로 AWS 환경에 접근할 수 있습니다. 기본적으로 클라우드 환경에 접속하기 위해서는 인터넷을 통해 접속을 하게 됩니다. 인터넷을 통해 EC2 환경에 접속할 수 있고 인스턴스를 생성, 제어, 백업, 접근 제어 관리 등의 작업을 수행할 수 있습니다. EC2는 블록 스토리지 서비스인 Amazon EBS를 통해 OS가 설치 되고 OS와 EC2에 설치된 다양한 소프트웨어 패키지는 AMI(아마존 머신 이미지)를 통해서 제공 받을 수 있습니다. 그리고 그 AMI는 Amazon S3에 저장됩니다. 그리고 사용자는 ssh 공개키 인증을 사용하여 인터넷을 통해 EC2에 접속할 수 있습니다.
EC2 인스턴스의 수명 주기는 크게 실행중(Running), 정지됨(Stopped), 종료됨(Terminated) 이렇게 세가지 상태가 있습니다. AMI를 통해 EC2 인스턴스를 launching하면 먼저 Pending 상태로 표기가 되고 그 후 EC2가 생성이 완성되면 실행중(Running) 상태로 변경 됩니다. ‘실행중(Running)’는 인스턴스가 동작중인 상태를 의미하며 EC2 인스턴스에 대한 과금이 발생하게 되는 시점입니다. 실행중(Running)에서는 정지(Stopped) 하거나 rebooting, 종료(Terminated)를 하기 위한 상태 전이가 가능한 상태입니다. 정지(Stopped)를 하면 인스턴스의 기능은 정지가 되고 인스턴스에 대한 과금이 멈춥니다. 하지만 Amazon EBS 볼륨에 대한 비용은 계속 발생 됩니다. 그리고 실행중(Running)에서 종료(Terminated)를 하게 되면 인스턴스가 완전히 제거 되어 다시 시작, 정지가 불가능합니다. 따라서 정지(Stopped)와 종료(Terminated)의 차이를 구분하는 것이 매우 중요합니다.
EC2 인스턴스의 기본 구성 요소는 AMI, EBS 볼륨, 스냅샷, 인스턴스 스토어, ssh 인증을 위한 키패어, OS가 부팅 될 때 추가적인 제어가 가능하도록 하는 부트스트래핑, EC2 인스턴스가 존재하는 가상 사설 네트워크 구간인 VPC, 방화벽 역할을 하는 보안 그룹, 고정 퍼블릭 IP를 제공하는 Elastic IP가 있습니다.
인스턴스 스토어는 물리적인 서버에 위치하는 로컬 디스크를 의미합니다. 인스턴스 스토어는 임시 블록 스토어로서 EC2 인스턴스 상태가 정지(Stopped), 종료(Terminated)가 되었을 때 데이터가 모두 손실이 되게 되고 스냅샷을 통해 따로 백업을 할 수 없습니다. 하지만 이 스토리지 사용에 대한 별도의 추가 비용이 없기 때문에 테스트용의 초기 데이터나 혹은 버퍼, 캐시용으로 활용한다면 높은 효율성을 가질 수 있습니다. EBS는 네트워크로 연결된 영구 블록 스토어로 EC2가 정지(Stopped) 혹은 종료(Terminated) 되어도 데이터를 유지 할 수 있으며 각 볼륨마다 성능과 용량을 정의 할 수 있고, 스냅샷 기능을 통해 백업할 수 있습니다. 그리고 용도에 따라 범용 SSD 혹은 IOPS 를 원하는 용량대로 프로비저닝 하는 프로비저닝 IOPS 옵션이 있습니다. 혹은 처리량 자체를 최적화하기 위한 st1 타입, 콜드 HDD인 sc1 타입을 선택하여 사용 할 수 있습니다.
EC2 인스턴스에 접속하기 위해서는 기본적으로 키 페어가 필요합니다. 공개키는 메타 데이터를 통해서 접근 할 수 있고 사용자는 개인키를 다운로드 받아 개인키를 통해 EC2 인스턴스의 공개키와 매칭을 하게 되고 이를 통하여 ssh에 접속할 수 있습니다. 키 페어는 EC2 인스턴스에 접근하기 위한 인증이 방식으로 아이디, 비밀번호 인증 보다 더 안전한 인증 방식입니다. AWS는 공개키만 보관하고 EC2 인스턴스가 배포 될 때 공개 키가 인스턴스에 삽입이 됩니다. 사용자는 해당 공개키에 매칭하는 개인키를 다운로드 받아 그 개인키를 기반으로 EC2 인스턴스에 접속할 수 있습니다. EC2인스턴스를 생성할 때 키 페어를 선택할 수 있고, 사용자는 다른 키 패어를 가지고 있는 인스턴스에는 접속이 불가능합니다. AWS는 이 키 페어의 개인키를 보관하지 않기 때문에 사용자가 개인키를 잘 관리하는 것이 중요합니다.
#3. AMI (Amazon Machine Image) & 부트스트래핑
AMI는 아마존 머신 이미지에 줄임말로 인스턴스 시작에 필요한 OS 및 어플리케이션이 구성된 이미지를 의미를 합니다. 일반적인 환경에서 골든 이미지 라고도 표현 됩니다. OS와 여러가지 어플리케이션, 설정을 이미 최적화를 해 둔 이미지를 하나 잘 만들어 그 이미지를 기반으로 해서 사용자의 추가적인 EC2 인스턴스를 배포할 수 있는 환경을 구성할 수 있는 옵션입니다. 그리고 AMI에 대한 이미지 자체는 s3에 저장이 됩니다. AWS가 기본적으로 제공하는 AMI가 있고 그리고 파트너 커뮤니티 혹은 사용자도 직접 AMI를 생성하여 공유 할 수 있습니다. AMI는 계정 간에 프라이빗 하게 공유 할 수 있고 혹은 다른 리전으로 AMI를 복사 할 수도 있습니다. 기본 AMI를 통해서 EC2 인스턴트를 생성하고 그 이후로 수동적인 작업들, 예를 들어서 추가적인 어플리케이션 설치와 어플리케이션에 대한 설정을 마친 후에 커스터마이즈 된 AMI를 다시 이미지로 생성을 하고 그 AMI를 통해 EC2 인스턴스를 배포 하게 되면 여러가지 커스텀 인스턴스를 빠른 시간 내에 배포 할 수 있습니다.
AWS가 초기부터 관리하는 AMI는 Amazon Linux, redhat Linux, SUSE Linux, ubuntu Linux와 다양한 버전의 윈도우 AMI가 있습니다. 그리고 커뮤니티에서 관리되는 AMI는 커뮤니티 AMI와 AWS 마켓플레이스 AMI가 있습니다. 이 AMI는 다른 사용자들이나 AWS 마켓플레이스 파트너에 의해 관리 되고 있는 이미지로서 기본 OS 이미지에 파트너나 다른 커뮤니티에서 추가적인 패키지를 설치한 다음에 그것을 별도의 AMI로 판매하거나 기여를 하고 있는 이미지 입니다. 그리고 사용자가 직접 생성한 AMI를 본인이 관리하거나 계정별로 프라이빗하게 공유할 수도 있습니다.
부트스트래핑은 user date라고 하는 사용자 데이터를 통해 AMI가 부팅 될 때 추가적인 커멘트나 스크립트를 통해서 추가적인 제어를 유연할 수 있는 옵션입니다. 모든 EC2 인스턴스는 로컬 인스턴스의 사용자 데이터, 메타 데이터 서비스의 접근할 수 있는 권한을 소유를 하고 있습니다. 부트 스트리핑은 인스턴스가 생성될 때, 부팅될 때 사용자가 입력한 특정 스크립트를 실행할 수 있도록 하는 기능입니다. 크게 두가지 형태가 있는데 스크립트로 바로 수행을 하거나 cloud-init 지시문을 통해 수행을 할 수 있습니다. AMI로 어려운 동적인 설정을 부연 할 때 부트스트래핑을 활용할 수 있습니다. Linux 기반의 경우 bash shell을 사용하여 추가적인 apache, php, mysql 등을 바로 설치할 수 있으며, 윈도우 OS 경우는 powershell를 사용하여 추가적인 설정을 할 수 있습니다.
인스턴스의 메타데이터는 다양한 정보를 참조할 수 있는 기능을 제공하고 있으며 인스턴스 내에서 http를 통해 손쉽게 접근할 수 있습니다. 메타데이터 운영에 대하여 예를 들면 OS가 부팅될 때 최신 소프트웨어를 설치, s3로부터 데이터 복사, dns 등록, 서비스 기동, 패키지 업데이트, 패치 후 재기동, 로드밸런서에 등록, 장치 마운트 등이 있습니다.
AMI는 자신의 기본 이미지를 구축하고 사용자 지정 초기화 스크립트를 설정해서 ‘골든 이미지’를 만들고 관리하는 것이라면, 부트스트래핑은 그 AMI위에 추가적으로 동적인 구성이 필요할 때 사용되는 기능입니다. 예를 들어 OS와 개발에 관련된 패키지를 설치한 AMI를 배포하고 그 외의 구성은 최대한 유연하게 부팅 시에 추가적으로 필요한 패치를 받게 하거나 git으로부터 최신의 소스를 다운로드 받을 수 있도록 할 수 있습니다. AMI와 부트스트래핑을 조합하여 효율적으로 사용하는 것이 중요한 이유는 자동화, 가용성, 효율성, 확장성, 유연성, 보안을 향상 시켜 사용자의 코어 비즈니스 개발에 더욱 집중할 수 있도록 환경을 구성하는데 있습니다.
여기서 해야 할 것과 하지 말아야 할 것을 살펴보면, 가장 먼저 해야 할 것은 보안의 강화 입니다. AWS 루트 권한은 굉장히 강력하기 때문에 루트 권한을 MFA와 같은 다중 보안 요소를 통해 보안을 강화하고, IAM 통하여 역할을 최대한 세분화하여 보안을 향상 시키는 것을 권장합니다. 그리고 가능한 키 없이 사용하는 것을 권장 드리고 키에 대한 관리를 잘하는 것이 매우 중요합니다. 하지 말아야 할 것은 AWS 액세스 키를 소스 코드에 삽입하거나 키가 포함된 채로 AMI로 생성하는 것처럼 키가 외부로 유출될 수 있는 요소를 차단해야 합니다.
#4. 유지 관리와 모니터링
Amazon EC2 Systems Manager는 Amazon EC2, 온프라미스, 다른 클라우스에 있는 OS도 자동 구성 혹은 관리할 수 있는 기능을 제공합니다. Amazon EC2 Systems Manager은 윈도우와 리눅스 시스템을 모두 지원하고 ssm 에이전트가 설치되어 이 에이전트를 통해 정보를 수집하기 때문에 인터넷에 연결이 가능해야 합니다. 따라서 연결하고자 하는 EC2에서 아웃바운드로 인터넷이 허용되어 있어야 하며 IAM 역할에 대한 숙지가 필요합니다.
Amazon EC2 Systems Manager의 기능은 배포와 구성 및 원격관리를 원한 Run Command와 스테이트 매니저가 있습니다. 그리고 추적 및 업데이트 등을 위한 기능이 제공되고 있고 그 이후에 공유를 하기 위한 유지관리 기능, 파라미터 스토어가 서비스로 제공이 되고 있습니다.
Run Command는 일반적인 관리 작업을 원격에서 대규모로 수행하는 데 적합한 툴입니다. 예를 들어 쉘 및 Powershell 스크립트를 수백대, 수천대의 인스턴스에 동시에 실행할 수 있도록 합니다. Run Command를 사용하지 않을 때는 각각의 EC2 인스턴스에 접속을 해서 해당 원하는 커맨드 실행을 하고 정보를 받아 봐야 했으나 Systems Manager의 Run Command를 사용하면 개별 인스턴스에 직접 접근하지 않고 원격으로 동시에 대규모로 관리성의 작업을 수행할 수 있습니다. AWS의 광범위한 커뮤니티를 통해 작성된 커맨드 문서를 활용할 수 있으며 SSM Policy를 통해 세분화된 권한 적용이 가능하며, SSH나 RDP와 같은 원격의 필요성을 제거하여 보안 상태를 향상 시킬 수 있습니다. 또 Run Command를 통해 수행되는 모든 작업은 AWS CloudTrail에 기록되어 변경을 감사하게 됩니다. Run Command의 수행 환경을 살펴보면 관리 콘솔, CLI, API를 통해서 인터넷을 지나 AWS EC2 인스턴스, 온프라미스 데이터 센터에 있는 VM, 다른 클라우드에 있는 VM등을 관리할 수 있습니다.
Run Command에는 이미 제공 되고 있는 여러가지 커맨드가 있고 사용자가 수행하고자 하는 작업을 원하는 EC2 인스턴스에 선택하면 사용자가 원하는 값을 도출할 수 있게 됩니다. 그리고 더 많은 Documents가 있습니다. 이 Documents에는 커맨드 기반의 Documents도 있고 정책이나 오토메이션을 위한 다양한 Documents가 있어서 그것들을 참고하여 사용자가 원하는 작업 혹은 정책 자동화를 구성할 수 있습니다.
State Manager는 운영체제와 애플리케이션의 일관된 구성 정의 및 유지관리를 툴로서 정책을 통해 새로 생기는 여러가지 인스턴스나 애플리케이션이 정책에 적합게 일관된 구성을 손쉽게 할 수 있는 기능입니다.
오토메이션 서비스는 간소화한 워크플로를 사용하여 일반적인 작업을 자동화 할 수 있는 기능입니다. 예를 들어 아마존 머신 이미지에 대해서 변경 일어났을 때 수동으로 변경을 하나하나 작업 하는게 아니라 일련의 워크플로를 생성하여 아마존 머신 이미지의 변경이 일어 났을 때 자동화 과정을 통해 새로운 AMI를 생성할 수 있도록 수행 할 수 있습니다. 그리고 Run Command와 Lambda 함수와 유기적으로 사용할 수 있어 엔터프라이즈 환경에서 골든 이미지 AMI 관리에 대한 오버 헤드를 줄여 줄 수 있습니다.
파라미터 스토어는 암호, 라이선스 키 및 커넥션 문자열과 같은 주요 보안 정보를 중앙 집중식으로 관리를 도와주는 기능입니다. 중요한 정보를 개별 관리하는게 아니라 파라미터 스토어로 저장하고 해당 값들이 필요할 때 그 파라미터 스토어에 있는 값들을 참조해서 사용 될 수 있도록 한다면 보안에 대한 요소를 더욱 더 심층적으로 가져갈 수 있습니다. 그리고 자신의 kms 키를 통해 중요한 정보를 한번 더 암호화할 수 있습니다.
Maintenance Windows는 다운타임을 최소화하기 위해 잘 정의된 유지 관리 기간에 업무 중단이 필요한 작업들을 미리 예약 해서 윈도우 기반으로 어떤 패치나 작업들이 일어나도록 하는 기능입니다. 마찬가지로 런 커맨드 및 패치 매니저와 통합 기능을 제공해 드리고 있고 사용자가 원하는 잘 정의된 시간대에 자동으로 작업을 수행하도록 가용성과 안정성을 더 추가적으로 구성할 수가 있습니다.
Patch Manager는 사용자 정의 규칙 및 예약된 유지 관리 기간을 사용하여 운영체제 패치를 롤아웃할 수 있습니다. 윈도우 운영체제 뿐 아니라 리눅스 역시 현재 추가적으로 제공하고 있습니다. 패치의 종류와 중요성에 따라 정책을 세우고 정책을 기반으로 패치가 수행되도록 하거나 예약된 기간에 수행되도록 할 수 있습니다. 중요 업데이트 및 어떤 취약점에 대한 수동 개입을 최대한 제거해서 배포 시간을 단축시킬 수가 있는 굉장히 중요한 기능입니다.
CloudWatch를 통해 모니터링할 수 있는 여러가지 항목들이 있습니다. CPU, 메모리, 네트워크 디스크, 페이지로 나눌 수 있습니다. 그리고 CloudWatch Logs를 통해 log를 수집하고 그 log를 후처리 할 수도 있습니다.
#5. 오토스케일링
확장은 크게 두가지가 있습니다. 수직적인 확장과 수평적인 확정입니다. 수직적인 확장은 인스턴스의 종류를 변경하거나 EBS 용량을 증가 시키는 스케일업으로 결국 물리적인 한계에 도달하게 됩니다. 이런 물리적인 한계는 서비스 확장에 영향을 주어 서비스 연속성에 영향을 미칠 수 밖에 없습니다. 따라서 AWS는 수평적인 확장을 권장하고 있습니다. 인스턴스의 추가되고 ELB의 유연한 관리를 통해 서비스의 연속성에 영향을 주지 않고 스케일의 관리가 가능합니다. AWS는 설정한 특정 조건에 따라 수평적으로 인스턴스가 추가, 제거 될 수 있으며 이 기능을 오토스케일링이라고 합니다.
전통적인 IT 리소스 사용 패턴을 보면 가장 많은 부하를 상정하여 자원을 준비할 수 밖에 없습니다. 그리하여 필연적으로 낭비되는 자원이 생겨 날 수 밖에 없습니다. 하지만 AWS의 오토스케일링을 사용하면 요구되는 요청에 맞게 자원이 조절됨으로 적합한 리소스를 시스템에 제공할 수 있으며 비즈니스 일정에 맞추어 또한 예상하지 못한 이벤트에도 서비스의 연속성에 영향을 주지 않게 되어 효율적이며 탄력적으로 자원을 활용할 수 있게 됩니다.