실습 요약

┌─────────────────────────────────────────────────────────────────┐
│                         EC2 실습 흐름                            │
└─────────────────────────────────────────────────────────────────┘
  EC2 인스턴스 생성 (Amazon Linux 2023, t3.micro)
         ↓
  SSH 키 페어 생성 (TEST_KEY.pem)
         ↓
  보안 그룹 설정 (SSH:22, HTTP:80, HTTPS:443, 내 IP만 허용)
         ↓
  SSH 접속 (키 권한 수정: icacls)
         ↓
  nginx 설치 및 실행 (yum install nginx)
         ↓
  공인 IP로 웹 접속 확인

┌─────────────────────────────────────────────────────────────────┐
│                         ECS 실습 흐름                            │
└─────────────────────────────────────────────────────────────────┘
  ECR 프라이빗 레포 생성 (Mutable 태그, AES-256 암호화)
         ↓
  ECS 클러스터 생성 (Fargate 전용)
         ↓
  태스크 정의 생성 (my-web-task, Fargate)
         ↓
  컨테이너 설정 (web-container, nginx:latest, 포트 80)
         ↓
  서비스 생성 (복제본 1개, 가용 영역 리밸런싱)
         ↓
  네트워킹 구성 (VPC, Public Subnet, 보안그룹 HTTP:80)
         ↓
  공인 IP로 웹 접속 확인

| 실습후 모든 리소스는 삭제했습니다.

AWS EC2 올리고 SSH 접속 및 배포

  1. EC2에서 인스턴스 생성을 한다.
    90_Images/06_EC2_인스턴스생성.png422
    TEST인스턴스를 생성합니다.
    Image는 프리티어에서 사용가능한 Linux 2023 kernel-6.1 로 해줍니다.
    90_Images/07_EC2_인스턴스유형선택.png554
    인스턴스 유형도 t3.micro로 제일 작은 걸로 골라줍니다.
    SSH 접속을 하기 위해 키 페어 로그인을 선택했습니다.

| 여기서 잠깐, 인스턴스와 Image의 차이는 무엇인가?

| 여기서 잠깐, SSH접속을 위해 키 페어 방식을 선택했는가?

90_Images/08_방화벽_SSH_트래픽허용.png495
방화벽에서 SSH 트래픽 허용, HTTPS,HTTP 트래픽 허용
IP/32를 통해 제 IP에서만 SSH 접속할 수 있도록 했습니다.
90_Images/09_인바운드_아웃바운드_규칙.png542
자세하 인바운드, 아웃바운드 규칙은 다음과 같습니다.

  1. EC2 접속 및 nginx 실행
    ssh -i "내키페어.pem" ec2-user@<인스턴스-공인-IP> 접속

| 트러블 슈팅: pem키 권한이 낮아 로그인이 안 됨

Permissions for 'TEST_KEY.pem' are too open.
It is required that your private key files are NOT accessible by others.
This private key will be ignored.
Load key "TEST_KEY.pem": bad permissions

다른 사용자가 접근할 수 없도록 수정합니다.

# 1. 상속된 권한 제거
icacls.exe "TEST_KEY.pem" /inheritance:r
# 2. 현재 사용자에게만 읽기 권한 부여
icacls.exe "TEST_KEY.pem" /grant:r "$($env:USERNAME):(R)"

| nginx 설치 및 실행

# 패키지 업데이트 및 Nginx 설치:
sudo yum update -y
sudo yum install nginx -y
echo '<h1>helloooooooo world!</h1>' | sudo tee /usr/share/nginx/html/index.html
# Nginx 실행 및 부팅 시 자동 시작 설정:
sudo systemctl start nginx
sudo systemctl enable nginx

| 트러불 슈팅: '<h1>helloooooooo world!</h1>'
처음 " 로 했다가 -bash: !: event not found 로 인식하여 ' 로 변경함

  1. 공인 IP 접속
    90_Images/10_공인IP_접속화면.png542
    해당 IP로 접속하여 웹 페이지를 확인해줍니다.

sudo systemctl stop nginx 다 하면 멈추어 줍니다.

ECS

Elastic Container Service
| ECS란 무엇인가?
컨테이너(Docker)를 실행해주는 서비스
ECR는 빌드된 이미지를 올려두는 창고로 ECS는 ECR에서 이미지를 Pull해 서버에서 구동한다.

| 잠깐 개념 정리

┌──────────────────────────────────────────────────────────────────┐
│                            AWS Cloud                             │
└──────────────────────────────────────────────────────────────────┘

┌──────────────────────────────────────────────────────────────────┐
│ ECR (Elastic Container Registry)                                 │
│ ┌──────────────────────────────────────────────────────────────┐ │
│ │ Repository: my-app                                           │ │
│ │   - my-app:v1.0.0   (2024-03-20)                             │ │
│ │   - my-app:v1.0.1   (2024-03-21)                             │ │
│ │   - my-app:latest   (2024-03-27)                             │ │
│ └──────────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────────┘
                              │
                              │ docker pull
                              ▼
