클라우드활용 6주차 — S3 정적 웹 호스팅 & VPC 네트워킹
S3 버킷으로 서버 없이 정적 웹사이트를 띄우고, 10.0.0.0/16 VPC에 퍼블릭/프라이빗 서브넷·IGW·라우팅을 구성해 본 6주차 기록.
6주차는 객체 스토리지 Amazon S3(정적 웹 호스팅 포함)와 가상 네트워크 VPC(서브넷·인터넷 게이트웨이·라우팅)를 다룬다. 두 실습 모두 AWS CLI로 진행했고, 만든 자원은 끝에서 모두 삭제했다.
핵심 개념
S3 (Simple Storage Service)
- 객체 스토리지: 파일을 객체 로, 버킷(전역 고유 이름)에 저장. 무제한 확장·고내구성.
- 정적 웹 호스팅: 버킷에 HTML을 올리고 website 설정을 켜면, EC2 같은 서버 없이 버킷이 웹사이트 엔드포인트 로 서빙한다.
- 퍼블릭 액세스 & 버킷 정책: 기본은 모든 퍼블릭 접근 차단. 공개 웹사이트로 쓰려면 퍼블릭 차단 해제 + 버킷 정책(
s3:GetObject공개 허용) 이 필요하다.
VPC (Virtual Private Cloud)
- VPC: 내 전용 가상 네트워크. CIDR(예:
10.0.0.0/16)로 IP 대역을 정의한다. - 서브넷(Subnet): VPC를 더 작은 대역으로 쪼갠 것. 퍼블릭 서브넷(IGW로 외부 통신) / 프라이빗 서브넷(외부 직접 노출 X).
- 인터넷 게이트웨이(IGW): VPC ↔ 인터넷 연결 통로.
- 라우팅 테이블: 트래픽 경로 규칙. 퍼블릭 서브넷은
0.0.0.0/0 → IGW라우트를 가진다.
S3 정적 웹 호스팅
버킷 생성 + 콘텐츠 업로드
1
2
3
4
5
6
$ aws s3api create-bucket --bucket clouduse-week6-demo \
--region ap-northeast-2 --create-bucket-configuration LocationConstraint=ap-northeast-2
http://clouduse-week6-demo.s3.amazonaws.com/
$ aws s3 cp index.html s3://clouduse-week6-demo/index.html
$ aws s3 cp error.html s3://clouduse-week6-demo/error.html
정적 웹 호스팅 활성화 + 공개 정책
1
2
3
4
5
6
7
8
$ aws s3 website s3://clouduse-week6-demo/ \
--index-document index.html --error-document error.html
$ aws s3api put-public-access-block --bucket clouduse-week6-demo \
--public-access-block-configuration \
BlockPublicAcls=false,IgnorePublicAcls=false,BlockPublicPolicy=false,RestrictPublicBuckets=false
$ aws s3api put-bucket-policy --bucket clouduse-week6-demo --policy file://bucket-policy.json
적용한 버킷 정책 — 객체 읽기만 공개:
1
2
3
{ "Version": "2012-10-17", "Statement": [{
"Sid": "PublicReadGetObject", "Effect": "Allow", "Principal": "*",
"Action": "s3:GetObject", "Resource": "arn:aws:s3:::clouduse-week6-demo/*" }] }
웹사이트 엔드포인트 접속 확인
1
2
3
4
5
$ curl -s -o /dev/null -w "%{http_code}\n" \
http://clouduse-week6-demo.s3-website.ap-northeast-2.amazonaws.com
200
$ curl -s http://clouduse-week6-demo.s3-website.ap-northeast-2.amazonaws.com | grep -E "h1"
클라우드활용 6주차 — S3 정적 웹 호스팅
브라우저로 S3 웹사이트 엔드포인트에 접속하면, 서버 없이 버킷이 직접 서빙하는 페이지가 표시된다.
*.s3-website.ap-northeast-2.amazonaws.com 엔드포인트 — EC2 없이 S3만으로 서빙.
VPC 네트워킹
VPC + 퍼블릭/프라이빗 서브넷
1
2
3
4
5
6
7
8
$ aws ec2 create-vpc --cidr-block 10.0.0.0/16 \
--tag-specifications 'ResourceType=vpc,Tags=[{Key=Name,Value=clouduse-MyVPC}]'
vpc-0cca13772ac5b8df4
$ aws ec2 create-subnet --vpc-id vpc-0cca... --cidr-block 10.0.1.0/24 --availability-zone ap-northeast-2a # public
subnet-0b0912036b9e6bbcb
$ aws ec2 create-subnet --vpc-id vpc-0cca... --cidr-block 10.0.2.0/24 --availability-zone ap-northeast-2c # private
subnet-05a2b71f68f86fe63
인터넷 게이트웨이 + 라우팅
1
2
3
4
5
6
7
8
$ aws ec2 create-internet-gateway ... → igw-02088ebad670c3280
$ aws ec2 attach-internet-gateway --internet-gateway-id igw-0208... --vpc-id vpc-0cca...
$ aws ec2 create-route-table --vpc-id vpc-0cca... → rtb-0f54306f325eb1e59
$ aws ec2 create-route --route-table-id rtb-0f54... --destination-cidr-block 0.0.0.0/0 --gateway-id igw-0208...
True
$ aws ec2 associate-route-table --route-table-id rtb-0f54... --subnet-id subnet-0b09... # 퍼블릭 서브넷 연결
$ aws ec2 modify-subnet-attribute --subnet-id subnet-0b09... --map-public-ip-on-launch # 퍼블릭 IP 자동할당
구성 확인
1
2
3
4
5
6
7
8
9
$ aws ec2 describe-subnets --filters Name=vpc-id,Values=vpc-0cca... \
--query "Subnets[].[Tags[0].Value,CidrBlock,AvailabilityZone,MapPublicIpOnLaunch]" --output text
clouduse-private-2c 10.0.2.0/24 ap-northeast-2c False # 프라이빗: 퍼블릭IP 미할당
clouduse-public-2a 10.0.1.0/24 ap-northeast-2a True # 퍼블릭: 퍼블릭IP 자동할당
$ aws ec2 describe-route-tables --route-table-ids rtb-0f54... \
--query "RouteTables[0].Routes[].[DestinationCidrBlock,GatewayId]" --output text
10.0.0.0/16 local # VPC 내부 통신
0.0.0.0/0 igw-02088ebad670c3280 # 외부 통신 → IGW (퍼블릭 서브넷의 핵심)
퍼블릭 서브넷만 0.0.0.0/0 → IGW 라우트 + 퍼블릭 IP 자동할당을 갖는다. 이 차이가 “퍼블릭 vs 프라이빗”의 본질이다.
정리 (자원 삭제)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# S3
$ aws s3 rm s3://clouduse-week6-demo --recursive → index.html, error.html 삭제
$ aws s3api delete-bucket --bucket clouduse-week6-demo
$ aws s3api head-bucket --bucket clouduse-week6-demo 2>&1 | grep -o "Not Found"
Not Found
# VPC (생성 역순: 서브넷 → IGW 분리/삭제 → 라우팅테이블 → VPC)
$ aws ec2 delete-subnet --subnet-id subnet-0b09... ; aws ec2 delete-subnet --subnet-id subnet-05a2...
$ aws ec2 detach-internet-gateway --internet-gateway-id igw-0208... --vpc-id vpc-0cca...
$ aws ec2 delete-internet-gateway --internet-gateway-id igw-0208...
$ aws ec2 delete-route-table --route-table-id rtb-0f54...
$ aws ec2 delete-vpc --vpc-id vpc-0cca...
$ aws ec2 describe-vpcs --vpc-ids vpc-0cca... 2>&1 | grep -o "InvalidVpcID.NotFound"
InvalidVpcID.NotFound # VPC 삭제 확인
정리
S3 정적 웹 호스팅으로 EC2 없이도 웹사이트를 띄울 수 있다. 콘텐츠가 정적이면 S3가 EC2 웹서버보다 단순하고 저렴하다는 트레이드오프가 분명하다. 버킷을 공개하려면 퍼블릭 차단 해제 + 버킷 정책 이 둘 다 필요한데, AWS가 기본을 “전부 차단”으로 두는 이유는 실수로 데이터가 공개되는 사고를 막기 위해서다. VPC는 보안 그룹이 “인스턴스 방화벽”이라면 그 한 단계 위의 네트워크 설계 이고, 퍼블릭/프라이빗을 가르는 것은 결국 라우팅 테이블에 IGW 경로가 있느냐였다. 정리할 때 VPC는 의존성(서브넷·IGW·라우팅테이블)을 먼저 제거해야 삭제된다.