AWS Day 5 - 0116
AWS Day 5 - 0116
목차
- S3 Static Website Hosting
- CloudFront 연동
- Lambda 함수
- API Gateway
- VPC Architecture
- VPC 생성 구성표
- EC2 생성
- Installation Scripts
S3 Static Website Hosting
아키텍처 개요
┌─────────────────────────┐
│ Internet │
└───────────┬─────────────┘
│
┌───────────┴─────────────┐
│ S3 Static Website │
│ http://<BUCKET_NAME> │
│ .s3-website- │
│ <REGION>.amazonaws.com│
└───────────┬─────────────┘
│
┌───────────┴─────────────┐
│ pista-bucket1 │
│ ├── index.html │
│ ├── error.html │
│ ├── css/ │
│ ├── js/ │
│ └── assets/ │
└─────────────────────────┘
1. 버킷 생성
| 항목 | 값 |
|---|---|
| Bucket Name | <BUCKET_NAME> |
| AWS Region | <REGION> |
| Object Ownership | ACLs disabled |
| Block Public Access | ❌ 전부 해제 (4단계에서 설정) |
2. 정적 웹 사이트 호스팅 활성화
속성(Properties) > 정적 웹 사이트 호스팅(Static website hosting)
| 항목 | 값 |
|---|---|
| 정적 웹 사이트 호스팅 | 활성화 |
| 호스팅 유형 | 정적 웹 사이트 호스팅 |
| 인덱스 문서 | index.html |
| 오류 문서 | error.html |
💡 활성화 후 엔드포인트 URL이 생성됩니다:
http://<BUCKET_NAME>.s3-website-<REGION>.amazonaws.com
3. 퍼블릭 액세스 차단 해제
권한(Permissions) > 퍼블릭 액세스 차단(Block public access)
| 설정 | 상태 |
|---|---|
| 새 ACL을 통해 부여된 퍼블릭 액세스 차단 | ❌ 해제 |
| 임의의 ACL을 통해 부여된 퍼블릭 액세스 차단 | ❌ 해제 |
| 새 퍼블릭 버킷 또는 액세스 포인트 정책을 통해 부여된 액세스 차단 | ❌ 해제 |
| 임의의 퍼블릭 버킷 또는 액세스 포인트 정책을 통해 부여된 액세스 차단 | ❌ 해제 |
⚠️ 주의: 퍼블릭 액세스 차단을 해제하면 버킷 정책에 따라 인터넷에 공개될 수 있습니다.
4. 버킷 정책 설정
권한(Permissions) > 버킷 정책(Bucket policy)
💡
<BUCKET_NAME>을 실제 버킷 이름으로 교체하세요.
5. 파일 업로드
📁 static-web/ 폴더의 파일을 버킷에 업로드
| 파일/폴더 | 용도 |
|---|---|
index.html | 메인 페이지 |
error.html | 오류 페이지 (404 등) |
css/ | 스타일시트 |
js/ | JavaScript |
assets/ | 이미지, 폰트 등 |
6. 접속 확인
# 웹 브라우저에서 접속
http://<BUCKET_NAME>.s3-website-<REGION>.amazonaws.com
S3 버킷 구성표
| 항목 | 값 |
|---|---|
| Bucket Name | <BUCKET_NAME> |
| Region | <REGION> |
| Access | Public (Static Website) |
| Website Endpoint | http://<BUCKET_NAME>.s3-website-<REGION>.amazonaws.com |
CloudFront 연동
아키텍처 개요
┌─────────────────────────┐
│ Internet │
└───────────┬─────────────┘
│
┌───────────┴─────────────┐
│ CloudFront │
│ d1h23i3ai1x32r │
│ .cloudfront.net │
└───────────┬─────────────┘
│
┌───────────┴─────────────┐
│ S3 Origin │
│ pista-bucket1 │
└─────────────────────────┘
CloudFront 배포 구성표
| 항목 | 값 |
|---|---|
| Name | pista-cloudfront1 |
| Distribution ID | E2KVUNDOPR6YAS |
| 배포 도메인 이름 | d1h23i3ai1x32r.cloudfront.net |
| ARN | arn:aws:cloudfront::824065647982:distribution/E2KVUNDOPR6YAS |
일반 설정
| 항목 | 값 |
|---|---|
| 가격 분류 | 모든 엣지 로케이션에서 사용 (최고의 성능) |
| 지원되는 HTTP 버전 | HTTP/2, HTTP/1.1, HTTP/1.0 |
| 기본 루트 객체 | index.html |
| 대체 도메인 이름 | - |
| 표준 로깅 | Off |
원본 (Origin) 설정
| 항목 | 값 |
|---|---|
| Origin Domain | <BUCKET_NAME>.s3-website-<REGION>.amazonaws.com |
| Origin Type | S3 Website Endpoint |
| Protocol | HTTP only (S3 정적 웹사이트는 HTTPS 미지원) |
💡 주의: S3 정적 웹사이트 호스팅 엔드포인트를 Origin으로 사용할 때는 "HTTP only"를 선택해야 합니다.
접속 확인
# CloudFront 도메인으로 접속 (HTTPS 지원)
https://d1h23i3ai1x32r.cloudfront.net
# S3 직접 접속 (HTTP만 지원)
http://<BUCKET_NAME>.s3-website-<REGION>.amazonaws.com
💡 CloudFront 장점:
- HTTPS 지원 (SSL/TLS 인증서 자동 적용)
- 글로벌 엣지 로케이션에서 캐싱
- 더 빠른 콘텐츠 전송
Lambda 함수
Lambda 함수 생성
| 항목 | 값 |
|---|---|
| Function Name | pista-lambda-api1 |
| Runtime | Python 3.14 |
| Architecture | x86_64 |
환경 변수 설정
Lambda > 함수 > 구성 > 환경 변수
| Key | Value |
|---|---|
USER | pista |
Lambda 함수 코드
import json, os
def lambda_handler(event, context):
username = os.environ.get("USER")
return {
'statusCode': 200,
'body': json.dumps({"username": username})
}
테스트 응답
{
"statusCode": 200,
"body": "{\"username\": \"pista\"}"
}
API Gateway
아키텍처 개요
┌─────────────────────────┐
│ Internet │
└───────────┬─────────────┘
│
┌───────────┴─────────────┐
│ API Gateway │
│ pista-api-health-1 │
└───────────┬─────────────┘
│
┌───────────────────┴───────────────────┐
│ │
▼ ▼
┌───────────────┐ ┌───────────────┐
│ / (root) │ │ /health │
│ HTTP Proxy │ │ Lambda │
│ → CloudFront │ │ → Lambda fn │
└───────────────┘ └───────────────┘
1. 트리거 추가 (API Gateway 생성)
Lambda > 함수 > 트리거 추가
| 항목 | 값 |
|---|---|
| 트리거 유형 | API Gateway |
| API | 새 API 생성 |
| API 유형 | REST API |
| API 이름 | pista-api-health-1 |
| 설명 | REST API based on Python runtime |
| API 엔드포인트 유형 | 엣지 최적화 |
| Security Policy | TLS_1_0 |
| IP 유형 | IPv4 |
2. 리소스 생성 (Root - CloudFront 프록시)
API Gateway > API > 리소스 > / (root) > 메서드 생성
| 항목 | 값 |
|---|---|
| 메서드 유형 | GET |
| 통합 유형 | HTTP |
| HTTP 프록시 통합 | ✅ ON (중요) |
| 응답 전송 모드 | 버퍼됨 |
| HTTP 메서드 | GET |
| 엔드포인트 URL | https://d1h23i3ai1x32r.cloudfront.net/ |
💡 Root 경로(/)로 접속하면 CloudFront를 통해 S3 정적 웹사이트로 프록시됩니다.
3. 리소스 생성 (/health - Lambda 연동)
API Gateway > API > 리소스 > 리소스 생성
| 항목 | 값 |
|---|---|
| 리소스 경로 | / |
| 리소스 이름 | health |
메서드 생성 (/health > GET)
| 항목 | 값 |
|---|---|
| 메서드 유형 | GET |
| 통합 유형 | Lambda 함수 |
| Lambda 프록시 통합 | ✅ ON |
| 응답 전송 모드 | 버퍼됨 |
| Lambda 함수 | pista-lambda-api1 |
4. API 배포
API Gateway > API > API 배포
| 항목 | 값 |
|---|---|
| 스테이지 | 새 스테이지 |
| 스테이지 이름 | test |
5. 접속 확인
# Root 경로 (CloudFront 프록시)
https://<API_GATEWAY_ID>.execute-api.<REGION>.amazonaws.com/test
# Health Check (Lambda)
https://<API_GATEWAY_ID>.execute-api.<REGION>.amazonaws.com/test/health
API Gateway 구성표
| 항목 | 값 |
|---|---|
| API Name | pista-api-health-1 |
| API ID | y17odzrge2 |
| 엔드포인트 유형 | Edge Optimized |
| 스테이지 | test |
VPC Architecture
VPC 생성 구성표
1. VPC 기본 설정
| 항목 | 값 |
|---|---|
| VPC Name | pista-vpc |
| VPC ID | vpc-0217f2fbe39a25c1d |
| IPv4 CIDR | 10.0.0.0/16 |
| DNS 호스트 이름 | 활성화 |
| DNS 확인 | 활성화 |
2. 서브넷 구성
퍼블릭 서브넷 (Public Subnets)
| 서브넷 ID | 서브넷 이름 | 가용 영역 | CIDR 블록 |
|---|---|---|---|
| subnet-06df70d34d815a011 | pista-subnet-public1-ap-south-1a | ap-south-1a | 10.0.0.0/20 |
| subnet-04a5e97911d5f9893 | pista-subnet-public2-ap-south-1b | ap-south-1b | 10.0.16.0/20 |
프라이빗 서브넷 (Private Subnets)
| 서브넷 ID | 서브넷 이름 | 가용 영역 | CIDR 블록 |
|---|---|---|---|
| subnet-06957dbccecbf67d5 | pista-subnet-private1-ap-south-1a | ap-south-1a | 10.0.128.0/20 |
| subnet-014c426d2ed520633 | pista-subnet-private2-ap-south-1b | ap-south-1b | 10.0.144.0/20 |
3. 인터넷 게이트웨이 (Internet Gateway)
| 항목 | 값 |
|---|---|
| IGW ID | igw-0f775bf918c698150 |
| 연결 대상 | pista-vpc (vpc-0217f2fbe39a25c1d) |
4. 라우팅 테이블 (Route Tables)
| 라우팅 테이블 ID | 연결된 서브넷 | 용도 |
|---|---|---|
| rtb-0787b468e025d9a56 | Public 서브넷 | 인터넷 연결 |
| rtb-0ad303e664c907446 | Private 서브넷 | NAT Gateway 연결 |
| rtb-0abcd9fc52cdc8641 | Private 서브넷 | NAT Gateway 연결 |
5. NAT Gateway
| 항목 | 값 |
|---|---|
| NAT Gateway ID | nat-0e81945c0b580713b |
| Elastic IP | eipalloc-00da42b2f94366036 |
| 상태 | 활성화 |
6. VPC Endpoints
| 항목 | 값 |
|---|---|
| Endpoint ID | vpce-05bd9d59a285fac92 |
| 서비스 | S3 |
| 연결된 라우팅 테이블 | Private 서브넷 라우팅 테이블 |
EC2 생성
EC2 인스턴스 구성표
| 항목 | Public EC2 | Private EC2 |
|---|---|---|
| Name | pista-ec2-public1 | pista-ec2-private1 |
| Instance ID | i-xxxxx | i-xxxxx |
| AMI | Ubuntu 24.04 LTS | Ubuntu 24.04 LTS |
| Instance Type | t2.micro | t2.micro |
| 가용 영역 | ap-south-1a | ap-south-1a |
| 서브넷 | pista-subnet-public1-ap-south-1a | pista-subnet-private1-ap-south-1a |
| 퍼블릭 IPv4 | xxx.xxx.xxx.xxx | - |
| 프라이빗 IPv4 | 10.0.x.x | 10.0.x.x |
| 보안 그룹 | pista-sg-1 | pista-sg-2 |
| Key Pair | pista-key | pista-key |