┌──────────────────────────────────────────────────────────────────┐
│ ECS (Elastic Container Service)                                  │
│                                                                   │
│ ┌────────────────────────────────────────────────────────────┐   │
│ │ Cluster: production-cluster                                │   │
│ │                                                            │   │
│ │ ┌────────────────────────────────────────────────────────┐ │   │
│ │ │ Service: web-service (Desired: 3, Running: 3)         │ │   │
│ │ │                                                        │ │   │
│ │ │  ┌──────────┐  ┌──────────┐  ┌──────────┐            │ │   │
│ │ │  │ Task #1  │  │ Task #2  │  │ Task #3  │            │ │   │
│ │ │  ├──────────┤  ├──────────┤  ├──────────┤            │ │   │
│ │ │  │Container │  │Container │  │Container │            │ │   │
│ │ │  │nginx:v1  │  │nginx:v1  │  │nginx:v1  │            │ │   │
│ │ │  │Port: 80  │  │Port: 80  │  │Port: 80  │            │ │   │
│ │ │  └──────────┘  └──────────┘  └──────────┘            │ │   │
│ │ └────────────────────────────────────────────────────────┘ │   │
│ └────────────────────────────────────────────────────────────┘   │
└──────────────────────────────────────────────────────────────────┘
                              │
                              │ runs on
                              ▼
┌──────────────────────────────────────────────────────────────────┐
│ Infrastructure Layer                                              │
│                                                                   │
│ ┌────────────────────────┐         ┌────────────────────────┐    │
│ │   AWS Fargate          │   OR    │   EC2 Instances        │    │
│ │   (Serverless)         │         │   (Self-managed)       │    │
│ │ - 자동 리소스 할당      │         │ - t3.medium x 3        │    │
│ │ - Task별 격리           │         │ - Auto Scaling Group   │    │
│ │ - 초 단위 과금          │         │ - ECS Agent 설치 필요  │    │
│ └────────────────────────┘         └────────────────────────┘    │
└──────────────────────────────────────────────────────────────────┘

[계층 구조]
ECR Repository (이미지 저장소)
    └── Docker Image (버전별 이미지)

ECS Cluster (논리적 컨테이너 그룹)
    └── ECS Service (Task 관리 및 오케스트레이션)
        └── Task (실행 단위, Task Definition 기반)
            └── Container (실제 실행되는 컨테이너)

Infrastructure (물리 리소스)
    ├── Fargate (서버리스)
    └── EC2 (인스턴스 기반)
  1. ECR에서 프라이빗 레포를 생성합니다.
    90_Images/11_ECR_프라이빗_레포생성.png454

90_Images/12_ECR_레포이름_태그설정.png488
레포 이름은 원하는 대로 설정하고, 이미지 태그는 Mutable로 합니다.
| Mutable은 무엇인가

90_Images/13_ECR_암호화설정.png527
암호화 설정
- AES-256: AWS가 관리하는 암호화 키로 저장 데이터 암호화
- ECR이 자동으로 S3에 저장되는 이미지 레이어를 AES-256으로 암호화

  1. 클러스터 생성
    90_Images/14_ECS_클러스터생성.png434
    클러스터를 생성합니다. 인프라는 Fargate 전용으로 선택했습니다.
    | Fargate란 무엇인가?
  1. 태스크 정의 생성
    90_Images/15_태스크정의_인프라요구사항.png475
    인프라 요구사항은 AWS Fargate로 합니다.
    | AWS Fargate가 뭐지?
  1. 컨테이너 생성
    90_Images/16_컨테이너생성_nginx.png498
    web-container라는 이름으로 nginx:latest를 이미지로
    80포트를 통해 Host와 연결해줍니다.
    | 추가 설명
    클라이언트 → 서버 HTTP 요청: [Ethernet Header] [IP Header: src=client, dst=server] [TCP Header: src_port=random, dst_port=80, flags=SYN] ← 여기까지만 커널이 처리 [HTTP Request: GET / HTTP/1.1] ← nginx가 파싱

  2. 서비스 생성
    90_Images/17_서비스생성.png515
    my-web-task라는 이름의 서비스를 생성한다.

90_Images/18_서비스_배포구성.png436

90_Images/19_네트워킹구성.png521
네트워킹 구성


     [ INTERNET (외부 세상) ]
            |
            v (1. Internet Gateway: 대문)
    +------------------------------------------+
    | [ 2. VPC (우리 집 땅) ]                   |
    |                                          |
    |  +------------------------------------+  |
 |  | [ 3. Public Subnet (거실) ]         |  |
    |  |                                    |  |
    |  |   +--------------------------+     |  |
    |  |   | [ 4. Security Group ]    |     |  |
    |  |   |  (보안 요원: 80번 통과!)  |     |  |
    |  |   |     +--------------+     |     |  |
    |  |   |     |  ECS Task    |     |     |  |
    |  |   |     | (공인 IP 부여) |     |     |  |
    |  |   |     +--------------+     |     |  |
    |  |   +--------------------------+     |  |
    |  +------------------------------------+  |
    |                                          |
    +------------------------------------------+

90_Images/20_보안그룹생성.png438
HTTP 80으로 내 IP만 가능하도록 보안그룹 생성

90_Images/21_접속완료.png
접속 완료