ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • cloudflare R2 ์—ฐ๋™
    ๐Ÿ“˜ Node.js 2026. 4. 7. 06:46

    โญ cloudflare R2๋ž€?

     

    cloudflare ์ž์ฒด๋Š” ํ”Œ๋žซํผ ์ „์ฒด๋ฅผ ์˜๋ฏธํ•˜๋ฉฐ ๊ทธ์ค‘์— R2๋Š” ์Šคํ† ๋ฆฌ์ง€ ๊ธฐ๋Šฅ ํ•˜๋‚˜๋ฅผ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

    ์ฆ‰, cloudflare R2๋Š” ๋Œ€์šฉ๋Ÿ‰ ํŒŒ์ผ(์ด๋ฏธ์ง€, ์˜์ƒ, ๋ฐ์ดํ„ฐ ๋“ฑ)์„ ์ €์žฅํ•˜๋Š” ํด๋ผ์šฐ๋“œ ์Šคํ† ๋ฆฌ์ง€ ์„œ๋น„์Šค์ž…๋‹ˆ๋‹ค.

     

    ๐ŸŒ ํŠน์ง•

    1. AWS S3 ๋“ฑ์€ ๋ฐ์ดํ„ฐ๋ฅผ ๊บผ๋‚ผ ๋•Œ ๋น„์šฉ์ด ๋“ค์ง€๋งŒ R2๋Š” ๋ฐ์ดํ„ฐ ๋‹ค์šด๋กœ๋“œ ๋น„์šฉ์ด ์—†์Œ

    2. AWS S3 API์™€ ๊ฑฐ์˜ ๋™์ผํ•˜์—ฌ ๊ธฐ์กด S3 ์ฝ”๋“œ ๊ทธ๋Œ€๋กœ ์“ฐ๊ธฐ ์‰ฌ์›€

    3. cloudflare์˜ CDN ์„œ๋น„์Šค์™€ ๊ฒฐํ•ฉ๋˜์–ด ๋ฐ์ดํ„ฐ ์ „์†ก์†๋„๊ฐ€ ๋น ๋ฆ„

    AWS S3์™€ ๊ฐ„๋‹จ ๋น„๊ต

    ๊ตฌ๋ถ„ Cloudflare R2 AWS S3 (Standard)
    ๋ฐ์ดํ„ฐ ์†ก์‹ ๋ฃŒ ๋ฌด๋ฃŒ ($0) ์œ ๋ฃŒ (GB๋‹น ๋ถ€๊ณผ)
    ์ €์žฅ ๋น„์šฉ ์•ฝ $0.015 / GB ์•ฝ $0.023 / GB (๋ฆฌ์ „๋ณ„ ์ƒ์ด)
    ํ˜ธํ™˜์„ฑ S3 API ํ˜ธํ™˜ ํ‘œ์ค€ S3 API
    ๋ฆฌ์ „ ์„ค์ • ์ž๋™ (๊ธ€๋กœ๋ฒŒ ๋ถ„์‚ฐ) ์‚ฌ์šฉ์ž ์ง์ ‘ ์„ ํƒ

     

    ๋ฌธ์„œ๊ฒ€์ƒ‰์‹œ์Šคํ…œ์„ ๊ฐœ๋ฐœํ•˜๋ฉด์„œ ๋‹ค์šด๋กœ๋“œ ํŒŒ์ผ์˜ ์‹ค์ฒด๋ฅผ ์–ด๋””์—์„œ ๊ด€๋ฆฌ๋ฅผ ํ•˜๋ฉด ์ข‹์„๊นŒ ๊ณ ๋ฏผํ•˜๋‹ค๊ฐ€

    AWS S3๋Š” ํ”„๋ฆฌํ‹ฐ์–ด๋ผ ํ•ด์„œ ์ฒ˜์Œ ๊ฐ€์ž…ํ•˜๋ฉด 1๋…„๋™์•ˆ 5GB ์šฉ๋Ÿ‰ ๋ฌด๋ฃŒํ˜œํƒ์ด๋ผ๋Š” ์ข‹์€ ๋ถ€๋ถ„์ด ์žˆ์—ˆ์ง€๋งŒ,

    cloudflare R2 ๋˜ํ•œ ๋ฌด๋ฃŒํ˜œํƒ์œผ๋กœ 10GB ์ €์žฅ ๋ฌด๋ฃŒ๋ผ๊ณ  ํ•˜๋”๊ตฐ์š”.

    ์ €๋Š” ์ด๋ฏธ ๊ฐ€์ž…ํ•œ์ง€ ์ˆ˜๋…„์ด ์ง€๋‚œ ์ง€๊ธˆ ์ƒˆ๋กญ๊ฒŒ ๊ฐ€์ž…ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ ๊ฒƒ์„ ํ•ด๋ณด์ž๋Š” ๋งˆ์Œ์—

    cloudflare R2๋ฅผ ์„ ํƒํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

     

     

    โญ cloudflare R2 ์‹œ์ž‘ํ•˜๊ธฐ

    ์šฐ์„  cloudflare ํ™ˆํŽ˜์ด์ง€์— ๋“ค์–ด๊ฐ€์ค๋‹ˆ๋‹ค.

     

    https://www.cloudflare.com/ 

     

    Connect, protect, and build everywhere

    Make employees, applications and networks faster and more secure everywhere, while reducing complexity and cost.

    www.cloudflare.com

     

    ๊ตฌ๊ธ€์— cloudflare๋ผ๊ณ  ๊ฒ€์ƒ‰ํ•˜์…”๋„ ์ตœ์ƒ๋‹จ์— ๋ฐ”๋กœ ์‚ฌ์ดํŠธ๊ฐ€ ๋…ธ์ถœ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

     

    ๋กœ๊ทธ์ธ์„ ํ•˜์‹œ๊ฒŒ ๋˜๋ฉด

     

     

     

    ํ•ด๋‹น ๋ถ€๋ถ„์„ ํด๋ฆญํ•ด์ฃผ์‹œ๊ฒŒ ๋˜๋ฉด

     

     

    ์œ„์™€ ๊ฐ™์ด ๊ฒฐ์ œ์ˆ˜๋‹จ์„ ๋“ฑ๋กํ•˜๋ผ๊ณ  ๋œน๋‹ˆ๋‹ค.

     

    cloudflare์—์„œ ๋ด‡(Bot)์ด๋‚˜ ์„œ๋น„์Šค๋ฅผ ๋‚จ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด ์‹ค์ œ ์นด๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๋Š” ๊ณผ์ •์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

     

    ๋ฌด๋ฃŒ ๋ฒ”์œ„(10GB ๋“ฑ) ๋‚ด์—์„œ๋Š” ๊ฒฐ์ œ๊ฐ€ ์ ˆ๋Œ€ ๋˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ๋‚˜์™€์žˆ์œผ๋‹ˆ ํ™•์ธ ํ›„ ๋“ฑ๋กํ•˜์‹œ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

     

    ์ €๋Š” ์ž”๊ณ ๊ฐ€ 0์›์ธ ์ฒดํฌ์นด๋“œ๋กœ ๋“ฑ๋กํ–ˆ์Šต๋‹ˆ๋‹ค :)

     

     

     

    ์œ„์™€ ๊ฐ™์ด ๋œจ๋ฉด ์นด๋“œ ๋“ฑ๋ก์ด ์ •์ƒ์ ์œผ๋กœ ์™„๋ฃŒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

     

     

    ๋‹ค์‹œ R2 object storage ->  Overview๋กœ ๊ฐ€์‹œ๋ฉด

     

    ์œ„ ์‚ฌ์ง„๊ณผ ๊ฐ™์ด ๋œจ๊ฒŒ ๋˜๋Š”๋ฐ ์—ฌ๊ธฐ์—์„œ Create bucket์„ ๋ˆŒ๋Ÿฌ์ฃผ๋ฉด ๋ฉ๋‹ˆ๋‹ค.

     

     

    Location์ค‘ Automatic์€ cloudflare๊ฐ€ ์•Œ์•„์„œ ์ตœ์  ์œ„์น˜๋ฅผ ์„ ํƒํ•ฉ๋‹ˆ๋‹ค.

    ๋ณดํ†ต ์‚ฌ์šฉ์ž์™€ ๊ฐ€๊นŒ์šด ์ง€์—ญ์„ ์„ ํƒํ•˜๋Š”๋ฐ, ์•„์‹œ์•„๋ฉด Asia Pacific์„ ์„ ํƒํ•œ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

    Specify jurisdiction์€ ํŠน์ • ์ง€์—ญ/๊ตญ๊ฐ€์—์„œ๋งŒ ์ €์žฅํ•˜๋„๋ก ์ œํ•œ์„ ๋‘๋Š”๊ฒƒ์ž…๋‹ˆ๋‹ค.

     

    Default Storage Class์—์„œ Standard๋Š” ์ž์ฃผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ์ดํ„ฐ์šฉ, ๋น ๋ฅด๊ฒŒ ์ ‘๊ทผ ๊ฐ€๋Šฅ, ๊ธฐ๋ณธ ์˜ต์…˜

    ์ฆ‰, ์ด๋ฏธ์ง€, ์‚ฌ์šฉ์ž ์—…๋กœ๋“œ ํŒŒ์ผ, API์—์„œ ์ž์ฃผ ์ฝ๋Š” ๋ฐ์ดํ„ฐ ์šฉ๋„์ž…๋‹ˆ๋‹ค.

     

    Infrequent Access๋Š” ๊ฑฐ์˜ ์•ˆ์“ฐ๋Š” ๋ฐ์ดํ„ฐ์šฉ, ์ €์žฅ ๋น„์šฉ์€ ๋” ์‹ธ์ง€๋งŒ ์ฝ์„ ๋•Œ ๋น„์šฉ/์ง€์—ฐ ์ฆ๊ฐ€

    ์ฆ‰, ๋ฐฑ์—… ํŒŒ์ผ, ๋กœ๊ทธ ์ €์žฅ, ์˜ค๋ž˜๋œ ๋ฐ์ดํ„ฐ ์šฉ๋„์ž…๋‹ˆ๋‹ค.

     

    Automatic, Standard๋ฅผ ์„ ํƒํ•˜๊ณ  Create bucket์„ ๋ˆ„๋ฆ…๋‹ˆ๋‹ค.

     

     

    ์œ„์˜ ์„ค์ •์—์„œ๋Š” ํ† ํฐ๋ช…์„ ์ ์œผ์‹œ๊ณ 

     

    ๊ถŒํ•œ์€ Object Read & Write๋กœ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

     

    ๊ทธ ๋‹ค์Œ ์šฐ์ธก ํ•˜๋‹จ์˜ ํŒŒ๋ž€์ƒ‰ ๋ฒ„ํŠผ์„ ํด๋ฆญํ•˜๊ฒŒ ๋˜๋ฉด ์ตœ์ข…์ ์œผ๋กœ

     

    Access Key ID, Secret Access Key ๋ฅผ ๋ฐœ๊ธ‰๋ฐ›๊ฒŒ ๋˜๋Š”๋ฐ, ์ ˆ๋Œ€ ์ฐฝ์„ ๋‹ซ์ง€ ๋ง๊ณ  ๋”ฐ๋กœ ๋ฉ”๋ชจ์žฅ์— ๋ณต์‚ฌํ•ด๋‘์„ธ์š”!

     

    ์—ฌ๊ธฐ๊นŒ์ง€ ๋งˆ๋ฌด๋ฆฌ ํ–ˆ์œผ๋ฉด, 

     

    R2_ACCESS_KEY_ID=๋ณต์‚ฌํ•œ_Access_Key_ID
    R2_SECRET_ACCESS_KEY=๋ณต์‚ฌํ•œ_Secret_Access_Key
    R2_ACCOUNT_ID=์‚ฌ์ง„์—_์žˆ๋˜_Account_ID
    R2_BUCKET_NAME=์ƒ์„ฑํ•œ_Bucket_Name

     

    ์œ„์™€ ๊ฐ™์ด .env ํŒŒ์ผ์„ ์ƒ์„ฑํ•ด์ค๋‹ˆ๋‹ค. Account ID๋Š” R2์˜ Overview์— ๋“ค์–ด๊ฐ€์‹œ๋ฉด

     

    ์šฐ์ธก์— Account Details๋ž€์— Account ID๊ฐ€ ์žˆ๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

     

     

    npm install @aws-sdk/client-s3 @aws-sdk/lib-storage dotenv

     

    R2(S3 ํ˜ธํ™˜)์™€ ์—ฐ๊ฒฐํ•  npm module์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

     

    ์—…๋กœ๋“œ ํ…Œ์ŠคํŠธ์šฉ jsํŒŒ์ผ์„ ํ•˜๋‚˜ ๋งŒ๋“œ์‹  ํ›„ 

     

    import { S3Client, PutObjectCommand } from "@aws-sdk/client-s3";
    import "dotenv/config";
    
    // 1. R2 ํด๋ผ์ด์–ธํŠธ ์„ค์ •
    const s3 = new S3Client({
      region: "auto",
      endpoint: process.env.R2_ENDPOINT,
      credentials: {
        accessKeyId: process.env.R2_ACCESS_KEY_ID,
        secretAccessKey: process.env.R2_SECRET_ACCESS_KEY,
      },
    });
    
    async function uploadTest() {
      const params = {
        Bucket: process.env.R2_BUCKET_NAME,
        Key: "test-file.txt", // R2์— ์ €์žฅ๋  ํŒŒ์ผ ์ด๋ฆ„
        Body: "Hello R2! This is a test upload.", // ํŒŒ์ผ ๋‚ด์šฉ
        ContentType: "text/plain",
      };
    
      try {
        const data = await s3.send(new PutObjectCommand(params));
        console.log("์—…๋กœ๋“œ ์„ฑ๊ณต!", data);
      } catch (err) {
        console.error("์—…๋กœ๋“œ ์‹คํŒจ:", err);
      }
    }
    
    uploadTest();

     

    ์œ„์™€ ๊ฐ™์ด ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ค๋‹ˆ๋‹ค.

     

    S3Client : R2 ์„œ๋ฒ„์™€ ์ปจ๋„ฅ์…˜ ํ•˜๊ธฐ ์œ„ํ•œ ๋ฉ”์ธ ํ†ต์‹  ์žฅ๋น„

    PutObjectCommand : ํŒŒ์ผ์„ ์ง‘์–ด๋„ฃ๊ธฐ ์œ„ํ•œ ๊ตฌ์ฒด์ ์ธ ๋ช…๋ น์„œ

    dotenv/config : ์•„๊นŒ ๋งŒ๋“  .env ํŒŒ์ผ์˜ ์ •๋ณด๋ฅผ ์ฝ์–ด์™€์„œ process.env์— ๋„ฃ์–ด์คŒ

     

    s3 ๋ณ€์ˆ˜๋Š” ์ด์ œ ๋‚ด ์„œ๋ฒ„์™€ R2 ์‚ฌ์ด์˜ ์ „์šฉํ†ต๋กœ๊ฐ€ ๋˜๋ฉฐ, ํ•ด๋‹น ์„ค์ •์ด ํ‹€๋ฆฌ๋ฉด "๊ถŒํ•œ ์—†์Œ" ๋˜๋Š” "์ฃผ์†Œ ์˜ค๋ฅ˜"๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

     

    s3.send๋ฅผ ํ†ตํ•ด R2 ์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

     

     

    ์„ฑ๊ณต์„ ํ•˜๊ฒŒ ๋˜๋ฉด ์œ„์™€ ๊ฐ™์ด ์‘๋‹ต์ด ์˜ค๋ฉด์„œ ์‹ค์ œ cloudflare์—์„œ R2์˜ Overview๋กœ ๋“ค์–ด๊ฐ€

     

    ์•„๊นŒ ์ƒ์„ฑํ–ˆ๋˜ Bucket์„ ํ™•์ธํ•˜๊ฒŒ ๋˜๋ฉด

     

     

    ์œ„์™€ ๊ฐ™์ด ํ…Œ์ŠคํŠธํŒŒ์ผ์ด ์ƒ์„ฑ๋œ ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Designed by Tistory.