-S3: Amazon S3(Simple Storage Service)는 AWS의 객체 스토리지 서비스로, 데이터는 버킷(Bucket) 단위로 저장되고, 개별 파일은 파일 내용과 메타데이터를 합친 객체(Object) 형태로 관리된다.
S3의 내부 구조는 플랫(Flat)함
디렉토리처럼 보이는 폴더 구조를 만들 수 있지만 실제로는 계층 구조가 아니고 /doc/a/test.txt처럼 경로 전체가 객체의 이름(키)에 접두어로 붙는 방식이다. 계층 구조를 유지하는 메타데이터가 필요 없어지기 때문에 대규모 서비스에서도 효율적으로 운영 가능하다.
하나의 객체는 최대 5TB까지 저장 가능하고, 저장할 수 있는 객체 수에는 제한이 없다.
- S3 주요 특징
S3는 서버리스(Serverless) 서비스 (서버가 없다는 게 아니라 서버 관리를 AWS가 전담한다)
| 항목 | 설명 |
|---|---|
| 무제한 저장 용량 | 페타바이트(PB) 이상 대용량도 문제없이 저장 가능 |
| 높은 내구성 | 99.999999999%(11 nine's) — 3개의 AZ에 중복 저장해서 달성 |
| 다양한 접근 방식 | HTTP(S), CLI, SDK, API로 접근 가능 |
| 전 세계 리전 분산 | 글로벌 인프라 기반 데이터 저장 가능 |
| 정적 웹 호스팅 지원 | HTML/CSS/JS 파일 업로드 후 버튼 하나로 정적 웹사이트 호스팅 가능 (웹 서버 설치 불필요) |
| 자동 백업 및 복원 | 버전 관리 및 수명 주기 정책 지원 |
- S3 버킷 이름 규칙
- 글자 수: 최소 3자 ~ 최대 63자
- 사용 가능 문자: 소문자, 숫자, 점(.), 하이픈(-) — 대문자·언더바 불가
- 시작과 끝: 반드시 문자 또는 숫자로 시작하고 끝나야 함
- 점 두 개(..) 연속 사용 불가
- 같은 파티션(표준·중국·US GovCloud) 내 모든 AWS 계정에서 이름이 유일해야 함
올바른 예: docexamplebucket, log-delivery-march-2020, my-hosted-content
잘못된 예: doc_example_bucket(언더바), DocExampleBucket(대문자), doc-example-bucket-(하이픈으로 끝남)
- S3 스토리지 클래스 스토리지 클래스별로 성능과 비용이 달라진다
| 스토리지 클래스 | 주요 용도 | 특징 |
|---|---|---|
| S3 Standard | 자주 접근하는 데이터 | 고비용, 빠른 응답속도, 고가용성, 고내구성 |
| S3 Standard-IA (Infrequent Access) |
드물게 접근하는 데이터 | 낮은 저장 비용, 검색 시 비용 발생 |
| S3 Intelligent-Tiering | 접근 패턴 예측이 어려운 데이터 | 접근 빈도에 따라 Standard ↔ Standard-IA 자동 이동 |
| S3 One Zone-IA | 단일 AZ, 드물게 접근 | 비용 절감 가능, 내구성 낮음 — 온프레미스 백업본이 따로 있는 경우 활용 |
| S3 Glacier | 아카이빙 (장기 보관) | 매우 저렴, 데이터 꺼낼 때 몇 분~몇 시간 대기 |
| S3 Glacier Deep Archive | 장기 보관 (거의 접근 없음) | 최저 비용, 최소 12시간 대기 |
Intelligent-Tiering과 수명 주기 정책의 차이: Intelligent-Tiering은 "30일 이상 접근 없음"이라는 이벤트 기준으로 클래스를 이동시키고, 수명 주기 정책은 생성일 기준으로 일정 기간이 지나면 자동으로 클래스를 변경하거나 삭제함.
- S3 기타 기능 수명 주기 정책
생성일 기준으로 저장 클래스를 자동 변경함. 예를 들어 생성 후 30일이 지나면 Standard → Standard-IA로, 추가 30일 후에는 Glacier로, 365일 후 삭제하는 식으로 설정 가능함.
버전 관리
기본적으로 비활성화되어 있음. 활성화하면 같은 이름의 파일을 다시 업로드해도 이전 버전이 삭제되지 않고 버전 번호가 붙어서 보존됨. 실수로 파일이 덮어써지거나 삭제되는 것을 방지할 수 있음.
- S3 보안 설정 S3는 버킷과 객체 수준에서 권한을 제어할 수 있음. 기본적으로 퍼블릭 접근은 차단되어 있고, 권한은 사용자·역할·리소스·정책(Policy)에 따라 설정함.
| 구분 | 설명 |
|---|---|
| 버킷 정책 (Bucket Policy) | 버킷 전체에 적용되는 JSON 기반 권한 제어 정책 (리소스 중심 정책) |
| IAM 정책 | 사용자나 역할에 적용되는 권한 정책 (사용자 중심 정책) |
버킷 정책 기본 구조 예시 (모든 사용자에게 읽기 허용):
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicRead",
"Effect": "Allow",
"Principal": "*",
"Action": ["s3:GetObject"],
"Resource": "arn:aws:s3:::my-bucket-name/*"
}
]
}
Principal: "*"는 누구에게나, s3:GetObject는 객체 읽기 허용을 의미함. 리소스 ARN 뒤에 /*를 붙이면 버킷 내 모든 객체가 대상이 됨.
- VPC
VPC(Virtual Private Cloud)는 AWS 클라우드 안에서 사용자가 직접 정의하는 논리적 네트워크 공간
IP 주소 범위를 직접 지정할 수 있고, 퍼블릭/프라이빗 서브넷으로 나눠서 외부 인터넷 접근 여부를 제어할 수 있다.
VPC 생성 시 선택해야 할 항목: 리전, Private IP 주소 범위(CIDR 표기법), VPC 이름
- CIDR (Classless Inter-Domain Routing)
VPC의 IP 주소 범위는 CIDR 블록 형태로 지정한다. 예를 들어 10.0.0.0/16이면 앞 16비트가 네트워크 주소(고정)이고 나머지 16비트가 호스트 주소(가변)임. 즉 10.0.*.* 범위의 IP를 사용할 수 있다.
RFC 1918 규격에 따른 권장 프라이빗 IP 범위:
| RFC 1918 범위 | CIDR 블록 예시 |
|---|---|
| 10.0.0.0 – 10.255.255.255 | 10.0.0.0/16 |
| 172.16.0.0 – 172.31.255.255 | 172.31.0.0/16 |
| 192.168.0.0 – 192.168.255.255 | 192.168.0.0/20 |
- 퍼블릭 서브넷 vs 프라이빗 서브넷
서브넷은 VPC 안에서 특정 가용 영역(AZ)에 속하는 IP 주소 범위의 묶음임. 라우팅 테이블 설정에 따라 퍼블릭/프라이빗으로 구분됨.
| 구분 | 특징 | 주요 용도 |
|---|---|---|
| 퍼블릭 서브넷 | 라우팅 테이블에 인터넷 게이트웨이(IGW)가 등록되어 외부 인터넷과 통신 가능 | 웹 서버, Bastion Host 등 외부 노출이 필요한 리소스 |
| 프라이빗 서브넷 | 라우팅 테이블에 IGW 없음 — VPC 내부에서만 통신 가능 | 데이터베이스, 내부 API 서버 등 민감한 리소스 |
프라이빗 서브넷에서 아웃바운드 인터넷 접근이 필요한 경우, NAT Gateway를 퍼블릭 서브넷에 두고 라우팅 테이블에 등록하면 됨. 이렇게 하면 프라이빗 서브넷 → 외부는 가능하지만 외부 → 프라이빗 서브넷 인바운드는 차단됨
- 기본 VPC 모든 리전에는 기본 VPC(172.31.0.0/16)가 디폴트로 하나씩 존재한다
- 네트워크 ACL vs 보안 그룹 VPC 내 네트워크 보안은 네트워크 ACL과 보안 그룹으로 이중 제어
| 항목 | 보안 그룹 (Security Group) | 네트워크 ACL (NACL) |
|---|---|---|
| 적용 대상 | EC2 등 리소스(인스턴스) 단위 | 서브넷 단위 |
| 상태 | Stateful — 인바운드 허용 시 아웃바운드 자동 허용 | Stateless — 인바운드·아웃바운드 각각 별도 정의 필요 |
| 규칙 우선순위 | 전체 허용 목록 적용 | Rule 번호 오름차순으로 적용 (작을수록 우선) |
| 허용/거부 | 허용만 가능 | 허용·거부 모두 가능 |
| 일반 용도 | 리소스 보호 | 서브넷 레벨 보안 필터링 / 보조 방화벽 |
특정 IP에서 DDoS 공격이 오는 경우 — 보안 그룹은 Deny 규칙이 없기 때문에 NACL에서 해당 IP를 차단하는 게 적합
- 보안 그룹 설정 예시 웹 서버용 보안 그룹:
| 방향 | 프로토콜 | 포트 | 소스 | 설명 |
|---|---|---|---|---|
| Inbound | TCP | 80 | 0.0.0.0/0 | HTTP 트래픽 허용 |
| Inbound | TCP | 443 | 0.0.0.0/0 | HTTPS 트래픽 허용 |
| Inbound | TCP | 22 | 내 IP | SSH 접속 (관리자용) — 반드시 자신의 IP로 제한 |
| Outbound | ALL | ALL | 0.0.0.0/0 | 모든 트래픽 허용 (기본값) |
DB 서버용 보안 그룹에서는 소스를 IP가 아닌 웹 서버 보안 그룹 ID로 지정해서, 웹 서버로부터만 MySQL(3306) 접근을 허용하는 방식으로 설정
- VPC 보안 권장 사항
퍼블릭 서브넷은 반드시 보안 그룹과 NACL로 접근을 제어하고, 프라이빗 서브넷은 외부 접근을 차단한 뒤 꼭 필요한 경우에만 NAT를 통해 아웃바운드만 허용
DB, 내부 서비스, 민감한 리소스는 프라이빗 서브넷에 배치하는 것이 원칙
- 실습: S3 정적 웹사이트 호스팅
1. S3 콘솔에 접속해서 버킷을 생성함. 버킷 이름은 소문자·숫자·하이픈 조합으로 작성하고, 한글이 포함된 HTML 파일을 업로드할 경우 인코딩을 EUC-KR로 저장해야 깨지지 않는다. (그냥 영어 파일 사용했다)



2. 버킷 생성 후 index.html 파일을 업로드

3. 속성 탭 → 정적 웹사이트 호스팅 활성화 → 인덱스 문서에 index.html 입력 후 저장

4. 권한 탭 → 버킷 정책 편집 → 아래 정책 입력 후 저장. my-bucket-name은 실제 버킷 ARN으로 교체


{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicRead",
"Effect": "Allow",
"Principal": "*",
"Action": ["s3:GetObject"],
"Resource": "arn:aws:s3:::my-bucket-name/*"
}
]
}

속성 탭의 정적 웹사이트 호스팅 URL로 접속해서 업로드한 HTML 페이지가 정상 렌더링되는 것을 확인

- 실습: VPC 및 서브넷 생성

목표 아키텍처: VPC 1개(10.0.0.0/16) 안에 퍼블릭 서브넷 2개, 프라이빗 서브넷 2개
1. 자동 생성
VPC 콘솔 → VPC 생성 → VPC 등(자동 생성 옵션) 선택
이름: my-vpc / CIDR: 10.0.0.0/16 / 가용 영역 1개 / 퍼블릭 서브넷 1개 + 프라이빗 서브넷 1개 선택
서브넷 CIDR 직접 지정: 퍼블릭 10.0.0.0/20, 프라이빗 10.0.64.0/20.


2. 수동 생성
서브넷 메뉴 → 서브넷 생성 → VPC: my-vpc, AZ: 가용 영역 C, CIDR: 10.0.16.0/20


생성한 퍼블릭 서브넷의 라우팅 테이블 연결 편집 → 자동 생성된 퍼블릭 서브넷의 라우팅 테이블(IGW 포함) 선택 후 저장


private도 같은 방식으로 생성 및 연결하였다.
'COSS 교과목 > 클라우드활용' 카테고리의 다른 글
| 9주차 - AWS Well-Architected Framework (0) | 2026.06.07 |
|---|---|
| 7주차 - AWS 보안 서비스 (WAF, GuardDuty) (0) | 2026.06.07 |
| 5주차 - EC2 (0) | 2026.06.03 |
| 4주차 - IAM (0) | 2026.06.01 |
| 3주차 - AWS 비용 구조와 프리 티어 활용 (0) | 2026.05.31 |