Post

클라우드활용 6주차 — S3 정적 웹 호스팅 & VPC 네트워킹

S3 버킷으로 서버 없이 정적 웹사이트를 띄우고, 10.0.0.0/16 VPC에 퍼블릭/프라이빗 서브넷·IGW·라우팅을 구성해 본 6주차 기록.

클라우드활용 6주차 — S3 정적 웹 호스팅 & VPC 네트워킹

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 버킷이 정적 웹사이트로 호스팅한 페이지 *.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·라우팅테이블)을 먼저 제거해야 삭제된다.

This post is licensed under CC BY 4.0 by the author.