Julie의 Tech 블로그

AWS SAA 자격증 준비 (3) - 컴퓨팅 본문

Tech/AWS

AWS SAA 자격증 준비 (3) - 컴퓨팅

Julie's tech 2022. 8. 14. 23:24
728x90

이번 글은 AWS 서비스에서 꽃이라고 할 수 있는 컴퓨팅 서비스에 대해 다뤄볼 것이다. AWS는 컴퓨팅 서비스는 아래와 같이 세 단계로 나눌 수 있다.

  • 가상머신 (Virtual Machine)
  • 컨테이너 서비스 (Container)
  • 서버리스 (Serverless)

이 세 단게는 점차 아래로 갈 수록 가상화 레벨이 높아졌다고 볼 수 있다.

출처 :  https://velog.io/@highway92/EC2-%ED%99%9C%EC%9A%A9%ED%95%98%EA%B8%B0
 

가장 대표적인 서비스는 EC2 (Elastic Computing) 서비스이다. EC2는 가상머신으로 생각하면 되는데, EC2를 런치하게 되면 전세계 AWS 리전에서 물리적 서버가 EC2 인스턴스를 호스팅하게 된다. 몇 분 이내로 프로비저닝하고 사용할 수 있는 서비스이며 내가 원하는 성능으로 여러 가지 타입을 지정하여 생성할 수 있다. 이 성능 마저도 내가 자유롭게 크기를 조정할 수 있다. 또한 종량제로서 사용한 만큼만 요금을 지불하면 된다.

AWS EC2

