새소식

TIL

[TIL] 230627 <AWS> EC2, ELB

  • -

 

클라우드 서비스의 종류

  • IaaS (Infrastructure as a Service): 하드웨어 인프라를 인터넷을 통해 제공하는 서비스
      - 가상화된 하드웨어, 스토리지, 네트워크, 운영체제 등을 제공하며, 사용자는 이를 이용해 자신의 애플리케이션을 실행
      - AWS EC2, Microsoft Azure, Google Compute Engine 등이 IaaS 서비스를 제공
  • PaaS (Platform as a Service) : 애플리케이션을 개발, 실행, 관리하기 위한 플랫폼을 인터넷을 통해 제공하는 서비스
      - IaaS에서 제공하는 하드웨어 인프라와 미들웨어를 이용하여, 애플리케이션 개발, 배포, 운영 등에 필요한 환경을 제공
      - AWS Elastic Beanstalk, Heroku, Google App Engine 등이 PaaS 서비스를 제공
  • SaaS (Software as a Service): 사용자에게 완전한 애플리케이션을 제공하며, 이 애플리케이션은 클라우드 제공업체의 서버에서 실행됨
      - 사용자는 애플리케이션에 대한 제한된 제어권을 가지며, 클라우드 제공업체가 모든 인프라, 운영 체제, 백엔드 애플리케이션 및 데이터 관리를 담당
      - 대부분의 사용자에게 필요한 소프트웨어 서비스를 제공
      - 구글 드라이브, 마이크로소프트 오피스 365, Salesforce 등이 SaaS 서비스의 예

 

 

  • AWS EC2 (Elastic Compute Cloud)는 클라우드 컴퓨팅 서비스 중 하나로, 가상 서버 인스턴스를 제공
  • EC2를 사용하면 필요한 시간만큼 가상 서버를 생성하고 사용할 수 있으며, 필요에 따라 스케일 업 또는 스케일 다운 가능
  • 이 환경은 실제로는 하드웨어 리소스를 가상화하여 사용하고 있기 때문에, 하드웨어 상에서 실행 중인 물리적인 서버와는 다름
    ㄴ 가상화된 컴퓨터 환경 :  "인스턴스(instance)" 
    • 각 인스턴스는 독립적으로 실행되고 관리되며, 필요에 따라 생성, 시작, 중지, 종료 등이 가능
    • EC2 인스턴스는 다양한 운영 체제 (예: Linux, Windows)와 인스턴스 유형 (예: 범용, 컴퓨팅 최적화, 메모리 최적화)을 지원
  • EC2는 유연하게 스케일링할 수 있으며, 필요에 따라 인스턴스를 추가하거나 제거하여 자원 사용량을 조절가능
  • AWS의 다른 서비스와 통합하여 다양한 용도로 사용가능

[ EC2 주요 사용 사례 ]

  • 웹 애플리케이션 호스팅
  • 데이터베이스 호스팅
  • 컴퓨팅 작업 (예: 데이터 분석, 머신 러닝)
  • 애플리케이션 테스트 및 개발

 

 

EC2의 다양한 옵션들

  1. 인스턴스 유형 (Instance Types) → 서버에 할당되는 CPU, 메모리, 스토리지 및 네트워크 리소스와 같은 기본 성능 특성을 결정
    ㄴ 일부 인스턴스 유형은 컴퓨팅 작업에 적합하고, 다른 유형은 메모리 집약적인 작업에 적합
  2. 운영 체제 (Operating System) → Amazon Linux, Ubuntu, Windows 등
  3. 스토리지 옵션 (Storage Options) 인스턴스 스토어, Amazon EBS 및 Amazon S3 등
  4. 보안 그룹 (Security Groups) - 인바운드 및 아웃바운드 트래픽을 제어하는 방화벽 규칙
    → 각 보안 그룹은 포트 범위, 프로토콜 및 허용되는 IP 주소 범위를 정의 가능
  5. 키 페어 (Key Pair) - EC2 인스턴스에 대한 SSH 액세스를 허용
    → 키 페어를 만들면 EC2 인스턴스를 시작할 때 키 페어를 선택 가능
  6. 탄력적 IP 주소 (Elastic IP Address) - EC2 인스턴스에 고정 IP 주소를 할당
    → EC2 인스턴스를 중지하거나 시작할 때마다 IP 주소가 변경되는 것을 방지
  7. 사용 가능한 영역 (Availability Zones) - EC2 인스턴스는 여러 가용 영역에서 실행가능
    → 장애 대응 및 고가용성을 위해 중요

 

 

