[AWS] S3 (Simple Storage Service), CloudFront

artp·2024년 11월 25일
0

aws

목록 보기
11/13
post-thumbnail

S3란?

S3란 쉽게 설명하면, AWS에서 제공하는 클라우드 기반 파일 저장 서비스입니다.

S3(Simple Storage Service)는 이름 그대로 간단한 파일 저장 및 관리를 제공하는 AWS의 클라우드 서비스입니다. 우리가 일상적으로 사용하는 구글 드라이브, iCloud 같은 클라우드 스토리지와 비슷하게, S3는 파일(이미지, 동영상, 문서 등)을 저장하고 관리할 수 있는 공간을 제공합니다.

S3를 사용하는 이유

1. 백엔드 파일 저장의 필요성

서비스를 개발하다 보면 이미지, 동영상, PDF 같은 파일 업로드 기능을 구현해야 하는 경우가 많습니다. 서버에 파일을 저장할 수도 있지만, 파일이 점점 많아지면 다음과 같은 문제가 발생하게 됩니다.

  1. 저장 공간 부족: EC2의 용량은 제한적입니다.
  2. 서버 성능 저하: 많은 파일이 저장되면 서버의 성능에 영향을 줄 수 있습니다.
  3. 운영 복잡성 증가: 서버와 파일 관리를 동시에 하면 관리가 어렵고 복잡해집니다.

2. 파일 저장과 다운로드에 최적화

S3는 파일 저장과 다운로드에 최적화되어 있으며, 다음과 같은 장점이 있습니다.

  1. 확장성: 파일이 많아져도 자동으로 용량이 늘어나며 추가적인 설정이 필요하지 않습니다.
  2. 내구성과 가용성: S3에 저장된 파일은 안전하게 보관되며, 필요할 때 거의 항상 접근할 수 있습니다.
  3. 보안: 파일에 대한 접근 제어(읽기, 쓰기 권한 설정 등)를 세부적으로 설정할 수 있습니다.
  4. 온디맨드 방식: 사용한 만큼만 비용을 지불하므로 비용 측면에서 효율적입니다.

S3 사용 아키텍처

1. S3 업로드 아키텍처

업로드는 EC2가 S3에 이미지를 저장하고 해당 URL을 RDS에 기록하는 과정입니다.

사용자가 이미지를 업로드하는 과정:

  1. 사용자가 이미지 업로드 API 요청

    • 사용자가 이미지를 업로드하면, 요청은 EC2 서버로 전달됩니다.
  2. EC2가 S3에 이미지 업로드

    • EC2 서버는 사용자가 보낸 이미지를 S3에 업로드합니다.
  3. S3에서 이미지 URL 반환

    • S3는 업로드된 이미지에 대한 URL을 반환하는데, 이는 저장된 이미지에 접근하기 위한 고유 경로입니다.
      예: https://mywebserver.s3.ap-northeast-2.amazonaws.com/abc.png
  4. DB에 이미지 URL 저장

    • EC2는 반환된 이미지 URL을 RDS 데이터베이스에 저장하여 이후 조회 요청에 사용할 수 있도록 합니다.

2. S3 다운로드 아키텍처

다운로드는 EC2와 RDS를 거쳐 사용자가 이미지 URL을 받아 S3에서 직접 다운로드하는 과정입니다.

S3에 저장된 이미지를 사용자에게 제공하는 과정:

  1. 사용자가 이미지 조회 API 요청

    • 사용자가 웹/앱에서 특정 이미지를 요청합니다. 이 요청은 EC2 서버로 전달됩니다.
  2. DB에 SQL 쿼리 요청

    • EC2 서버는 요청받은 이미지에 대한 정보를 확인하기 위해 RDS 데이터베이스에 SQL 쿼리를 실행하여 해당 이미지의 URL을 조회합니다.
  3. 이미지 URL 응답

    • RDS는 요청된 이미지의 S3 URL을 반환하며, EC2는 이를 사용자에게 전달합니다.
  4. 사용자에게 이미지 URL 응답

    • EC2는 사용자가 접근할 수 있는 S3 이미지 URL을 반환합니다. 예:
      https://mywebserver.s3.ap-northeast-2.amazonaws.com/abc.png
  5. 사용자가 URL을 통해 이미지 다운로드

    • 사용자는 반환된 S3 URL을 통해 이미지를 직접 다운로드합니다.
      예를 들어, HTML에서는 <img src="S3 URL"> 태그를 사용하여 이미지를 표시할 수 있습니다.

S3 실습

S3 버킷 생성

S3 - 버킷 만들기를 선택합니다.

버킷 이름을 작성합니다.

모든 퍼블릭 액세스 차단 체크를 해제합니다.

다른 설정은 기본값을 유지하고 버킷 만들기를 선택하여 생성을 완료합니다.

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/": 해당 버킷의 모든 파일(/)에 대해 권한을 적용합니다.
    즉, 위 정책은 해당 버킷에 저장된 파일들을 모든 사용자가 읽기(다운로드 또는 조회) 할 수 있도록 허용하는 설정입니다.

