AWS CloudFront

흑이·2023년 1월 19일
0

CloudFront

  • 정적, 동적 실시간 웹사이트 컨텐츠를 유저들에게 전달
  • Edge Location을 사용
  • Content Delivery Network(CDN)
  • 웹페이지를 요청하는 클라이언트들의 지역에 근거하여 컨텐츠 웹 페이지에 딜리버리 해주는 분산 네트워크이다.
  • 분산 네트워크(Distributed Network)


CloudFront 용어 정리

  • Edge Location(엣지 지역) : 컨텐츠들이 캐시(Cache)에 보관되어지는 장소
  • Origin(오리진) : 원래 컨텐츠들이 들어있는 곳, 웹 서버 호스팅이 되어지는 곳, S3, EC2인스턴스가 오리진이 될 수 있음
  • Distribution(분산) : CDN에서 사용되어지며 Edge Location들을 묶고 있다는 개념


실습

  • S3 버킷의 객체를 CloudFront로 배포해보기

  • 버킷 생성, 리전은 다른 나라로

  • 전 세계에서 접근 가능한 퍼블릭 S3를 생성하기 위해, 모든 퍼블릭 액세스 차단 해제

  • 파일 업로드

  • 객체 URL로 접속 시도

  • S3 버킷을 만들때 분명 퍼블릭으로 설정하여 만들었지만, 이상하게 객체 접근이 Access Denied가 뜬다.

  • 앞서 생성한 S3 버킷을 보면 객체를 퍼블릭으로 설정할 수 있음 메세지가 있는 것을 확인할 수 있다.

  • 이는 아직 퍼블릭으로 설정되지 않았다는 뜻이며 외부에서 접근할 수 없다는 것을 의미한다.

  • 따라서 외부에서 해당 버킷에 접근 가능하도록 하기 위해서는 버킷 정책을 수정해야 한다.


정책 생성기

  • Principal : 버킷 정책이 적용될 대상 전체(*)
  • Actions : 버킷에 수행할 액션 (GetObject, PutObject)
  • ARN : 버킷에 어떤 리소스에 적용할지 -> 버킷 이름 선택, 리소스 전체(*)

