사설 IP (Private IP)

  • 한정된 IP주소를 최대한 활용하기 위해 IP주소를 분할하고자 만든 개념
    • IPv4기준으로 최대 IP갯수는 43억개(4,294,967,296)
  • 사설망
    • 사설망 내부에는 외부 인터넷 망으로 통신이 불가능한 사설 IP로 구성
    • 외부로 통신할 때는 통신 가능한 공인 IP로 나누어 사용
    • 보통 하나의 망에는 사설 IP를 부여받은 기기들과 NAT 기능을 갖춘 Gateway로 구성
  • 참고: IPv6의 최대 IP 개수 : 2^128개
    • IPv4보다 2^96배 더 많음

NAT(Network Address Translation)

  • 사설 IP가 공용 IP로 통신 할 수 있도록 주소를 변환해 주는 방법
  • 3가지 종류

Dynamic NAT: 1개의 사설 IP를 가용 가능한 공인 IP로 연결

  • 공인 IP 그룹(NAT Pool)에서 현재 사용 가능한 IP를 가져와서 연결

Static NAT: 하나의 사설 IP를 고정된 하나의 공인 IP로 연결

  • AWS Internet Gateway가 사용하는 방식

PAT(Port Adddress Translation): 많은 사설 IP를 공인 IP로 연결

  • NAT Gateway/NAT Instance가 사용하는 방식
  • 보통 집이나 회사에서 사용하는 방식

사설 IPs

클래스 기반 라우팅

CIDR(Classless Inter Domain Routing)

  • ip는 주소의 영역을 여러 네트워크 영역으로 나누기 위해 IP를 묶는 방식
  • 여러 개의 사설망을 구축하기 위해 망을 나누는 방법

CIDR Block/CIDR Notation

  • CIDR Block : IP 주소의 집합
    • 호스트 주소 비트만큼 IP 주소를 보유 가능
    • 예: 192.168.2.0/24
      • 네트워크 비트 24
      • 호스트 주소 = 32-24= 8비트
      • 2^8 = 256개의 IP 주소 보유
      • 192.168.2.0 ~ 192.168.2.255 까지 총 256개의 주소를 의미 
  • CIDR Notation: CIDR Block을 표시하는 방법
    • 네트워크 주소와 호스트 주소로 구성
    • 각 호스트 주소 숫자 만큼의 IP를 가진 네트워크 망 형성 가능
  • A.B.C.D/E 형식
    • 예: 10.0.1.0/24
    • A,B,C,D: 네트워크 주소 + 호스트 주소 표시, E 0~32 : 네트워크 주소가 몇 bit인지 표시

IPv4의 ip 표현

서브넷

  • 네트워크 안의 네트워크
  • 큰 네트워크를 잘게 쪼갠 단위
  • 일정 IP주소의 범위를 보유
    • 큰 네트워크에 부여된 IP범위를 조금씩 잘라 작은 단위로 나눈 후 각 서브넷에 할당

 

문제 만들어 보기

Q.  CIDR 표기법으로 192.168.2.0/12 인 경우 해당 IP로 할당 가능한 호스트 개수는?

 

정답 : 2^20개

해설 : 32 - 12 = 20, 2^20개

Amazon Elastic File System(EFS)란?

Amazon EFS(Elatic File System)는 AWS 클라우드 서비스와 온프레미스 리소스에서 사용할 수 있는 간단하고 확장 가능하며 탄력적인 완전관리형 NFS 파일 시스템을 제공합니다. 이 제품은 애플리케이션을 중단하지 않고 온디맨드 방식으로 페타바이트 규모까지 확장하도록 구축되어 파일을 추가하고 제거할 때 자동으로 확장하고 축소하며 확장규모에 맞게 용량을 프로비저닝 및 관리할 필요학 없습니다