운영체제 - ubuntu
키페어
보안 그룹
Public IPv4 주소로 접속 시 방화벽으로 인해 접근 불가하기 때문에 설정 필요

인스턴스 띄워보기

sudo apt-get update
sudo apt-get install nginx
sudo systemctl start nginx
sudo systemctl status nginx  //active 상태인 것 확인

 

 

 

고정 IP 할당해주기

Elastic IPs 선택

 

 

인스턴스 타입

 

컴퓨팅 - Amazon EC2 인스턴스 유형 - AWS

 

aws.amazon.com

 

 

보안 규칙을 위한 Security Group과 Ports

보안규칙

  • 여러 인스턴스에 할당 가능
  • time out → 보안규칙 이슈
  • connection refuse → ec2 내부 이슈
  • 모든 inbound는 디폴트로 막혀있음!
  • 모든 outbound는 디폴트로 열려있음

포트

  • 22 = ssh(secure shell)로 인스턴스에 원격 접속
  • 21 = FTP 파일전송 프로토콜
  • 80 = http 웹 접속
  • 443 = https 안전한 http 접속, 현재의 스탠다드

 

 

SSH 연결

chmod : 파일이나 디렉토리의 권한을 변경하는 유닉스 명령어
ㄴ 파일이나 디렉토리는 소유자, 그룹, 그리고 나머지 세 개의 사용자 카테고리 가짐
ㄴ 각 카테고리에 대해 읽기(read), 쓰기(write), 실행(execute)의 권한을 설정가능

▶ chmod [권한](소유자,그룹,나머지) [파일명]

  • chmod 400 : 해당 파일에 대해 소유자에게 읽기 권한만 부여됨
    ㄴ 다른 사용자들은 읽기 및 쓰기 권한X
    ㄴ 일반적으로 중요한 정보를 포함하는 파일이나 개인 키 파일과 같은 보안 파일에 적용
  • chmod 644
    • 소유자: 읽기와 쓰기 권한
    • 그룹: 읽기 권한
    • 나머지: 읽기 권한

 

▶ ssh -i [키 파일] [원격서버의 사용자명]@[원격서버의 공용 IP 주소]

  • ssh: SSH 클라이언트를 호출하는 명령어
    • SSH는 네트워크를 통해 다른 컴퓨터에 안전하게 로그인하고 명령을 실행할 수 있게 해주는 프로토콜
  • -i newkeypair.pem: SSH 키 파일을 지정하는 옵션
    • newkeypair.pem은 개인 키 파일로, 이는 원격 서버의 사용자 인증에 사용됨
    • PEM(Privacy-Enhanced Mail) 형식의 키 파일은 보통 AWS나 다른 클라우드 서비스 제공자에서 인스턴스에 접근하기 위해 사용됨
  • ubuntu@[public IPv4주소]: 원격 서버의 사용자명과 IP 주소
    • ubuntu: 원격 서버의 사용자명
    • [public IPv4주소]: 원격 서버의 공용 IP 주소. 이 주소를 통해 인터넷을 통해 해당 서버에 접속가능.

→ newkeypair.pem 키 파일을 사용하여 ubuntu 사용자로 지정된 원격 서버(공용 IP 주소가 [public IPv4주소]인 서버)에 SSH를 통해 접속!
 원격 서버의 터미널로 연결되어 명령을 입력할 수 있는 상태가 됨

 