{
  "Id": "Policy1674005307483",   // 정책 ID
  "Version": "2012-10-17",
  "Statement": [
    {
      "Sid": "Stmt1674004914180",
      "Action": [  // 버킷에 수행할 액션(행동)
        "s3:GetObject",  // 객체 가져오기
        "s3:PutObject"  // 객체 업로드하기
      ],
      "Effect": "Allow",  // 정책 적용
      "Resource": "arn:aws:s3:::aws-learner-cloudfront-jmw/*",  // 어떤 버킷에 어떤 리소스에 적용, 버킷에 있는 모든 리소스(객체)
      "Principal": "*"  // 정책 적용 대상 모두
    }
  ]
}

  • 혹시나 버킷 정책을 입력하고 변경사항 저장을 할때
  • Action does not apply to any resource(s) in statement 에러가 발생한다면
  • 버킷 정책의 Resource에 있는 value 즉 arn값 뒤에다가 /*를 붙여주고 변경사장 저장을 클릭하시면 퍼블릭으로 변경 된다.

정책 추가 후 객체 URL로 접속해보면 업로드된 파일이 정상적으로 화면에 보여진다.



버킷 ACL

  • 위에서 버킷 정책 JSON을 생성해 접근 권한을 설정 해줬지만,

  • JSON 설정이 복잡하다면 간편한 ACL 메뉴를 통해 S3 버킷 접근 제어를 할수 있다.


버킷 접근 제어 3가지 방법

  • IAM 제어는 IAM 계정에 S3 접근 권한(policy)를 설정해 사용자 단위로 액세스를 제어하는 것
  • 버킷 정책은 버킷 단위로 상세한 접근 제어를 확정하고 이후에 변경이 적을 때,
  • ACL은 객체 단위로 간단하게 접근 제어할 때 사용

접근정책(ACL)은 버킷정책을 통해 사용할 수 있는 권한보다 세부적인 제어를 제공하지 않는다.
읽기 및 쓰기 엑세스 권한 이외의 세부 권한을 찾고 있는 경우 접근정책(ACL)을 통해 버킷정책(Bucket Policy)을 선택하여 구성이 가능하다.
단, 버킷정책은 파일형태로 만들어 버킷에 적용하며 이 파일은 20KB를 초과할 수 없다.


버킷 ACL 설정하기

  • 버킷 -> 권한

  • 버킷을 퍼블릭으로 설정했으면, 각 파일에 대해서도 퍼블릭으로 설정해주어야 한다.

  • 파일을 처음 업로드할때 밑의 ACL 메뉴에서 파일에 대한 접근 권한을 설정해줄 수 있고,


  • 이미 업로드된 객체일 경우, ACL을 통해 퍼블릭으로 지정


ACL 설정 후 객체 URL로 접속해보면 업로드된 파일이 정상적으로 화면에 보여진다.



CloudFront 배포

  • 원본 경로 : 만약 S3 버켓 안에 여러개의 폴더가 있고, 각각의 폴더에 다른 이미지 동영상이 있다면
  • 특정 폴더만을 타겟을 원한다면 원본 경로 입력

S3 버킷 액세스

  • OAI (origin access identity) 를 이용하여 클라우트프론트에 오리진이 되는 S3 버킷에 대한 액세스 컨트롤 할것인지?
  • 원본 액세스 제어 설정 : cloudfront에 identity를 생성해 S3버킷에 접근할 수 있게 해줌

Origin shield

  • Origin으로 등록한 스토리지(S3 등)에 전달되는 리퀘스트의 횟수를 줄여 관리 비용을 줄인다고 한다. (캐시 적중률을 높힌다는 이야기)
  • Yes 옵션을 선택 후, 자기 서비스 오리진의 지역에 가까운 지역을 선택해서 골라주면 설정이 끝난다.

  • 자동으로 객체 압축 : CloudFront가 전송속도를 높이기 위해 오리진에서 가져온 오브젝트를 자동으로 압축 하는 기능
  • Http, Https 사용
  • GET 뿐만아니라 PUT, POST, PATCH, DELETE도 CloudFront로 가능

뷰어 액세스 제한

  • 승인받은 유저들만 접속 가능하도록, ex.특정 웹사이트 방문하기 위해 로그인 과정
  • signed url을 가지고 있는 특정 유저들만 웹사이트 컨텐츠를 볼 수 있게 해주는 URL

  • 캐싱된 객체가 가지고 있는 고유 식별자(key)

  • 현재 사용자의 요청에 의한 캐쉬 key와 이전 요청에서 생성된 캐쉬 key가 동일한 경우 캐쉬히트라고 한다.

  • 캐쉬히트가 발생할 때, 해당 오브젝트 콘텐츠가 클라우드프론트 엣지에서 최종 사용자에게 전달하기 때문에 오리진 서버의 부하를 감소, 최종 사용자에 대한 딜레이 타임을 줄여줄 수 있다.

  • 원본 요청(Origin request)는 요청된 오브젝트, 콘텐츠가 클라우드프론트 엣지 로케이션에 캐싱되어 있지 않을 경우, 또는 특정 조건을 통한 리퀘스트가 있을 때 클라우드프론트가 오리진에 요청을 보내서 객체를 검색하고 캐싱을 하는것을 의미 함

  • TTL을 설정할 수 있다, 얼마나 오래동안 콘텐츠들이 캐시에 저장되는지에 대한 설명


  • 정책보기로 세팅이 어떻게 되어있는지 확인 가능하다.
  • 최소 TTL은 1, 최대 TTL 31536000초(365일), 디폴트는 86400초(24시간)

  • 가격분류 : 어느 지리적 위치에 클라우드프론트 엣지로케이션을 사용할 것인지
  • AWS WAF 웹 ACL - 클라우드프론트에 WAF, ACL 선택하는 메뉴
  • 대체 도메인 이름 : 대체 도메인이 있을 경우, 도메인 주소를 구매해 사용
  • 사용자 정의 SSL 인증서 : SSL을 사용할 것인지
  • HTTP 버전 선택 가능

  • 기본값 루트 객체 : 리퀘스트가 특정 오브젝트가 아니라 루트로 요청할 때, 어떤 객체를 반환할 것인지?
  • 표쥰로깅 : 리퀘스트 로그를 S3 버킷에 저장할지
  • IPv6 지원 여부

CloudFront 생성 후

  • 오류페이지 : 유저가 웹서버에서 400대 500 에러가 발생시 보여주는 웹 페이지를 직접 지정할 수 있다.

  • 지리적제한 : 특정 국가의 유저들을 차단할 수 있다.

  • 캐시에 들어오는 오브젝트를 삭제할 수 있다.
  • ex. S3버킷에 파일이 새로 업데이트 되었지만, 캐시에는 오래된 파일을 가지고 있다.
  • 새로운 파일을 캐시에 넣기 위해서는 기존 캐시를 비워줘야 한다. TTL에서 설정된 시간동안 기다리기에는 비효율적
  • 수동으로 캐시를 비울 수 있다.
  • 단점은 추가적인 비용이 든다. 애초에 TTL에 대한 설정을 올바르게 하거나, S3버킷의 용도를 알맞게 디자인해야 한다.
  • 버킷의 컨텐츠가 자주 업데이트 될시 TTL을 낮게 잡아주는게 좋다.


퍼블릭 액세스 권한 해제

  • S3의 미리 업로드된 파일의 퍼블릭 액세스 해제

  • S3 버킷 퍼블릭 액세스 권한 차단

  • S3 객체의 URL과 CloudFront URL로 접근해보면 접근 거부가 뜬다.


  • CloudFront URL로만 접근 가능하다.


S3 직접 호스팅, CloudFront로 배포 차이

  • 앞에서 퍼블릭 제한을 해제
  • S3에서 직접 호출과 CloudFront 호출의 차이점 보기

  • S3로 호출 내역

  • CloudFront로 호출 시 x-cache : Hit from cloudfront 헤더가 추가 된걸 확인할 수 있다.

  • CloudFront로 호출시 S3에서 직접 호출하는것 보다 시간이 빠른걸 알 수 있다.

  • S3호스팅은 매번 새로고침 즉 매번 리퀘스트에대해 S3버킷에서 해당 오브젝트를 불러와서 페이지를 로딩하지만
  • CloudFront는 S3버킷의 객체를 캐싱하여, 캐싱서버에 저장하고 리퀘스트가 있을때 캐싱서버에서 불러오기 때문에 빠르다.


https://inpa.tistory.com/entry/AWS-%F0%9F%93%9A-S3-%EB%B2%84%ED%82%B7-%EC%83%9D%EC%84%B1-%EC%82%AC%EC%9A%A9%EB%B2%95-%EC%8B%A4%EC%A0%84-%EA%B5%AC%EC%B6%95
https://taxijjang.tistory.com/117
https://hyeon9mak.github.io/access-s3-through-cloudfront/
https://www.inflearn.com/course/aws-%EC%9E%85%EB%AC%B8/dashboard

0개의 댓글