EC2 서비스를 이용할 때 몇 가지 알아야하는 용어들이 있다.

 

  • 가상머신이기 때문에 생성할 때 내가 원하는 OS 타입을 지정해야한다 (리눅스, Mac OS, Windows 등)

 

  • 그 다음으로 지정해야하는 것이 AMI (Amazone Machine Image)이다.
    • 아마존에서 이미 ready-made로 준비한 이미지이다. 운영체제, 스토리지 매핑, 권한이 셋팅되어있다.
    • 콘솔에서 t2.micro, t3.micro 와 같은 이름들로 볼 수 있는데 이 이름은 여러 가지 약어를 합쳐둔 것이다.
      • t3.micro → t : 인스턴스 패밀리, 3 : 세대, micro : 인스턴스 크기(vCPU, RAM, 네트워크성능)
      • 인스턴스 패밀리는 유형에 따라 나누어지는데 범용 / 컴퓨팅 최적화 / 메모리 최적화 / accelerated 컴퓨팅 (GPU), 스토리지 최적화 등이 있다.
    • 유형에 따라 스펙의 크기를 조정할 수 있다. 최신 세대일수록 트랜잭션당 평균 비용이 낮다.
    • 아마존에서 만들어둔 이미지 외에도 AWS MarketPlace를 통해 다른 이미지를 사용할 수 있고 혹은 아예 새롭게 생성할 수도 있다.

 

  • 인스턴스 수명 주기
    • 가장 처음 인스턴스를 시작(launch)하게 되면 '대기중(Pending)' 상태로 넘어가게 된다
    • 그 후 정상적으로 돌아가고 있다면 '실행중(Running)' 상태가 되며,
    • 사용자가 '재부팅' 혹은 '중지', '종료'를 할 수 있다. '재부팅'과 '중지'는 전후 '실행중' 상태일 것이다.

 

  • 공유 및 전용 테넌시 (Tenancy)
    • 전용 테넌시 : default. 물리적인 서버 위에 가상머신(EC2인스턴스)을 띄우는 형태이며 이 때 여러 사용자가 공용 가상머신에 접근하게 된다.
    • 전용 인스턴스 : 물리적인 서버를 선정
    • 전용 호스트 : 하드웨어 선정

 

  • 사용자 데이터 (User Data)
    • 인스턴스가 시작된 후 루트 사용자로 실행될 스크립트를 지정할 수 있다.
    • 공통적인 자동화 구성 태스크를 수행하는데 사용된다. 예를 들어 내가 여러 대의 서버를 띄우는데 해당 서버가 프로비저닝 된 후 수행해야하는 공통적인 명령어(패키지 설치, 웹서버 설치 등)을 지정할 수 있다.

 

  • 키 페어 (Key Pair)
    • AWS에서 인스턴스 생성시 보안의 이유로 Key Pair를 생성하는 것을 권장하는 편이다. 퍼블릭 키는 AWS에서 보관하고 프라이빗키를 로컬에 저장하여 EC2로 로그인할 때 프라이빗키를 제시하도록 하는 기능이다.

 

  • EC2 요금제 옵션
    • 온디맨드 인스턴스 : 사용하는 시간만큼 지불
    • 스팟 인스턴스 : 유연한 워크로드일 경우 사용하면 좋음. 중간에 중단되어도 괜찮은 배치성 업무를 진행할 때 이용하기 좋은 옵션. 이 옵션은 정책상 스팟 인스턴스 사용자가 컴퓨팅 자원을 사용하고 있다가 예약자가 이용할 시간이 도래하게 되면 2분이내로 스팟 인스턴스가 종료된다.
    • Savings Plan : 최고의 유연성을 지닌 옵션으로 대표적으로 컴퓨팅 Savings Plan이 있다. 일종의 약정으로서 인스턴스 패밀리 / 리전 / OS / 테넌시 / 컴퓨팅 옵션을 변경 혹은 지정할 수 있다. EC2외에 AWS Lambda와 같은 서버리스 서비스에도 약정을 걸고 싶을 때 사용한다.
    • 예약 인스턴스 : 온디맨드보다 훨씬 많이 사용하게될 경우 미리 예약 즉 약정을 걸어두고 사용하는 것이다.
      • 표준 예약 인스턴스 : 온디맨드 요금 대비 최대 72% 할인. 사용량이 지속적일 경우 인스턴스 패밀리를 약정하는 요금제 옵션이다.
      • 컨버터블 예약 인스턴스 : 온디맨드 요금 대비 최대 50% 할인. 예약 인스턴스의 속성을 변경 가능한데 변경하고자 하는 인스턴스의 속성이 동일하거나 더 높은(성능이 좋은) 옵션일 경우 가능하다.
    • AWS EC2도 구독서비스처럼 약정을 미리 걸어둘수록 저렴한 편이며 나열된 요금제 옵션은 점차 아래로 내려갈 수록 저렴한 편이다.

 

  • 인스턴스 스토어 볼륨 vs EBS (Elastic Block Store)
    • 인스턴스 스토어 볼륨 : 지속적이지 않은 휘발성 볼륨. 인스턴스가 활성화되어 있을 때만 유지되는 볼륨. 스냅샷을 지원하지 않는다.
    • EBS : EC2와 따로 생성(독립적)되어 호스트와 네트워크로 연결되어 비휘발성. 스냅샷을 지원한다. 물리적 하드드라이브처럼 사용 가능. EBS를 분리하여 다른 인스턴스에 붙이는 것도 가능
출처 링크 참조

 

 

  • Auto Scaling
    • EC2 서버 수를 늘리거나 크기를 확장하는 방식이다.
    • 내결함성 향상, 애플리케이션 가용성 향상, 낮은 비용 추구의 장점을 지니고 있다.
    • 수직 크기 조정 / 수평 크기 조정으로 나뉘게 된다.
    • Launch Template을 생성하여 최소 용량, 원하는 용량, 최대 용량 세 가지를 지정하게 된다.
    • 조정에는 예약, 동적, 예측 세 가지 종류가 있다.
      • 예약 - 예측 가능한 워크로드
      • 동적 - 일반적인 스케일링, CloudWatch와 같은 지표 모니터링 기능으로 축소/확장
      • 예측 - 가장 사용이 간편, 반복적인 워크로드(배치 등), 주기적인 트래픽 등