S3 파일 업로드를 위한 IAM 액세스 키 발급

AWS에서는 기본적으로 모든 리소스에 대한 접근이 차단되어 있습니다. S3 버킷도 마찬가지로, S3에 저장된 파일을 업로드하거나 다운로드하려면 반드시 적절한 권한이 있어야만 가능합니다. 이러한 보안 설정은 외부로부터 중요한 데이터를 보호하기 위해 설정된 것입니다.

S3 버킷에 파일을 업로드하려고 해도, 적절한 권한이 없으면 접근이 불가능합니다.
백엔드 서버(EC2 인스턴스 등)가 S3에 파일을 업로드하거나 다운로드하려면 S3에 접근할 수 있는 권한을 미리 설정해야 합니다.

S3에 접근할 수 있는 권한을 설정하는 방법은, IAM을 통해 권한을 부여하는 것입니다.
IAM(Identity and Access Management)는 AWS에서 사용자를 관리하고 각 리소스에 대한 세부적인 접근 권한을 제어할 수 있도록 해주는 서비스입니다.

IAM 사용자 생성

IAM - 사용자 - 사용자 생성을 선택합니다.

사용자 이름을 작성합니다.

직접 정책 연결을 선택합니다.
권한 정책 부분에서 S3Full을 검색하고, AmazonS3FullAccess(S3에 대한 완전한 액세스 권한 부여)를 선택합니다.

내용을 확인하고, 사용자 생성을 선택합니다.

액세스 키 만들기

생성한 사용자를 선택합니다.

보안 자격 증명을 선택하고, 액세스 키 만들기를 선택합니다.

AWS 외부에서 실행되는 애플리케이션을 선택합니다.

액세스 키 만들기를 선택합니다.

❗️액세스 키와 비밀 액세스 키는 복사하여 다른 곳에 저장해 놓도록 합니다.

S3, CloudFront를 활용한 웹 서비스 배포

S3

S3(Simple Storage Service)는 기본적으로 파일 저장 및 관리 기능을 제공하지만, 부가적인 기능으로 정적 웹 사이트 호스팅 기능을 제공합니다. 이 기능을 활용하면 S3에 저장된 파일을 웹 사이트 형태로 배포할 수 있습니다.

정적 웹 사이트 호스팅이란 쉽게 설명하면, HTML, CSS, 이미지 등의 정적 파일을 인터넷에 공개하고 배포할 수 있는 기능을 의미합니다.

S3의 주요 특징은 다음과 같습니다.

  • 저장소: 이미지, HTML, CSS, JavaScript 파일 등을 저장할 수 있습니다.
  • 정적 웹 사이트 호스팅: S3에 저장된 정적 파일을 사용자가 브라우저에서 접근할 수 있도록 HTTP를 통해 제공합니다.

CloudFront


AWS CloudFront는 AWS에서 제공하는 CDN(Content Delivery Network) 서비스입니다. 콘텐츠(파일, 동영상, 웹 페이지 등)를 전 세계 사용자에게 빠르고 안전하게 전달할 수 있도록 도와줍니다.

CloudFront란 쉽게 설명하면, 콘텐츠(파일, 동영상, 웹 페이지 등)를 빠르고 안전하게 전송하는 서비스입니다.

CloudFront의 작동 원리

  1. 원본 서버에서 콘텐츠 가져오기: 콘텐츠는 일반적으로 S3 버킷이나 애플리케이션 서버에 저장되어 있습니다.
  2. 전 세계 엣지 로케이션에 콘텐츠 복제: CloudFront는 사용자가 가장 가까운 엣지 로케이션(전 세계에 분포된 캐시 서버 네트워크)에서 콘텐츠를 가져올 수 있도록 복사본을 저장합니다.
  3. 가까운 위치에서 콘텐츠 제공: 사용자가 요청하면, CloudFront는 가장 가까운 엣지 로케이션에서 콘텐츠를 제공하여 대기 시간을 줄입니다.

CloudFront의 주요 기능

  1. 속도 향상: 사용자와 원본 서버 간의 물리적 거리 문제를 해결.
  2. HTTPS 지원: S3는 기본적으로 HTTPS를 지원하지 않지만, CloudFront를 통해 HTTPS를 적용 가능.
  3. 보안 강화: 요청 제어, 암호화, 인증을 통해 보안성이 강화됨.
  4. 캐싱 기능: 자주 요청되는 데이터를 캐시하여 서버 부담 감소.

S3와 CloudFront를 같이 사용하는 이유

  1. 빠른 콘텐츠 전송
  • S3 단독 배포는 원본 서버와 사용자의 물리적 거리 때문에 속도 저하가 발생할 수 있음.
  • CloudFront를 추가하면 글로벌 캐시 네트워크를 활용해 속도가 크게 향상됨.
  1. HTTPS 지원
  • S3는 기본적으로 HTTPS를 지원하지 않음.
  • CloudFront는 HTTPS를 활성화하여 보안을 강화.
  1. 보안 강화
  • CloudFront는 제한된 액세스, IP 필터링 등 추가적인 보안 기능을 제공.
  1. 효율적인 비용 관리
  • 자주 요청되는 콘텐츠는 CloudFront의 엣지 로케이션에 캐싱되어 S3로의 요청 수를 줄임. 결과적으로 비용 절감 가능.

