[캐싱] (1) AWS CloudFront

목차

(1) 캐싱이란?

(2) CloudFront란?

(3) CloudFront 설정하기


(1) 캐싱이란?

자주 부르는 데이터를 액세스 하기 쉬운 공간에 따로 저장해서 더 빠르게 요청을 처리하는 기술로 일반적으로 RAM(Random Access Memory)같이 빠르게 접근해 불러올 수 있는 메모리에 오린다. 일반적으로 메모리의 속도가 빨라지면 용량이 줄고(CPU, RAM) 용량이 커지면 속도가 느려지는데(하드 드라이브) 자주 부르는 데이터를 빠르게 처리할 수 있는 곳에 올리면 불러다 쓰는 속도가 더 빨라져서 연산 처리 속도가 빨라지는 것을 목적으로 한 기술이다.

 

(2) CloudFront란?

웹 콘텐츠 (HTML, 이미지 등) 캐시 서버로 자주 사용하는 데이터/컨텐츠를 캐시 서버에 띄워두면 전 세계 어디에서든지 거의 균일한 속도로 서비스를 제공할 수 있다. 특히 AWS는 엣지로케이션(Edge Location)이라고 해서 전 세계에 몇 군데에 중점 지역으로 캐시 컨텐츠를 올려둔다. 이렇게 캐싱을 하는 네트워크를 CDN(Contents Delivery Network)라고 한다.

 

 

 

(3) CloudFront 설정하기

 

EC2 인스턴스를 하나 만들고 다음과 같이 설정한다 (Ubuntu 20 기준)

인바운드에 http 80을 연다.

>>> sudo apt update
>>> sudp apt install npm git
>>> sudo npm install -g http os
>>> npm install sleep
// app.js 생성

const http = require('http');
const hostname = '0.0.0.0';
const port = 80;
var os = require("os");
var sleep = require("sleep");

const server = http.createServer((req, res) => {
    var datetime = new Date(Date.now()+60*60*9*1000);

    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.write('Hello World ! (Real Linux) \n');
    res.write(os.hostname());
    res.write('\n\n');
    res.write(datetime.toString());
    res.end('\n');
});

server.listen(port, hostname, () => {
    console.log(`Server running at http://${hostname}:${port}/`);
});
~

그 후 다음과 같이 js 파일을 띄우고 EC2의 개방주소로 접속하면 아래 같이 서버가 뜬다.

>>> sudo node app.js

이 페이지를 새로 고침하면 워낙 가볍기 때문에 10 ms 내외로 빠르게 로딩되는 것을 확인할 수 있다.

웹 반응속도를 늦추기 위해 sleep을 사용한다. 5초를 지연하면 다음과 같이 로딩하는 데에 6초 내외로 걸리는 것을 확인할 수 있다.

// app.js 생성

const http = require('http');
const hostname = '0.0.0.0';
const port = 80;
var os = require("os");
var sleep = require("sleep");

const server = http.createServer((req, res) => {
    sleep.sleep(5); <------------------------------------ 로딩 지연 5초 추가
    var datetime = new Date(Date.now()+60*60*9*1000);

    res.statusCode = 200;
    res.setHeader('Content-Type', 'text/plain');
    res.write('Hello World ! (Real Linux) \n');
    res.write(os.hostname());
    res.write('\n\n');
    res.write(datetime.toString());
    res.end('\n');
});

server.listen(port, hostname, () => {
    console.log(`Server running at http://${hostname}:${port}/`);
});
~

 

sleep 5초 + 로딩 까지 약 5.56s 이 걸린다. 이때 바로 리로딩하면 캐싱된 컨텐츠가 로딩되기 때문에 43ms 이내로 로딩된다. sleep 5초 때문에 로딩할 때마다 5초씩 기다려야 한다.

 

 

캐싱을 해주기 위해 CloudFront에 다음과 같이 EC2의 주소를 넣고 CloudFront를 생성한다

 

 

생성 중에 캐시 및 원본요청에서 캐싱을 얼마나 살려둘지 TTL (Time To Live) 값을 설정할 수 있다 (이후 CloudFront의 행동탭에서 행동 편집으로 수정할 수도 있다) 각각 캐시를 유지하는 최소시간, 최대시간, 기본 시간을 의미한다.

 

CloudFront를 생성하면 다음과 같이 접속할 수 있는 주소가 나온다. 여기에 들어가 접속하면 최초 로딩 후 그 다음부터는 10ms 이내로 굉장히 빠르게 로딩이 된다. sleep이 걸려있지만 이미 CDN에 올라간 컨텐츠를 불러오기 때문에 빠르게 로딩할 수 있다. 다만 캐싱된 내용을 가져오기 때문에 시간이 바로 바뀌지 않는 것을 알 수 있다.

 

 

캐싱된 컨텐츠를 얼마나 살려둘지 정하는 방법 중 하나가 위에서 말한 TTL(Time To LIve) 정책을 설정하는 것이다. 컨텐츠 내용에 맞는 TTL 시간을 정해 얼마마다 한 번 씩 컨텐츠를 업데이트 할 지 정하면 된다.

또는 invalid 탭에 들어가서 캐싱을 무효화하려는 object path를 입력하면 해당 path의 컨텐츠 캐싱이 무효화 된다.


https://aws.amazon.com/ko/caching/

 

캐싱이란 무엇이고 어떻게 작동합니까 | AWS

다양한 캐싱 사용 사례 알아보기 데이터베이스 캐싱 속도와 처리량 면에서, 데이터베이스가 제공하는 성능은 애플리케이션 전체 성능에 무엇보다 크게 영향을 미칠 수 있습니다. 또한 오늘날

aws.amazon.com

 

 

 

'DB' 카테고리의 다른 글

MongoDB 엔티티 매핑(2): 연관관계와 프로젝트적용  (0) 2021.10.16
MongoDB 엔티티 매핑(1)  (2) 2021.10.13
  Comments,     Trackbacks