EBS와 EFS의 차이

  • NFS(Network File System) 기반 공유 스토리지 서비스(NFSv4)
    • 따로 용량을 지정할 필요 없이 사용한 만큼 용량이 증가 > EBS는 미리 크기를 지정해야 함
  • 페타바이트 단위까지 확장 가능
  • 몇 천개의 동시 접속 유지 가능
  • 데이터는 여러 AZ(가용영역)에 나누어 분산 저장
  • 쓰기 후 읽기(Read After Write) 일관성 -> 다른 인스턴스에서 쓰면 바로 다른 인스턴스에서 읽을 수 있음
  • Private Service : AWS 외부에서는 접속 불가능
    • 같은 VPC 내부에서만 접속 가능하고 외부에서는 VPN 혹은 Direct Connect 등으로 별도로 VPC와 연결을 구축해야함
  • 각 가용역역에 Mount Target을 두고 각각의 가용영역에서 해당 Mount Target으로 접근
  • Linux Only

Amazon EFS 퍼포먼스 모드

  • General Purpose : 가장 보편적인 모드. 거의 대부분의 경우 사용 권장
  • Max IO: 매우 높은 IOPS(Input/Output operation Per Second)가 필요한 경우
    • 빅데이터, 미디어 처리 등

Amazon EFS Throughput 모드

  • Bursting Throughput : 낮은 Throughput일 때 크레딧을 모아서 높은 Throughput일 때 사용
    • EC2 T타입과 비슷한 개념
  • Provisioned Throughput : 미리 지정한 만큼의 Throughput을 미리 확보해두고 사용

Amazon EFS 스토리지 클래스

  • EFS Standard : 3개 이상의 가용영역에 보관
  • EFS Standard-IA(Infrequent Access) : 3개 이상의 가용영역에 보관, 조금 저렴한 비용 대신 데이터를 가져올 때 비용 발생
  • EFS One Zone : 하나의 가용영역에 보관 -> 저장된 가용영역의 상황에 영향을 받을 수 있음(중요하지 않거나 다시 만들 수 있는것)
  • EFS One Zone - IA: 저장된 가용영역의 상황에 영향을 받을 수 있음, 데이터를 가져올 때 비용 발생(가장 저렴함)

Amazon FSx

FSx for Windows File Server

  • EFS의 윈도우즈 버전
  • SMB 프로토콜을 활용
  • Microsoft Active Directory와 통합 등의 관리 기능 사용 가능
  • Linux, MacOS등의 다른 OS에서도 활용 가능

FSx for Windows File Server

  • 리눅스를 위한 고성능 병렬 스토리지 시스템
  • 주로 머신러닝, 빅데이터등의 고성능 컴퓨팅(HPC, High Performance Computing)에 사용
  • AWS 밖의 온프레비스에서 엑세스 가능

 

문제 만들어 보기

Q. 다음중 EFS(Elastic File System)에 대한 설명으로 알맞지 않은 것은?

    a. 수많은 동시접속을 지원한다.

    b. EFS One Zone 클래스를 사용하면 여러 가용영역에 데이터를 분산하여 저장한다.

    c. 쓰기 후 읽기 일관성을 지원한다.

    d. EFS는 Private 서비스로 외부에서 접근하기 위해서는 Direct Access 또는 VPN을 사용해야 한다.

    e. 각 가용영역에 Mount Point를 두고있고 각 가용영역에서 EFS에 접근하기 위해서는 해당 Mount Point를 통해 접근하여야 한다.

 

정답 : b

해설 : EFS Standard 클래스의 경우 3개 이상의 가용영역에 나누어 저장하지만 EFS One Zone 클래스는 하나의 가용영역에 데이터를 보관한다. 

Elastic Load Balancer란?

Elastic Load Balancer는 들어오는 애플리케이션 트래픽을 Amazon EC2 인스턴스, 컨테이너, IP주소, Lambda함수와 같은 여러 대상에 자동으로 분산시킵니다. Elastic Load Balancer은 당일 가용 영역 또는 여러 가용 영역에서 다양한 애플리케이션 부하를 처리할 수 있습니다. Elastic Load Balancer가 제공하는 세가지 로드 밸런서는 모두 애플리케이션의 내결함성에 필요한 고가용성, 자동 확장/축소, 강력한 보안을 갖추고 있습니다.

  • 다수의 서비스에 트래픽을 분산 시켜주는 서비스
  • Health Check: 직접 트래픽을 발생시켜 Instance가 살아있는지 체크
  • Autoscaling과 연동 가능
  • 여러 가용영역에 분산 가능
  • 지속적으로 IP 주소가 바뀌며 IP 고정 불가능 : 항상 도메인 기반으로 사용
  • 총 4가지 종류
    • Application Load Balancer
    • Network Load Balancer
    • Classic Load Balancer(2022.08부로 서비스 중지)
    • Gateway Load Balancer