패키지 내에 생성한 키페어의 파일을 넣고 해당 파일의 권한을 400으로 변경
ubuntu@ip-[private IPv4 주소]라고 뜨며 원격 서버의 터미널로 연결되어 명령 입력 가능해짐

 

 

 

EBS

  • Amazon Elastic Block Store (EBS)는 Amazon EC2 인스턴스에 연결할 수 있는 블록 수준 스토리지 볼륨
  • 네트워크를 통해 Amazon EC2 인스턴스에 연결되므로 데이터 지속성, 스냅샷 백업 및 다른 인스턴스에서 쉽게 사용가능
  • 데이터의 지속성을 보장하기 위해 AWS 내에서 복제 및 백업되므로 안정적이고 내결함성이 높은 스토리지 옵션

 

  • 인스턴스를 terminate 한 후에도 데이터를 유지가능!
  • 특정 AZ에 한정됨
  • 인스턴스의 usb 메모리라고 생각할 수 있음
  • 하나의 인스턴스에서 떼어서 다른 인스턴스에 꽂을 수 있음
  • 하나의 EBS는 하나의 인스턴스에만 연결될 수 있지만 하나의 인스턴스에는 여러개의 EBS가 연결될 수 있음
  • EBS Snapshot

 

볼륨 생성 후 연결

 

 

EBS snapshot

  • EBS(Elastic Block Store) 스냅샷(Snapshot)은 EBS 볼륨의 데이터를 백업하는 데 사용되는 기능
  • EBS 볼륨의 데이터를 인스턴스 내에서 복제하고, 이를 S3에 저장
  • 스냅샷은 EBS 볼륨의 모든 데이터를 포함하므로, 데이터를 백업하고 나중에 이전 상태로 복원 가능
  • 스냅샷은 필요에 따라 자동으로 스케줄링할 수 있으며, 각 스냅샷은 다른 스냅샷과 차이점만 저장됨
  • 따라서 이전 스냅샷에 비해 적은 양의 스토리지 공간이 필요
  • 스냅샷은 EBS 볼륨의 상태를 복원할 때 사용되며, 이전 상태로 데이터를 복원하면 해당 스냅샷을 기반으로 새로운 EBS 볼륨이 생성됨

[ EBS 스냅샷의 용도 ]

  • 데이터 백업 및 복원: 스냅샷을 사용하면 EBS 볼륨의 데이터를 백업하고 나중에 이전 상태로 복원가능
  • 볼륨 확장: 스냅샷을 사용하여 EBS 볼륨의 크기를 확장가능.
                    스냅샷에서 새로운 볼륨을 생성하고, 기존 볼륨에서 새로 생성한 볼륨으로 데이터를 복사가능.
  • 데이터 마이그레이션: 스냅샷을 사용하여 EBS 볼륨의 데이터를 다른 지역으로 이동가능.


볼륨을 지워도 저장된 스냅샷에서 다시 볼륨 생성 가능

 

스냅샷 복사 시 다른 지역으로 이전도 가능

 

 

AMI

  • EC2 인스턴스를 생성할 때 사용되며 운영 체제와 애플리케이션, 라이브러리 등이 포함되어 있음
  • 이러한 이미지를 사용하면 개발자는 이미 구성된 환경을 더 쉽게 설정가능
  • AMI는 Amazon에서 제공하는 것뿐만 아니라 개발자가 직접 생성할 수도 있음
  • 개발자는 자신이 구성한 인스턴스를 이미지로 만들어서 사용할 수 있으며, 이를 다른 사람과 공유할 수도 있음

 

EBS와 AMI의 차이

  • Amazon EBS는 EC2 인스턴스에서 사용되는 스토리지 볼륨
    • 이 볼륨은 인스턴스에 연결되어 인스턴스에 데이터를 저장하고 보존하는 데 사용됨
    • EBS는 인스턴스를 종료해도 볼륨에 저장된 데이터를 보존
  • 반면, Amazon Machine Image (AMI)는 EC2 인스턴스를 시작할 때 사용되는 이미지
    • AMI는 이미 설치된 운영 체제와 애플리케이션을 포함하여 인스턴스를 구성하는 데 필요한 모든 정보를 포함
    • 이를 통해 AMI를 사용하여 손쉽게 EC2 인스턴스를 시작하고, 중지하고, 삭제하고, 복제하고, 복원가능

