웹서버에서 AWS CloudFront 사용

jys9962·2025년 3월 25일
0

AWS를 사용하는 대부분의 웹사이트에서 이미지를 S3에서 바로 보내지 않고 CloudFront(이하 CF)를 통해서 제공합니다.
CF는 AWS 에서 제공하는 CDN 서비스입니다
S3에서 바로 보내는 것보다 비용(트래픽,GET요청)이 싸고 네트워크 속도도 더 빠릅니다.
이미지 같은 정적인 데이터 외에도 웹서버에서 보내주는 JSON 같은 동적인 데이터도 CF를 통해 제공할 수 있습니다.

AWS 공식 블로그에서도 관련 글을 찾아볼 수 있습니다

CF 사용시 아래와 같은 장점이 있습니다.

  1. 네트워크 응답이 빠릅니다

    • CF의 많은 엣지 로케이션 중 현재 사용자와 가장 가까운 엣지 서버에 접근하여 가져오므로 웹서버보다 가까울 확률이 높습니다.
  2. 트래픽 전송 비용이 더 저렴합니다.

    • CF를 통해 데이터를 전송하는 것이 EC2에서 직접 전송하는 것보다 비용이 저렴합니다.
      EC2→CF는 무료입니다
  3. 정적 데이터 캐싱이 가능합니다

  4. 하나의 도메인에 여러 경로를 각각 다른 원본에 매핑할 수 있습니다.

    ex:

  5. 이 외에도 SSL 적용이 쉽고 ddos 방지 등의 장점이 있습니다.


기본 사용 방법

CF에서 사용되는 단어 몇가지만 알면 쉽게 사용할 수 있습니다.

  1. 배포: CF로 제공되는 하나의 도메인과 매핑됩니다.
  2. 원본: CF가 데이터를 가져올 실제 서버입니다.
    S3, EC2, Lambda 또는 외부의 서버가 될 수 있습니다.
    하나의 배포에 하나 이상의 원본을 가질 수 있습니다.
  3. 동작: 요청 받은 경로에 대해 어떻게 처리할지 설정합니다.
    위에서 설정한 원본 중 어디서 데이터를 가져올지
    가져온 데이터는 얼마나 오래 저장할지, 캐시키는 어떻게 할지 등
    데이터의 전/후 처리 등
  4. 무효화: 하나의 배포에서 캐시된 데이터를 삭제합니다.
    전체 또는 원하는 경로에 대해서만 진행할 수 있습니다.
  5. 정책: 동작에서 사용할 미리 정의된 설정 템플릿
    원본 요청, 응답 헤더, 캐시에 대한 설정이 미리 만들어져서 제공됩니다.
    새로운 정책을 만들거나 기존 정책을 사용해도 되고, 정책을 사용하지 않고 동작에서 직접 설정해도 됩니다.

하나의 배포를 만들고, 사용할 원본들을 모두 등록 후 경로에 맞게 동작탭에서 매핑해주면 됩니다.

웹 서버에서 CF를 통해 데이터를 가져올 때는 ‘AllViewer’ 원본 요청 정책을 설정하는 것이 일반적입니다.

웹서버 캐시 사용 사례

CF 응답 캐싱은 변경이 발생하지 않는 데이터에 사용하기 좋습니다.

예를 들어, RDB에서 append-only(추가만 되는 구조)의 내역 테이블이 있습니다

CREATE TABLE articles
(
    id         BIGINT UNSIGNED PRIMARY KEY,
    writer_id  BIGINT UNSIGNED NOT NULL,
    created_at DATETIME        NOT NULL
) comment '게시글'
;
CREATE TABLE article_histories
(
    id         BIGINT UNSIGNED PRIMARY KEY,
    article_id BIGINT UNSIGNED NOT NULL,
    title      VARCHAR(255)    NOT NULL,
    contents   MEDIUMTEXT      NOT NULL,
    created_at DATETIME        NOT NULL,
    FOREIGN KEY (article_id) REFERENCES articles (id)
) comment '게시글 변경내역'

게시글을 작성 한 후 수정하더라도 테이블에 수정(update) 없이 article_histories 테이블에 행이 하나 추가(insert)됩니다.

/article/{id}/histories/{historyId} 응답을 CloudFront에서 캐싱하면,
데이터가 수정되지 않으므로 무효화가 필요 없이 항상 최신 데이터를 받을 수 있습니다.

즉, 캐싱 이후 클라이언트의 요청은 서버에 전혀 접근하지 않고 빠르게 데이터를 가져올 수 있습니다.

원본 데이터가 수정된 경우, 무효화 기능이 있지만 비용이 발생하고 느립니다. (1회당 0.005 USD = 약 7원)

데이터가 바뀔때마다 무효화 기능을 사용하기엔 무리가 있습니다.

대신, 버전을 나타내는 쿼리 파라미터를 활용하는 것이 일반적입니다.

CloudFront는 기본적으로 URL의 Path가 다르면 다른 데이터로 판단하여 원본을 다시 조회합니다.

또한 설정을 통해 Header나 Query 문자열, Cookie 값이 달라도 다른 데이터로 판단하도록 할 수 있습니다.

가장 다루기 쉬운 Query 문자열로 원하는 파라미터(_v)를 설정합니다.

위 처럼 설정하는 경우 아래 두 요청은 Path는 동일하지만 _v 쿼리가 다르므로 다른 데이터로 판단합니다.

• /article/1234?_v=1

• /article/1234?_v=2

수정이 발생할 때마다 _v를 1씩 증가시키거나 하는 방법으로 최신 데이터를 조회할 수 있습니다.

하지만 _v 값을 어딘가에 저장한 후 요청할 때마다 조회해야 하는 단점이 있습니다.

0개의 댓글