- AWS
- EC2, ECS 올리고
- 프로그램 배포까지(IP 설정 자기 집으로)
- SSH 접속까지
실습 요약
┌─────────────────────────────────────────────────────────────────┐
│ 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 접속 및 배포
- EC2에서 인스턴스 생성을 한다.

TEST인스턴스를 생성합니다.
Image는 프리티어에서 사용가능한 Linux 2023 kernel-6.1 로 해줍니다.

인스턴스 유형도 t3.micro로 제일 작은 걸로 골라줍니다.
SSH 접속을 하기 위해 키 페어 로그인을 선택했습니다.
| 여기서 잠깐, 인스턴스와 Image의 차이는 무엇인가?
- AMI (Amazon Machine Image): 가상 머신을 생성하기 위한 템플릿
- OS, 애플리케이션, 설정이 패키징된 불변 스냅샷
- 여러 인스턴스를 생성할 때 동일한 AMI를 재사용 가능
- 예: Amazon Linux 2023 AMI에는 kernel-6.1이 포함된 리눅스 배포판 이미지
- Instance (EC2 인스턴스): AMI로부터 생성된 실행 중인 가상 서버
- 물리 서버의 CPU, 메모리, 네트워크, 스토리지 리소스를 할당받음
- 인스턴스 타입(t3.micro 등)에 따라 vCPU 개수, 메모리 크기 결정
| 여기서 잠깐, SSH접속을 위해 키 페어 방식을 선택했는가?
- AWS Systems Manager Session Manager를 사용하면 되지만, SSH 접속에 익숙해지고 싶어서 사용했습니다.
- https://musma.github.io/2019/11/29/about-aws-ssm.html

방화벽에서 SSH 트래픽 허용, HTTPS,HTTP 트래픽 허용
IP/32를 통해 제 IP에서만 SSH 접속할 수 있도록 했습니다.

자세하 인바운드, 아웃바운드 규칙은 다음과 같습니다.
- 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 로 인식하여 ' 로 변경함
- 공인 IP 접속

해당 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 (인스턴스 기반)
- ECR에서 프라이빗 레포를 생성합니다.


레포 이름은 원하는 대로 설정하고, 이미지 태그는 Mutable로 합니다.
| Mutable은 무엇인가
- Mutable (변경 가능): 동일한 이미지 태그로 새로운 이미지를 덮어쓸 수 있음
- 예:
latest태그로 푸시 → 다시latest태그로 새 이미지 푸시 → 기존 이미지 덮어씀 - 개발 환경에서 빠른 반복 개발 시 유용
- 프로덕션 환경에서는 이미지 무결성 보장 어려움
- 예:
- Immutable (변경 불가): 한 번 푸시한 태그는 재사용 불가
- 예:
v1.0.0푸시 후 동일 태그로 재푸시 시도 시 오류 발생 - 이미지 버전 추적 및 롤백 안정성 확보
- CI/CD 파이프라인에서 빌드 재현성 보장
- 예:

암호화 설정
- AES-256: AWS가 관리하는 암호화 키로 저장 데이터 암호화
- ECR이 자동으로 S3에 저장되는 이미지 레이어를 AES-256으로 암호화
- 클러스터 생성

클러스터를 생성합니다. 인프라는 Fargate 전용으로 선택했습니다.
| Fargate란 무엇인가?
- AWS Fargate: 서버리스 컨테이너 오케스트레이션 엔진
- 태스크 정의 생성

인프라 요구사항은 AWS Fargate로 합니다.
| AWS Fargate가 뭐지?
- 인프라 요구사항: ECS Task를 실행할 컴퓨팅 환경 선택
- AWS Fargate: 서버리스 실행 환경 (인스턴스 관리 불필요)
- Amazon EC2: EC2 인스턴스 기반 실행 (인스턴스 직접 관리 필요)
- External (ECS Anywhere): 온프레미스 또는 다른 클라우드 서버에서 실행
-
컨테이너 생성

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가 파싱 -
서비스 생성

my-web-task라는 이름의 서비스를 생성한다.


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

HTTP 80으로 내 IP만 가능하도록 보안그룹 생성

접속 완료