[AWS] Cloudfront: KeyValueStore

Cloudfront KeyValueStore๋Š” Cloudfront Function์„ ๋ณด์กฐํ•˜๋Š” ๋ถ€๊ฐ€๊ธฐ๋Šฅ์ด๋‹ค.
Function์—์„œ ๋ญ”๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์˜์†์ ์œผ๋กœ ์ €์žฅํ•˜๊ณ  ๊บผ๋‚ด์“ธ ํ•„์š”๊ฐ€ ์žˆ์„๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.

ํŠน์ˆ˜ํ™”๋œ๊ฑฐ๋ผ public access ๊ฐ€๋Šฅํ•œ ๋ฒ”์šฉ DB๋Š” ์•„๋‹ˆ๊ณ , CloudFront Function ์—ฃ์ง€์—์„œ๋งŒ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•˜๋‹ค.

๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ์Šคํ† ๋ฆฌ์ง€๋“ค๊ณผ ์ฐจ๋ณ„๋˜๋Š” ์žฅ์ ์€ ๋Œ€๋ถ€๋ถ„ ๋ฆฌ์ „์˜ ๋ชจ๋“  ์—ฃ์ง€ ์œ„์น˜์— ๋ฐ์ดํ„ฐ๊ฐ€ ๋ถ„ํฌ๋˜์–ด์„œ ์ตœ์†Œํ•œ์˜ ๋ ˆ์ดํ„ด์‹œ๋กœ ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•œ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

๋Œ€ํ‘œ์ ์ธ ์‚ฌ์šฉ๋ก€๋Š” A/B ํ…Œ์ŠคํŠธ ๋ผ์šฐํŒ…์„ ํ• ๋•Œ ๋ถ„ํฌ ๋น„์œจ ๋“ฑ์„ ์กฐ์ •ํ•œ๋‹ค๊ฑฐ๋‚˜ ํ•˜๋Š” ๊ฒƒ์ด๋‹ค.
๋”ฑํžˆ ์ •ํ˜•ํ™”๋œ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์ด ์žˆ์ง€๋Š” ์•Š์œผ๋‹ˆ, ํŽธํ• ๋Œ€๋กœ ์“ฐ๋ฉด ๋œ๋‹ค.

๊ด€๋ จ ํฌ์ŠคํŠธ
https://blog.naver.com/sssang97/223368455944




๋น„์šฉ

https://aws.amazon.com/ko/cloudfront/pricing/

์ฝ๊ธฐ ๋น„์šฉ์ด ์ €๋ ดํ•˜๊ณ  ์“ฐ๊ธฐ ๋น„์šฉ์ด ์กฐ๊ธˆ ๋น„์‹ผ ํŽธ์ด๋‹ค.

์ฝ๊ธฐ๋Š” 100๋งŒ๊ฑด๋‹น 0.03๋‹ฌ๋Ÿฌ๋กœ ๊ฝค ์‹ธ๊ณ , ์“ฐ๊ธฐ ๋“ฑ์€ 1000๊ฐœ๋‹น 1๋‹ฌ๋Ÿฌ๋‹ค.
๊ทผ๋ฐ ์ด ๊ธฐ๋Šฅ์˜ ์‚ฌ์šฉ ํŒจํ„ด ์ž์ฒด๊ฐ€ ์ˆ˜์ •์ด ๋นˆ๋ฒˆํ•œ ๊ฒƒ์€ ์•„๋‹ˆ๋‹ˆ ๋ณ„ ๋ฌธ์ œ๊ฐ€ ๋  ๋ถ€๋ถ„์€ ์•„๋‹ˆ๋‹ค. ์ด์ƒํ•˜๊ฒŒ ์“ฐ์ง€๋งŒ ์•Š์œผ๋ฉด.




KeyValueStore ๋งŒ๋“ค๊ธฐ

์ผ๋‹จ ์Šคํ† ์–ด๋ถ€ํ„ฐ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด๋ณด์ž.

๊ทธ๋ƒฅ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋Œ€์ถฉ ๋งŒ๋“ค์–ด๋„ ๋œ๋‹ค. ์ด๋ฆ„๋งŒ ์ž˜ ์ง“์ž.


๊ทธ๋Ÿผ ์•ฝ๊ฐ„์˜ ๋”œ๋ ˆ์ด์™€ ํ•จ๊ป˜ ๋งŒ๋“ค์–ด์ง€๋Š”๋ฐ, ์ด๊ฒƒ ์ž์ฒด๊ฐ€ ์ผ์ข…์˜ ํ…Œ์ด๋ธ”์˜ ์—ญํ• ์„ ํ•œ๋‹ค.


์–ธ์ œ๋“  ๊ฐ’์„ ์‹ค์‹œ๊ฐ„์œผ๋กœ ์ถ”๊ฐ€ํ•˜๊ฑฐ๋‚˜ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋‹ค.




A/B ๋ผ์šฐํŒ… ๊ตฌ์„ฑํ•ด๋ณด๊ธฐ