이상 AWS의 EC2와 관련된 용어와 기능을 다 정리하였다. EC2가 가장 많이 사용되는 서비스이니만큼 숙지하고 있어야할 개념과 기능도 무척 많다. 콘솔에서 직접 EC2를 생성해보면 이 용어들이 좀 더 가깝게 느껴질 것이다.

AWS 컨테이너 서비스

컨테이너는 가상머신과 달리 격리된채 서로 OS를 공유하고 바이너리/라이브러리를 공유하게 된다. 하지만 가상머신은 격리되어 동일한 바이너리/OS/라이브러리를 공유하지 않는다. 이러한 컨테이너 서비스는 마이크로 서비스를 위함이다. 마이크로 서비스는 독립 서비스로 구성된 어플리케이션을 의미하는 것이며 모놀리식(monolithic) 서비스와는 반대되는 용어이다. 마이크로 서비스를 통해 궁극적으로는 개발자에게 자율개발을 가능하게 하도록 한다. 마이크로 서비스 아키텍팅을 통해 개발자는 애자일하게 소프트웨어 개발을 할 수 있으며 이를 통해 서비스 지향 아키텍쳐를 설계할 수 있다. 또한 서비스 독립성을 통해 장애 저항성을 높여준다.

AWS의 컨테이너 서비스는 아래와 같다.

- ECR (Amazon Elastic Container Registry) : 이미지를 저장하고 재사용하고 싶을 때 저장하는 서비스

- ECS (Elastic Container Service) : 컨테이너 오케스트레이션 서비스

- EKS (Elastic Kubernetes Service) : AWS에서 k8s 실행. 작업자 노드로 컨테이너화된 애플리케이션을 실행

- AWS Fargate : 컨테이너 실행시 EC2 위에 컨테이너를 배포하는 과정을 담당. 컨테이너를 시작하면 Fargate가 모든 기본 컨테이너 인프라를 관리하게 된다. ECS, EKS 모두 Fargate를 기반으로 하고 있다.

ECS, EKS, Fargate에 대해서는 다른 블로그 포스팅에 자세한 설명을 해두었으니 생략하려 한다.

2021.05.12 - [IT/AWS] - AWS - Container Service (ECS vs EKS) 에 대한 이해

AWS 서버리스

마지막으로 AWS의 서버리스 서비스는 여러 가지가 있는데 그 중에서도 AWS Lambda와 AWS Fargate에 대해 정리하고자 한다. 서비스에 대한 소개를 시작하기에 앞서 서버리스라는 개념이 등장하게 된 배경에 대해 간단하게 짚고 넘어가자면, 서버리스는 monolithic (모놀리식) → micro 서비스 → 서버리스 순으로 점차 발전하게 되었다. 단계를 거듭할수록 가상화 레벨이 높아지게 되어 개발자가 점점 밑단 인프라에 대한 유지관리 관할을 덜어내면서 애플리케이션 수준의 레벨에서 개발에 힘을 쏟을 수 있게 되었다.

참고로 다음 글인 네트워크 편에서 이야기하겠지만 서버리스는 VPC 바깥에서 동작하게 된다.

AWS 서버리스 포트폴리오, 출처 사진 링크 참조

AWS Lambda는 AWS의 서버리스 서비스 중 대표적인 것으로 일종의 함수처럼 동작한다. Lambda는 아키텍쳐상 대부분 AWS 서비스 사이에 많이 두는 것 같다. 사이에 둔다는 의미는 A라는 서비스에서 B라는 서비스로 넘어갈 때 Lamdba를 거치도록 구성한다는 의미이다. 예를 들어 나는 앱개발자로서 앱 로그를 모니터링하고자 AWS Kinesis로 실시간 로그를 수집하는데, 로그가 인입될 때마다 Lambda를 trigger하여 동작하게 하는 것이다. Lambda는 Kinesis로 넘어온 로그를 가공처리하도록 프로그래밍 되어있다면 이 Lamdba로 다듬어진 로그는 스토리지에 저장하게끔 결과물을 다른 서비스로 넘기는 것이다. 물론 이 이외에도 Lamdba 후에 외부 서비스를 호출하도록 구성할 수도 있다.