ELB 종류

Application Load Balancer

  • 똑똑한 녀석
  • 트래픽을 모니터링하여 라우팅 가능
    • 예: image.sample.com -> 이미지 서버로, web.sample.com->웹 서버로 트래픽 분산

Network Load Balancer

  • 빠른 녀석
  • TCP 기반 빠른 트래픽 분산
  • Elastic IP 할당 가능(IP를 고정할 수 있는 기능)

Classic Load Balancer(2022.08 부로 서비스 중지)

  • 옛날 녀석
  • 예전에 사용되던 타입으로 현재는 잘 사용하지 않음

Gateway Load Balancer

  • 먼저 트래픽 체크하는 녀석
  • 가상 어플라이언스 배포/확장 관리를 위한 서비스

타겟 그룹(Target Group)

  • Application Load Balancer가 라우팅 할 대상의 집합
  • 구성
    • 3+1가지 종류(다른 종류의 서비스도 가능하지만 기초에서는 기본적인 내용만 다룸 ex. ECS)
      • Instance
      • IP
      • Lambda
      • 다른 ALB
    • 프로토콜(HTTP, HTTPs, gRPC)
    • 기타 설정
      • 트래픽 분산 알고리즘, 고정 세션 등

 

아키텍쳐 예시

 

문제 만들어 보기

Q. 다음중 Application Load Balancer의 대상그룹(Target Group)으로 알맞지 않은것은?

    a. IP

    b. EC2 인스턴스

    c. EBS

    d. 다른 ALB

    e. Lambda 함수

 

정답 : C

해설 : ALB의 대상그룹으로 가능한 것은 IP, EC2 인스턴스, Lambda 함수, 다른 ALB 입니다.

Stack이란?

Stack은 시간 순서상 가장 최근에 추가한 데이터가 가장 먼저 나오는 후입선출 LIFO(Last In First Out)형식으로 데이터를 저장하는 자료구조 입니다.
Stack의 top에 데이터를 추가하는 것을 push라고 하고 stack의 top에서 데이터를 추출 하는 것을 pop이라고 합니다.

 

 

List based Stack

Python의 list 자료형을 사용하더라도 push, pop 두 연산 모두 O(1)이기 때문에 Linked list 보다 array list를 활용한 Stack을 구현하는게 편하다

 

 

코테 적용 방법

Stack의 다양한 활용

  1. LIFO 특성을 활용한 문제
  2. DFS(깊이 우선 탐색)에 사용

코딩 테스트 문제를 접근하는 4가지 단계에 맞춰서 문제를 풀어보자

나의 풀이

LIFO 첫번째 문제

  • Step 1 문제 이해하기
    • 소,중,대 괄호의 짝이 맞는지 검사해야겠구나
    • input은 String으로 괄호들이 들어오고 output은 Boolean 값을 리턴해주면 되겠구나
  • Step 2 접근 방법
    • 한글자씩 스택에 넣다가 괄호가 짝이 맞으면 pop
    • 만약 다 넣고 pop도 다 했는데 남아있으면 유효성 검사 탈락
  • Step 3 코드 설계
    • python list를 스택으로 선언하자
    • 스택에 한글자씩 push하다가 짝을 만나면 pop하자
    • for문이 끝나고 스택에 아직 남아있는 글자가 있다면 false, 없다면 true
  • Step 4 코드 구현
def isValid(self, s: str) -> bool:
    # stack 선언
    stack = []
    # 열림 닫힘 
    open = "({["
    close = {
        ')':'(',
        ']':'[',
        '}':'{',
    }
    # 한글자씩 stack에 push
    for ch in s:
        if len(stack) == 0:
            if ch in close.keys():
                return False
            else:
                stack.append(ch)
        else:
            if ch in open:
                stack.append(ch)
            else:
                if stack[-1] == close[ch]:
                    stack.pop()
                else:
                    return False
    if len(stack) == 0:
        return True
    else:
        return False

 

 모범 답안

  • Step 2 접근 방법
    • 여는게 있으면 닫는게 있으니 유효한 경우 글자수는 짝수가 되어야 함
    • 여는게 먼저 와야한다
    • 짝이 맞아야 한다
  • Step 3 코드 설계
    • input s의 글자를 for 문을 돌면서 stack에 넣는다
    • 넣을 때 여는 괄호라면 그대로 stack에 넣고
    • 닫는 괄호인 경우에 stack에 짝이 있는지 확인한다.
  • Step 4 코드 구현
