S3란 쉽게 설명하면, AWS에서 제공하는 클라우드 기반 파일 저장 서비스입니다.
S3(Simple Storage Service)는 이름 그대로 간단한 파일 저장 및 관리를 제공하는 AWS의 클라우드 서비스입니다. 우리가 일상적으로 사용하는 구글 드라이브, iCloud 같은 클라우드 스토리지와 비슷하게, S3는 파일(이미지, 동영상, 문서 등)을 저장하고 관리할 수 있는 공간을 제공합니다.
서비스를 개발하다 보면 이미지, 동영상, PDF 같은 파일 업로드 기능을 구현해야 하는 경우가 많습니다. 서버에 파일을 저장할 수도 있지만, 파일이 점점 많아지면 다음과 같은 문제가 발생하게 됩니다.
S3는 파일 저장과 다운로드에 최적화되어 있으며, 다음과 같은 장점이 있습니다.
업로드는 EC2가 S3에 이미지를 저장하고 해당 URL을 RDS에 기록하는 과정입니다.
사용자가 이미지를 업로드하는 과정:
사용자가 이미지 업로드 API 요청
EC2가 S3에 이미지 업로드
S3에서 이미지 URL 반환
https://mywebserver.s3.ap-northeast-2.amazonaws.com/abc.png
DB에 이미지 URL 저장
다운로드는 EC2와 RDS를 거쳐 사용자가 이미지 URL을 받아 S3에서 직접 다운로드하는 과정입니다.
S3에 저장된 이미지를 사용자에게 제공하는 과정:
사용자가 이미지 조회 API 요청
DB에 SQL 쿼리 요청
이미지 URL 응답
사용자에게 이미지 URL 응답
https://mywebserver.s3.ap-northeast-2.amazonaws.com/abc.png
사용자가 URL을 통해 이미지 다운로드
<img src="S3 URL">
태그를 사용하여 이미지를 표시할 수 있습니다.S3 - 버킷 만들기를 선택합니다.
버킷 이름을 작성합니다.
모든 퍼블릭 액세스 차단 체크를 해제합니다.
다른 설정은 기본값을 유지하고 버킷 만들기를 선택하여 생성을 완료합니다.
생성한 버킷을 선택합니다.
권한 - 버킷 정책 부분의 편집 선택
새 문 추가 선택
1. S3
를 검색하고 S3를 선택합니다.
2. GetObject
를 검색하여 체크합니다.
3. 리소스 추가를 선택합니다.
리소스 유형은 Object를 선택합니다.
리소스 ARN은 arn:aws:s3:::{내가 만든 버킷명}/*
형식으로 입력합니다.
BucketName 부분에는 생성한 S3 버킷 이름을, ObjectName 부분에는 * 을 입력합니다.
ARN이란 Amazon Resource Number의 약자로, AWS에 존재하는 리소스를 표현하는 문법입니다.
Principal 부분을 "*"
로 수정합니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Effect": "Allow", # 권한을 허용한다는 의미입니다.
"Principal": "*", # 모든 사용자(익명 사용자 포함)를 대상으로 합니다.
"Action": "s3:GetObject", # S3의 특정 작업(GetObject, 즉 파일 조회/다운로드)을 허용합니다.
"Resource": "arn:aws:s3:::myweb-static-files/*" # 해당 버킷의 모든 파일(/*)에 대해 권한을 적용합니다.
}
]
}
- Effect: "Allow": 권한을 허용한다는 의미입니다.
- Principal: "*": 모든 사용자(익명 사용자 포함)를 대상으로 합니다.
- Action: "s3:GetObject": S3의 특정 작업(GetObject, 즉 파일 조회/다운로드)을 허용합니다.
- Resource: "arn:aws:s3:::myweb-static-files/": 해당 버킷의 모든 파일(/)에 대해 권한을 적용합니다.
즉, 위 정책은 해당 버킷에 저장된 파일들을 모든 사용자가 읽기(다운로드 또는 조회) 할 수 있도록 허용하는 설정입니다.
AWS에서는 기본적으로 모든 리소스에 대한 접근이 차단되어 있습니다. S3 버킷도 마찬가지로, S3에 저장된 파일을 업로드하거나 다운로드하려면 반드시 적절한 권한이 있어야만 가능합니다. 이러한 보안 설정은 외부로부터 중요한 데이터를 보호하기 위해 설정된 것입니다.
S3 버킷에 파일을 업로드하려고 해도, 적절한 권한이 없으면 접근이 불가능합니다.
백엔드 서버(EC2 인스턴스 등)가 S3에 파일을 업로드하거나 다운로드하려면 S3에 접근할 수 있는 권한을 미리 설정해야 합니다.
S3에 접근할 수 있는 권한을 설정하는 방법은, IAM을 통해 권한을 부여하는 것입니다.
IAM(Identity and Access Management)는 AWS에서 사용자를 관리하고 각 리소스에 대한 세부적인 접근 권한을 제어할 수 있도록 해주는 서비스입니다.
IAM - 사용자 - 사용자 생성을 선택합니다.
사용자 이름을 작성합니다.
직접 정책 연결을 선택합니다.
권한 정책 부분에서 S3Full을 검색하고, AmazonS3FullAccess
(S3에 대한 완전한 액세스 권한 부여)를 선택합니다.
내용을 확인하고, 사용자 생성을 선택합니다.
생성한 사용자를 선택합니다.
보안 자격 증명을 선택하고, 액세스 키 만들기를 선택합니다.
AWS 외부에서 실행되는 애플리케이션을 선택합니다.
액세스 키 만들기를 선택합니다.
❗️액세스 키와 비밀 액세스 키는 복사하여 다른 곳에 저장해 놓도록 합니다.
S3(Simple Storage Service)는 기본적으로 파일 저장 및 관리 기능을 제공하지만, 부가적인 기능으로 정적 웹 사이트 호스팅 기능을 제공합니다. 이 기능을 활용하면 S3에 저장된 파일을 웹 사이트 형태로 배포할 수 있습니다.
정적 웹 사이트 호스팅이란 쉽게 설명하면, HTML, CSS, 이미지 등의 정적 파일을 인터넷에 공개하고 배포할 수 있는 기능을 의미합니다.
S3의 주요 특징은 다음과 같습니다.
AWS CloudFront는 AWS에서 제공하는 CDN(Content Delivery Network) 서비스입니다. 콘텐츠(파일, 동영상, 웹 페이지 등)를 전 세계 사용자에게 빠르고 안전하게 전달할 수 있도록 도와줍니다.
CloudFront란 쉽게 설명하면, 콘텐츠(파일, 동영상, 웹 페이지 등)를 빠르고 안전하게 전송하는 서비스입니다.
새 S3 버킷을 생성합니다.
❗️퍼블릭 액세스 차단 설정을 해제합니다.
버킷 정책을 편집합니다.
s3:GetObject
정책을 추가합니다.
리소스를 추가합니다.
Principal 부분을 "*"
로 수정합니다.
S3 버킷에 미리 생성해놓은 index.html 파일을 업로드합니다.
업로드한 index.html 파일을 선택합니다.
객체 URL에 접속하여 파일 업로드가 잘 되었는지 확인합니다.
버킷 - 속성 - 정적 웹 사이트 호스팅 부분의 편집을 선택합니다.
정적 웹 사이트 호스팅 활성화를 체크합니다.
인덱스 문서(기본 페이지) 부분에 버킷에 업로드한 index.html 파일명을 입력합니다.
정적 웹 사이트 호스팅 부분에 새로 추가된 버킷 웹 사이트 엔드포인트 링크에 접속합니다.
S3의 정적 웹 사이트 호스팅 기능을 통해 배포에 성공한 것을 확인할 수 있습니다.
CloudFront - CloudFront 배포 생성을 선택합니다.
Original domain은 앞에서 생성한 S3 정적 호스팅 웹 사이트 엔드포인트를 선택합니다.
웹 사이트 엔드포인트 사용을 선택합니다.
Origin domain: CloudFront에서 사용할 원본 파일의 위치를 의미합니다.
S3를 원본으로 사용할 때는, S3 버킷 엔드포인트를 입력하거나, 정적 웹 사이트 엔드포인트를 사용할 수 있습니다.
- S3 웹 사이트 엔드포인트: 정적 웹 사이트 호스팅을 활성화한 경우 사용하는 도메인.
- S3 버킷 엔드포인트: 정적 웹 호스팅 기능 없이 S3 버킷 객체를 직접 제공하는 경우 사용.
뷰어 프로토콜 정책은 Redirect HTTP to HTTPS를 선택합니다.
웹 애플리케이션 방화벽(WAF)은 보안 보호 비활성화를 선택합니다.
설정 부분의 가격 분류에서는 북미, 유럽, 아시아, 중동 및 아프리카에서 사용을 선택합니다.
기본값 루트 객체에 index.html을 입력합니다.
생성한 배포를 선택합니다.
배포 도메인 이름을 복사합니다.
배포 도메인명으로 접속이 잘 되는 것을 확인할 수 있습니다.
CloudFront가 생성한 배포 도메인 이름으로 접속해 CloudFront를 통해 콘텐츠가 올바르게 배포된 것을 확인할 수 있습니다.
Cloud Front에 HTTPS를 적용하기 위해서는, ACM(AWS Certificate Manager)에서 SSL/TLS 인증서를 발급받아야 합니다.
❗️CloudFront에 HTTPS를 적용하기 위해 ACM(AWS Certificate Manager)에서 인증서를 발급받을 때 리전을 반드시 버지니아 북부(US East 1)로 설정해야 합니다.
리전을 버지니아 북부로 변경한 후, 인증서 요청을 선택합니다.
퍼블릭 인증서 요청인지 확인합니다.
도메인 이름을 작성합니다.
Route 53에서 레코드 생성을 선택합니다.
레코드 생성을 선택합니다.
CloudFront로 돌아와서, 생성한 배포를 선택하고, 편집을 선택합니다.
대체 도메인 이름에서 항목 추가를 선택하고, 연결할 도메인 이름을 작성해 줍니다.
인증서는 앞에서 발급한 SSL 인증서를 선택해 줍니다.
Route 53 - 호스팅 영역 - 생성한 호스팅 영역을 선택합니다.
레코드 생성을 선택합니다.
레코드 이름을 작성합니다.
별칭을 선택하고, CloudFront 배포에 대한 별칭 그리고 앞에서 생성한 배포를 선택합니다.
연결한 도메인명으로 접속해보면, 도메인 연결과 HTTPS 적용을 확인할 수 있습니다.
CloudFront 배포를 비활성화해 줍니다. (약 3 ~ 5분 소요)
사용 중지된 배포를 삭제합니다.
S3 버킷 내에 파일이 있는 경우, 버킷을 먼저 비워야 버킷 삭제가 가능합니다.