Lambda는 서버리스 특성상 프로비저닝하거나 관리할 서버 없다. 이 의미는 내가 만약 EC2로 프로그래밍하기 위해서는 서버를 프로비저닝한 후 서버내에 텍스트 편집기(vim 등)을 설치하고 코딩을 한 뒤 언어에 따라 Runtime설치를 한 후 실행해야한다. 하지만 Lambda는 이 모든 과정이 필요없다. 서버리스 함수이기 때문에 AWS가 인프라는 모두 관리하게 된다. 사용자는 그저 Lambda로 필요한 프로그래밍만 하면 된다.

Lamdba는 사용량에 따른 크기 조정이 가능하고 다른 서비스와 마찬가지로 사용한 리소스 만큼만 요금을 지불하면 된다. 또한 AWS가 가용성 및 내결함성 서비스 제공한다는 장점이 있다.

Lambda가 지원하는 runtime은 Java, Node.js, Python, Go, C#이 있다. Lamdba 생성시 기본적으로 lambda_handler() 함수가 생성되는데 이는 main()과 같은 함수로 보면 된다. 이 함수 내부에 implement할 프로그래밍을 작성하게 된다. Amazon Docs에서 사용하는 Sample Lambda Implement Code는 아래와 같다.

import os
import logging
import jsonpickle
import boto3
from aws_xray_sdk.core import xray_recorder
from aws_xray_sdk.core import patch_all

logger = logging.getLogger()
logger.setLevel(logging.INFO)
patch_all()

client = boto3.client('lambda')
client.get_account_settings()

def lambda_handler(event, context):
    logger.info('## ENVIRONMENT VARIABLES\r' + jsonpickle.encode(dict(**os.environ)))
    logger.info('## EVENT\r' + jsonpickle.encode(event))
    logger.info('## CONTEXT\r' + jsonpickle.encode(context))
    response = client.get_account_settings()
    return response['AccountUsage']

Lambda 생성시 트리거를 지정할 수 있다. 트리거는 람다가 동작하기를 원하는 조건을 지정하면 된다. 람다는 최대 15분간 실행되며, 최대 10GB 메모리를 지원한다.

AWS Fargate는 서버리스 컴퓨팅 엔진으로 ECS, EKS에서 많이 등장하는 서비스이다. 우리가 AWS 컨테이너 서비스인 ECS, EKS를 사용하게 되면 EC2위에 컨테이너를 배포하게 되는데, 이 과정을 담당한다. 즉 컨테이너를 시작하면 Fargate가 모든 기본 컨테이너 인프라를 관리한다. ECS, EKS 모두 Fargate를 기반으로 하고 있다. ECS와 EKS는 Fargate 를 사용하게 되면 컨테이너를 위한 인스턴스를 관리할 필요 없이 컨테이너 자체만을 배포할 수 있도록 해준다. Fargate외에 선택할 수 있는 옵션(Launch Type)은 EC2인데 EC2에 대한 Full control이 필요한 컨테이너 배포의 경우 Fargate가 아닌 EC2를 선택하게 된다.

출처 :  https://aws.amazon.com/ko/blogs/korea/aws-fargate/
 

 

AWS StepFunctions

이 서비스는 위 사진을 보는 것이 글보다 더 명확하게 이해할 수 있다. 첨부된 사진처럼 이 서비스는 원하는 작업에 대한 순서도를 작성하는 서비스이다.
JSON 문서 형태로 순서도를 작성하는데, 각 순서도의 노드가 ‘state’, 순서도 자체는 ‘State Machine’라고 불린다.

각 노드는 분기 혹은 병렬로 두어 작업을 알맞은 순서대로 처리할 수 있다. 이처럼 Step Functions는 시각적 워크플로우를 통해 마이크로 서비스 조정이 가능하다. 애플리케이션 기능을 단계별로 실행할 수 있고, 각 단계를 자동으로 시작하고 추적하게 된다.

 

반응형