def isValid(self, s: str) -> bool:
        stack = []
        if len(s)%2 != 0:
            return False
        for ch in s:
            if ch == "(":
                stack.append(")")
            elif ch == "{":
                stack.append("}")
            elif ch == "[":
                stack.append("]")
            elif not stack or stack.pop() != ch:
                return False
        return not stack

 

LIFO 두번째 문제

 

 모범 답안

  • Step 2 접근 방법
    • 제약 조건을 통해 O(n^2)로 풀면 안된다는 것을 알 수 있다.
    • Stack에 넣으면서 넣으려는 날씨가 head보다 따뜻하면 pop하면서 경과 일 수를 기록한다
  • Step3 코드 설계
    • enumerate함수를 활용하여 (일수, 기온)형태로 바꾼다
    • answer 리스트를 temperature 크기의 0으로 이루어진 리스트로 초기화 한다.
    • while문을 돌면서 조건에 해당하는 경우 해당 인덱스에 맞는 경과 일수로 갱신한다.
  • Step4 코드 구현

 

새롭게 알게된 점

  • enumerate 내장함수를 사용하면 index를 위한 변수를 따로 선언하지 않고 편하게 사용할 수 있다.
  • 주어진 리스트와 같은 크기의 리스트를 결과값으로 리턴해야 할 때 해당 크기만큼 초기화 하자
  • 어떤 조건일 때 값을 갱신해 나가는 구조인 경우 Stack을 활용하자

 

Queue란?

Queue는 시간 순서상 먼저 저장한 데이터가 먼저 출력되는 선입선출 (First in First out, FIFO)형식으로 데이터를 저장하는 자료구조입니다.
Queue의 rear에 데이터를 추가하는 것을 enqueue라고 하고, queue의 front에서 데이터를 꺼내는 것을 dequeue라고 합니다.

 

List based Queue

# queue 선언
q = []
# enqueue
q.append(1)
q.append(2)
q.append(3)
q.append(4)
# dequeue O(n)
q.pop(0)
q.pop(0)
q.pop(0)

enqueue의 경우 O(1)이지만,

dequeue의 경우 하나가 빠질 때마다 모든 요소가 움직여야 하기 때문에 O(n)이다.

 

Linked List based Queue

from collections import deque

queue = deque()

# enqueue() O(1)
queue.append(1)
queue.append(2)
queue.append(3)
queue.append(4)

# dequeue() O(1)
queue.popleft()
queue.popleft()
queue.popleft()

Python 패키지 중 deque 자료구조를 활용하면 연결리스트로 이루어진 queue를 빠르게 구현할 수 있다.

**deque는 Doubly ended queue의 줄임말로 왼쪽, 오른쪽 모두 enque, dequeue가 가능한 자료구조입니다.

 

코딩 테스트 문제 풀이

Queue 자료구조 단독으로 출제되는 경우가 드물고 다른 알고리즘(너비우선탐색 등)을 푸는데 사용됨

* 재활 훈련이라 놓치고 있었던 부분 또는 핵심인 부분만 블로깅 했습니다

Linked List란?

  • Node라는 구조체가 연결되는 형식으로 데이터를 저장하는 자료구조
  • Node는 데이터값과 next node의 주소값을 저장
  • 물리적 비연속적, 논리적 연속적
  • 메모리 사용이 자유로움
  • 데이터 하나당 차지하는 메모리가 더 커짐

 

Node

Linked List의 구현

  • get()
    • 해당 index까지 연결된 링크를 타고 get
  • insert()
    • insert_at(self, index, value) : value를 가진 Node생성, index까지 가서 이어 붙이기 -> O(n)
    • insert_back(self, value) : tail이 적용된 경우 tail 값만 교체 -> O(1)
  • remove()
    • remove_at(self, index) :  index까지 가서 삭제 후 링크 수정 -> O(n)
    • remove_back(self) : tail이 적용된 경우 tail 값만 삭제 후 링크 수정-> O(1)

 