S3, CloudFront 실습

S3 배포 - 정적 웹 사이트 호스팅

새 S3 버킷을 생성합니다.
❗️퍼블릭 액세스 차단 설정을 해제합니다.

버킷 정책을 편집합니다.
s3:GetObject 정책을 추가합니다.

리소스를 추가합니다.

Principal 부분을 "*"로 수정합니다.

S3 버킷에 미리 생성해놓은 index.html 파일을 업로드합니다.

업로드한 index.html 파일을 선택합니다.

객체 URL에 접속하여 파일 업로드가 잘 되었는지 확인합니다.


버킷 - 속성 - 정적 웹 사이트 호스팅 부분의 편집을 선택합니다.

정적 웹 사이트 호스팅 활성화를 체크합니다.
인덱스 문서(기본 페이지) 부분에 버킷에 업로드한 index.html 파일명을 입력합니다.

정적 웹 사이트 호스팅 부분에 새로 추가된 버킷 웹 사이트 엔드포인트 링크에 접속합니다.

S3의 정적 웹 사이트 호스팅 기능을 통해 배포에 성공한 것을 확인할 수 있습니다.

CloudFront 배포

CloudFront - CloudFront 배포 생성을 선택합니다.

Original domain은 앞에서 생성한 S3 정적 호스팅 웹 사이트 엔드포인트를 선택합니다.
웹 사이트 엔드포인트 사용을 선택합니다.

Origin domain: CloudFront에서 사용할 원본 파일의 위치를 의미합니다.
S3를 원본으로 사용할 때는, S3 버킷 엔드포인트를 입력하거나, 정적 웹 사이트 엔드포인트를 사용할 수 있습니다.

  • S3 웹 사이트 엔드포인트: 정적 웹 사이트 호스팅을 활성화한 경우 사용하는 도메인.
  • S3 버킷 엔드포인트: 정적 웹 호스팅 기능 없이 S3 버킷 객체를 직접 제공하는 경우 사용.


뷰어 프로토콜 정책은 Redirect HTTP to HTTPS를 선택합니다.

웹 애플리케이션 방화벽(WAF)은 보안 보호 비활성화를 선택합니다.

설정 부분의 가격 분류에서는 북미, 유럽, 아시아, 중동 및 아프리카에서 사용을 선택합니다.
기본값 루트 객체에 index.html을 입력합니다.

생성한 배포를 선택합니다.

배포 도메인 이름을 복사합니다.

배포 도메인명으로 접속이 잘 되는 것을 확인할 수 있습니다.
CloudFront가 생성한 배포 도메인 이름으로 접속해 CloudFront를 통해 콘텐츠가 올바르게 배포된 것을 확인할 수 있습니다.

CloudFront에 HTTPS 적용, 도메인 연결

1. HTTPS 적용

Cloud Front에 HTTPS를 적용하기 위해서는, ACM(AWS Certificate Manager)에서 SSL/TLS 인증서를 발급받아야 합니다.

❗️CloudFront에 HTTPS를 적용하기 위해 ACM(AWS Certificate Manager)에서 인증서를 발급받을 때 리전을 반드시 버지니아 북부(US East 1)로 설정해야 합니다.

리전을 버지니아 북부로 변경한 후, 인증서 요청을 선택합니다.

퍼블릭 인증서 요청인지 확인합니다.

도메인 이름을 작성합니다.

Route 53에서 레코드 생성을 선택합니다.

레코드 생성을 선택합니다.

CloudFront로 돌아와서, 생성한 배포를 선택하고, 편집을 선택합니다.

대체 도메인 이름에서 항목 추가를 선택하고, 연결할 도메인 이름을 작성해 줍니다.
인증서는 앞에서 발급한 SSL 인증서를 선택해 줍니다.

2. 도메인 연결

Route 53 - 호스팅 영역 - 생성한 호스팅 영역을 선택합니다.

레코드 생성을 선택합니다.

레코드 이름을 작성합니다.
별칭을 선택하고, CloudFront 배포에 대한 별칭 그리고 앞에서 생성한 배포를 선택합니다.

연결한 도메인명으로 접속해보면, 도메인 연결과 HTTPS 적용을 확인할 수 있습니다.

S3 관련 리소스 종료

1. CloudFront 비활성화 및 삭제

CloudFront 배포를 비활성화해 줍니다. (약 3 ~ 5분 소요)

사용 중지된 배포를 삭제합니다.

2. S3 버킷 비우기

S3 버킷 내에 파일이 있는 경우, 버킷을 먼저 비워야 버킷 삭제가 가능합니다.

3. S3 버킷 삭제

profile
donggyun_ee

0개의 댓글