KeyValue ์Šคํ† ์–ด๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ A/B ๋ผ์šฐํŒ… ํ™•๋ฅ  ๊ฐ€์ค‘์น˜๋ฅผ ์กฐ์ •ํ•˜๋Š” ๊ตฌ์„ฑ์„ ์งœ๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.

๋‚˜๋Š” /abtest๋ผ๋Š” ๊ฒฝ๋กœ๋กœ ์ ‘์†์„ ์‹œ๋„ํ• ๋•Œ, ๊ฐ€์ค‘์น˜์— ๋”ฐ๋ผ /abtest/a.html, /abtest/b.html ๋ฆฌ์†Œ์Šค์— ๋ผ์šฐํŒ…์„ ์‹œํ‚ค๋ ค๊ณ  ํ•œ๋‹ค. (URI ๋ฆฌ๋””๋ ‰์…˜ ์—†์ด)

๋จผ์ € s3์— ํŒŒ์ผ์„ ์ ์ ˆํžˆ ์—…๋กœ๋“œํ–ˆ๋‹ค.

๋ณ„๊ฑด์—†๋‹ค.

๊ทธ๋ฆฌ๊ณ  Cloudfront ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“  ํ›„์—

KeyValueStore๋ฅผ ์—ฐ๊ด€์‹œ์ผœ์ค€๋‹ค.
๊ทธ๋Ÿผ ์ € ํ•จ์ˆ˜์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ณ ์œ  ID๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

ํ•จ์ˆ˜ ์‚ฌ์šฉ๋ฒ•์— ๋Œ€ํ•ด์„œ๋Š” ๋ณ„๋„ ํฌ์ŠคํŠธ๋ฅผ ์ฐธ๊ณ ํ•œ๋‹ค.
https://blog.naver.com/sssang97/223368455944


์šฐ์„  Store์— ์ดˆ๊ธฐ๊ฐ’์„ ์„ค์ •ํ•ด์ฃผ๊ณ 

Function์— ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•œ๋‹ค.

import cf from "cloudfront";

const kvsId = "...b00ac861e1d1";

const kvsHandle = cf.kvs(kvsId);

async function handler(event) {
  const request = event.request;

  if (request.uri == "/abtest") {
    try {
      let aWeight = await kvsHandle.get("a_weight");
      let bWeight = await kvsHandle.get("b_weight");

      aWeight = aWeight ? parseInt(aWeight) : 0;
      bWeight = bWeight ? parseInt(bWeight) : 0;

      const percentOfA = aWeight / (aWeight + bWeight);

      const newUri = Math.random() < percentOfA ? "/abtest/a.html" : "/abtest/b.html";

      request.uri = newUri;
      return request;
    } catch (err) {
      console.log(`${request.uri} | ${err}`);
      return request;
    }
  } else {
    return request;
  }
}

๊ฐ€์ค‘์น˜์— ๋”ฐ๋ผ ํ™•๋ฅ ๋กœ ๋งค์นญ์‹œ์ผœ์ฃผ๋Š” ๊ฐ„๋‹จํ•œ ์ฝ”๋“œ๋‹ค.
/abtest ๊ฒฝ๋กœ๋กœ ๋“ค์–ด์˜ฌ๋•Œ๋งŒ ํŠน๋ณ„ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์คฌ๋‹ค.

ํ•จ์ˆ˜ ์ฝ”๋“œ๋ฅผ ๋ฐฐํฌํ•˜๊ณ ,

Cloudfront ๋™์ž‘์˜ ๋ทฐ์–ด ์š”์ฒญ์— ํŠธ๋ฆฌ๊ฑฐํ•œ๋‹ค.

๊ทธ๋ฆฌ๊ณ  /abtest๋กœ ์ ‘์†ํ•ด๋ณด๋ฉด

๋†’์€ ํ™•๋ฅ ๋กœ A๋กœ๋งŒ ๋ผ์šฐํŒ…๋˜๊ณ , ๋‚ฎ์€ ํ™•๋ฅ ๋กœ B๊ฐ€ ๋ผ์šฐํŒ…๋ ๊ฒƒ์ด๋‹ค.

๋ฐ˜๋Œ€๋กœ ๊ฐ€์ค‘์น˜๋ฅผ ๋ฐ”๊ฟ”๋ณด๋ฉด

์ „ํŒŒ์—๋Š” ๋ช‡์ดˆ ์ •๋„๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค.

๊ทธ๋Ÿฌ๋ฉด ์ด์ œ ๋ฐ˜๋Œ€๋กœ

B๊ฐ€ ๋นˆ๋ฒˆํ•˜๊ฒŒ ๋ผ์šฐํŒ…๋œ๋‹ค.

์ด๋Ÿฐ ๋А๋‚Œ์œผ๋กœ ์‚ฌ์šฉํ•˜๋ฉด ๋œ๋‹ค.



์ฐธ์กฐ
https://aws.amazon.com/ko/blogs/korea/introducing-amazon-cloudfront-keyvaluestore-a-low-latency-datastore-for-cloudfront-functions/
https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/kvs-with-functions.html