Linked List의 코테 적용 방법 

Linked List의 다양한 활용

  1. Linked List 자유자재로 구현 (선형 자료구조와 중간에 데이터를 추가/삭제가 용이함)
  2. Tree구조와 Graph에 활용

문제 : Design Browser History

링크 : https://leetcode.com/problems/design-browser-history/

Step 1  문제 이해

  • input, output확인
    • input값의 특징 (정수? 값의 크기 범위? 음수 가능? 소수? 문자열? 등등)
    • output값의 특징 (내가 어떤 값을 반환해줘야 하는가, 정해진 형식대로 반환하려면 어떻게 구현 할지)
  • input size N 확인
    • 시간복잡도를 계산하기 위한 input size N또는 M이 무엇인지 확인
  • 제약조건 확인
    • 시간복잡도 제한이 있는지
    • 내가 선택할 수 있는 알고리즘이 무엇이 있는지
  • 예상할 수 있는 오류 파악
    • 상황을 가정하면서 예상할 수 있는 오류를 파악한다
    • 입력값의 범위, stack overflow 등등

 

나의 풀이

class Node:
    def __init__(self, url:str = '', forward=None, back=None) -> None:
        self.url = url
        self.forward = forward
        self.back = back

class BrowserHistory:
    def __init__(self, url:str) -> None:
        new_node = Node(url=url)
        self.current = new_node

    def visit(self, url:str) -> None:
        new_node = Node(url=url)
        self.current.forward = new_node
        new_node.back = self.current
        self.current = new_node

    def back(self, num:int) -> str:
        for _ in range(num):
            prev = self.current.back
            if prev == None:
                return self.current.url
            else:
                self.current = prev
        return prev.url
    
    def forward(self, num) -> str:
        for _ in range(num):
            post = self.current.forward
            if post == None:
                return self.current.url
            else:
                self.current = post
        return post.url

 

풀이 결과 : 통과

AWS Auto Scaling

AWS Auto Scaling은 애플리케이션을 모니터링하고 용량을 자동으로 조정하여 최대한 저렴한 비용으로 안정적이고 예측가능한 성능을 유지합니다. AWS Auto Scaling을 사용하면 몇 분 만에 손쉽게 여러 서비스 전체에서 여러 리소스에 대해 애플리케이션 규모를 조정할 수 있습니다. 

 

Vertical Scale(Scale Up)

Horizontal Scale(Scale Out)

 

 

EC2 Auto Scaling

목표

  • 정확한 수의 EC2 인스턴스를 보유하도록 보장
    • 그룹의 최소 인스턴스 숫자 및 최대 인스턴스 숫자
      • 최소 숫자 이하로 내려가지 않도록 인스턴스 숫자를 유지(인스턴스 추가)
      • 최대 숫자 이상으로 늘어나지 않도록 인스턴스 숫자 유지(인스턴스 삭제)
    • 다양한 스케일링 정책 적용 가능
      • 예: CPU의 부하에 따라서 인스턴스 크기를 늘리기
  • 가용 영역에 인스턴스가 골고루 분산될 수 있도록 인스턴스를 분배

 

Auto Scaling의 구성

  • 시작 구성(Launch configurations)/시작 템플릿(Launch template): 무엇을 실행시킬 것인가?
    • EC2의 타입, 사이즈
    • AMI
    • 보안그룹, Key, IAM
    • 유저 데이터
  • 모니터링: 언제 실행시킬 것인가? + 상태확인
    • 예: CPU 점유율이 일정 %를 넘어섰을 경우 추가로 실행 or 2개 이상이 필요한 스택에서 EC2하나가 죽었을 때
    • CloudWatch or/and ELB와 연계
  • 설정: 얼마나 어떻게 실행시킬 것인가?
    • 최대/최소/원하는 인스턴스 숫자
    • ELB와 연동

 

문제 만들어 보기

Q. 다음중 AWS Auto Scaling을 사용하는 목적으로 알맞지 않은 것은?.

    a. 정확한 수의 EC2 인스턴스를 보유하도록 보장

    b. 다양한 스케일링 정책을 적용하기 위해

    c. 가용 영역에 인스턴스가 골고루 분산될 수 있도록 인스턴스를 분배하기 위해

    d. 스케일링 정책에 맞추어 개별 인스턴스의 성능을 높히기 위하여

 