▶ AMI는 EBS 스냅샷을 사용하여 생성될 수 있음

- EBS 스냅샷은 EBS 볼륨의 이미지
- AMI를 생성할 때 EBS 스냅샷을 사용하면 인스턴스를 시작할 때 EBS 볼륨이 생성되고, 해당 볼륨에는 이전 인스턴스와 동일한 데이터가 저장됨

사용자 이름이 리눅스의 디폴드값인 root로 되어있는데 ubuntu 사용할거니 ubuntu로 이름 변경
그대로 백업해서 똑같은 인스턴스 만들어짐

 

 


 

 

Scalability vs Availability

Scalability와 Availability는 모두 분산 시스템에서 중요한 개념이지만 서로 다른 개념!

  • Scalability는 시스템이 커지거나 작아질 수 있는 능력
    • 이는 사용자 수, 데이터 양, 처리량 등이 증가할 때 시스템의 성능과 처리 능력을 유지하거나 향상시키는 것
    • 이를 위해서는 확장성 있는 시스템 디자인과 구현이 필요
  • 반면 Availability는 시스템이 정상적으로 작동하고 사용 가능한 상태를 유지하는 능력
    • 즉, 사용자가 요청하는 서비스를 항상 이용 가능한 상태로 유지하는 것
    • 이를 위해서는 시스템의 안정성을 높이고 장애 대응 능력을 강화하는 것이 중요

 

로드 밸런서를 쓰는 이유

  • 요청 분산 (EC2와 연동)
  • 단일 액세스 포인트 공개 (Route 53과 연동)
  • 인스턴스에 대한 헬스 체크
  • HTTPS 제공 (ACM과 연동)
  • 고가용성 제공
  • 공개 트래픽과 내부 트래픽 분리

 

 

ELB

Elastic Load Balancer는 AWS에서 제공하는 로드 밸런싱 서비스로, 다수의 EC2 인스턴스를 사용하여 트래픽을 분산시킴.
고가용성과 확장성을 제공하므로, 인스턴스의 장애와 부하 분산에 대한 대응을 용이하게 해줌

[ ELB 유형과 특징 ]

  1. Application Load Balancer
    : OSI 모델 7계층에서 동작하며, HTTP/HTTPS 트래픽을 처리
      컨테이너화된 애플리케이션과 연동하여 사용가능
      URL 경로 라우팅, 호스트 기반 라우팅 등 다양한 라우팅 정책을 제공
    - HTTP 요청을 여러 타깃 그룹에 나눠줄 수 있음
    - 한 머신 안이라도 여러 어플리케이션(컨테이너)에 나눠줄 수 있음
    - HTTP/2와 웹소켓을 지원
    - HTTPS로 리다이렉트 지원
    - URL, hostname, query string, header에 기반해서 다른 타깃 그룹으로 보낼 수 있음

  2. Network Load Balancer
    : OSI 모델 4계층에서 동작하며, TCP/UDP 트래픽을 처리
      높은 처리량을 필요로 하는 애플리케이션에 적합
  3. Gateway Load Balancer
  4. Classic Load Balancer
    : OSI 모델 4~7계층에서 동작하며, HTTP/HTTPS, TCP/UDP 트래픽을 처리
      가장 오래된 형태의 로드 밸런서이며, 대부분의 경우 Application Load Balancer나 Network Load Balancer를 사용하는 것이 좋음

 

Application Loadbalancer (ALB) 사용해보기

고급 세부 정보 - 사용자 데이터 내용 작성, 인스턴스 개수 - 2