정답 : d

해설 : AWS Auto Scaling은 수평적인 확장(Horizontal Scale)을 용이하게 해주는 기능입니다.

EBS

EBS는 EC2인스턴스에 사용할 영구 블록 스토리지 볼륨을 제공합니다.
  • 가상의 하드드라이브
  • EC2 인스턴스가 종료되더라도 계속 유지 가능
  • 인스턴스 정지 후 재 기동 가능
  • 하나의 EBS를 여러 EC2 장착 가능(EBS Multi Attach)
  • 루트 볼륨으로 사용시 EC2가 종료되면 같이 삭제됨
    • 단 설정을 통해 EBS만 따로 존속 가능
  • EC2와 같은 가용영역에 존재
  • 총 5가지 타입 제공
    • 범용(General Purpose or GP3): SSD
    • 프로비저닝 된 IOPS(Provisioned IOPS or io2) : SSD
    • 쓰루풋 최적화 (Throughput Optimized HDD or st1)
    • 콜드 HDD(SC1)
    • 마그네틱(Standard)

EBS 종류

 

Snapshot

  • 특정 시간에 EBS 상태의 저장본
    • EBS에 사진을 찍어둔 개념
  • 필요시 스냅샷을 통해 특정 시간의 EBS를 복구 가능
  • S3에 보관
    • 증분식 저장 (변한 부분만 저장한다)

AMI

  • EC2 인스턴스를 실행하기 위해 필요한 정보를 모은 단위
    • OS, 아키텍쳐 타입(32bit or 64bit), 저장공간 용량 등
  • AMI를 사용하여 EC2를 복제하거나 다른 리전 -> 계정으로 전달 가능
  • 스냅샷을 기반으로 AMI 구성 가능

구성

  • 1개 이상의 EBS 스냅샷
  • 인스턴스 저장 인스턴스의 경우 루트 볼륨에 대한 템플릿(예: 운영체제, 애플리케이션 서버, 애플리케이션)
  • 사용 권한(어떤 AWS 어카운트가 사용할 수 있는지)
  • 블록 디바이스 맵핑(EC2 인스턴스를 위한 볼륨 정보 = EBS가 무슨 용량으로 몇개가 붙는지)
  • 총 두가지 타입
    • EBS기반 or 인스턴스 저장 기반
  • 타입에 따른 AMI의 생성 방법
    • EBS: 스냅샷을 기반으로 루트 디바이스 생성
    • Instance Storage: S3에 저장된 템플릿을 기반으로 생성

EC2의 생명 주기

  • 중지
    • 중지 중에는 인스턴스 요금 미청구
    • 단 EBS요금, 다른 구성요소 (Elastic IP등)은 청구
    • 중지 후 재시작시 퍼블릭 IP 변경
    • EBS를 사용하는 인스턴스만 중지 가능 : 인스턴스 저장 인스턴스는 중지 불가
  • 재부팅
    • 재부팅시에는 퍼블릭 IP 변동 없음
  • 최대 절전 모드
    • 메모리 내용을 보존해서 재시작시 중단지점에서 시작할 수 있는 정지모드
     

인스턴스 상태별 사용 요금

 

문제 만들어 보기

Q. 다음중 AMI에 대한 설명으로 옳지 않은 것을 고르시오.

    a. AMI는 EC2 인스턴스를 실행하기 위해 필요한 정보를 모은 단위로 OS, cpu 아키텍쳐 타입, 저장공간 등의 정보를 가지고 있다.

    b. AMI를 통하여 EC2 인스턴스를 복제 또는 다른 리전으로 전달 할 수 있다.

    c. AMI는 EBS기반과 Instance Storage 기반 두가지 타입으로 나누어 진다.

    d. AMI는 사용 권한 정보를 가지고 있다. 

    e. EBS 기반 AMI는 루트 볼륨에 대한 템플릿이 있어야 한다.

 

정답 : e

해설 : EBS 기반 AMI는 한개 이상의 EBS snapshot이 있어야 합니다.

+ Recent posts