#!/bin/bash
apt-get update  //패키지 가져옴
apt-get install -y nginx  //nginx 설치
cat <<EOF > /var/www/html/index.html  //여기에 아래의 내용들 작성함
<!DOCTYPE html>
<html>
<head>
<title>Welcome to Nginx</title>
</head>
<body>
<h1>Hello World!</h1>
<p>AWS deployed by Me!</p>
<p>private ip is $(hostname -f)</p>
</body>
</html>
EOF
sudo systemctl start nginx  //nginx 시작

 

→ 완료 후 myloadbalancer의 DNS 통해 접속 시 새로고침 시마다 myinstance1과 myinstance2의 private IPv4 주소가 번갈아 나오는 것을 볼 수 있음! (정상 동작!)

myinstance1을 중단시키고 다시 실행시 myinstance2의 private IPv4 주소만 나오게 됨!

 

대상 그룹에서 현재 상태 확인 가능 (healthy/unused)

 

로드밸런서에게만 ec2를 공개하도록 하기 위해 새로운 보안 그룹 생성
인바운드 규칙 - 소스에서 보안 그룹 중 위에서 생성한 loadbalancersecurity를 선택!!!

 myinstance1과 myinstance2의 주소를 통해서는 접근이 불가하고 ALB 쪽은 정상적으로 작동!!!

 

 

 

SSL과 HTTPS

SSL(Secure Sockets Layer)

  • 인터넷 상에서 정보를 안전하게 전송하기 위한 프로토콜
  • 클라이언트와 서버 사이에 안전한 접속을 만들어주며, 전송되는 데이터를 암호화하여 정보의 안전성을 보장.

TLS (Transport Layer Security)

  • SSL을 보완한 기술로 현재는 사실 SSL이 아니라 TLS 기술!
  • 그러나 모두가 아직까지 SSL이라고 부르고 있음!

▼ SSH와 SSL의 차이점?!

더보기

SSH와 SSL은 모두 보안을 위해 사용되는 프로토콜이지만, 목적과 사용 방식에서 차이 존재!

SSH (Secure Shell)
1. 목적:
   - SSH는 주로 원격 서버에 안전하게 접속하고 명령어를 실행하기 위한 프로토콜
   - 주로 시스템 관리자와 개발자가 원격 서버 관리, 파일 전송, 터널링 등의 작업을 수행할 때 사용

2. 사용 예:
   - 원격 서버 접속: `ssh user@remote_server`
   - 파일 전송: `scp file user@remote_server:/path/to/destination`
   - 포트 포워딩: `ssh -L local_port:destination_server:remote_port user@remote_server`

3. 작동 방식:
   - SSH는 클라이언트-서버 모델을 사용
   - 클라이언트가 서버에 접속할 때 인증 과정을 거쳐 암호화된 채널을 설정
   - RSA, DSA, ECDSA 등의 공개 키 암호화를 사용한 키 기반 인증을 지원

4. 포트 번호:
   - 기본적으로 TCP 포트 22를 사용



SSL (Secure Sockets Layer) / TLS (Transport Layer Security)
1. 목적:
   - SSL은 데이터 전송 중에 네트워크 상에서 데이터의 도청 및 변조를 방지하기 위한 프로토콜
   - 주로 웹사이트와 사용자 간의 안전한 통신을 보장하기 위해 사용

2. 사용 예:
   - HTTPS: 웹사이트 보안. 브라우저와 웹 서버 간의 통신을 암호화합니다. (예: `https://example.com`)
   - 이메일 보안: 이메일 클라이언트와 서버 간의 안전한 연결을 보장

3. 작동 방식:
   - SSL/TLS는 클라이언트와 서버 간의 핸드셰이크 과정을 통해 암호화된 세션을 설정
   - 대칭 키 암호화와 비대칭 키 암호화를 조합하여 데이터 전송의 기밀성과 무결성을 보장
   - 서버는 SSL/TLS 인증서를 사용하여 자신의 신원을 증명

4. 포트 번호:
   - HTTPS의 경우 기본적으로 TCP 포트 443을 사용
   - SMTP의 경우 SSL을 사용하는 포트는 465, TLS를 사용하는 포트는 587

 

ALB에 SSL 적용하기

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.