Day28(4.20)

ShinJuYongยท2022๋…„ 4์›” 21์ผ
0

camp

๋ชฉ๋ก ๋ณด๊ธฐ
27/44
post-thumbnail

Cloud Function

๐Ÿšฝ ์–ด๋ ต์Šต๋‹ˆ๋‹ค ๐Ÿšฝ

GCP์—์„œ ์ง€์›ํ•˜๋Š” aws์˜ lambda๊ฐ™์€๊ฒƒ
Cloud Stroage์— ์ด๋ฏธ์ง€๊ฐ€ ์ €์žฅ๋˜๋ฉด ์ธ๋„ค์ผ์ด๋ฏธ์ง€๋ฅผ ์ €์žฅํ•˜๋Š” ํŠธ๋ฆฌ๊ฑฐ๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค

"use strict";
const { Storage } = require("@google-cloud/storage");
const sharp = require("sharp");

// ๊ตฌ๊ธ€ ํด๋ผ์šฐ๋“œ ์Šคํ† ๋ฆฌ์ง€ ๊ฐ์ฒด๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
const storage = new Storage();

// ํ•จ์ˆ˜ ON
exports.processThumbImage = async (file, context) => {
  // if๋ฌธ์œผ๋กœ ์ธ๋„ค์ผ์ด ๋“ค์–ด์™”์œผ๋ฉด ๊ทธ๋ƒฅ ๋ฆฌํ„ด์‹œ์ผœ์„œ ํ•จ์ˆ˜๋ฅผ ์ข…๋ฃŒ์‹œํ‚จ๋‹ค.
  if (file.name.search(`thumb@`) != -1) return;

  // ํ˜„์žฌ ๋ฒ„ํ‚ท์„ ์ฐพ์•„์„œ ๊ฐ์ฒดํ• ๋‹นํ•œ๋‹ค.
  const scrBucket = storage.bucket(file.bucket);

  // ๋ณ€ํ™˜ํ•  ์‚ฌ์ด์ฆˆ
  const sizes = [320, 640, 1280];
  // ์‚ฌ์ด์ฆˆ ํฌ๊ธฐ๋งŒํผ ๋ˆ๋‹ค (Promise๊ฐ์ฒด๋ฅผ ๋งŒ๋“ค๊ธฐ์œ„ํ•ด~)
  const uploadPromises = sizes.map((size) => {
    // ์ธ๋„ค์ผ ๋””๋ ‰ํ† ๋ฆฌ / ์‚ฌ์ด์ฆˆ / ์ธ๋„ค์ผ์‚ฌ์ด์ฆˆ์ด๋ฆ„ / ํŒŒ์ผ๋ช…
    let thumbName = "";
    // ๋ถ„๋ฅ˜
    if (size == 320) {
      thumbName = `thumb/s/thumb@${size}_${file.name}`;
    }
    if (size == 640) {
      thumbName = `thumb/m/thumb@${size}_${file.name}`;
    }
    if (size == 1280) {
      thumbName = `thumb/l/thumb@${size}_${file.name}`;
    }

    // if else๋กœ ๋ถ„๊ธฐํ•œ๋‹ค.
    // ๋ถ„๊ธฐํ•˜์ง€ ์•Š์œผ๋ฉด ๋ฌดํ•œ์œผ๋กœ ํŒŒ์ผ์ด ๋งŒ๋“ค์–ด์ง
    if (file.name.search(`thumb@`) == -1) {
      // ๋งŒ์•ฝ ํŒŒ์ผ์˜์ด๋ฆ„์— ์ธ๋„ค์ผ์ด ๋“ค์–ด๊ฐ€์žˆ์ง€ ์•Š๋‹ค๋ฉด
      const gcsObject = scrBucket.file(file.name);
      const gcsNewObject = scrBucket.file(thumbName);

      // ํ˜„์žฌ ํŒŒ์ผ์„ ์ฝ๋Š” ์ŠคํŠธ๋ฆผ๊ณผ
      const srcStream = gcsObject.createReadStream();
      // ์•ž์œผ๋กœ ์“ธ ํŒŒ์ผ์—๋Œ€ํ•œ ์ŠคํŠธ๋ฆผ์„ ๋งŒ๋“ ๋‹ค
      const dstStream = gcsNewObject.createWriteStream();

      // Sharp ์ด๋ฏธ์ง€ ๋ฆฌ์‚ฌ์ด์ฆˆ ๊ฐ์ฒด ์ƒ์„ฑ
      const resizer = sharp().resize(size).png();

      // ํ˜„์žฌํŒŒ์ผ์— pipe๋กœ ์‚ฌ์ด์ฆˆ๋ฅผ ์กฐ์ ˆํ›„
      // dstStream์— ๋ฎ์–ด์“ด๋‹ค
      srcStream.pipe(resizer).pipe(dstStream);

      // ์ตœ์ข…์ ์œผ๋กœ ๊ฒฐ๊ณผ๋ฌผ์„ ํ”„๋กœ๋ฏธ์Šค์— ๋‹ด์•„ ์ €์žฅํ•œ๋‹ค.
      return new Promise((resolve, reject) => {
        dstStream
          .on("error", (err) => {
            console.log(`error : ${err}`);
            reject(err);
          })
          .on("finish", () => {
            console.log(`Success : ${file.name} -> ${thumbName}`);
          });
      });
    } else {
      // ๋“ค์–ด์˜จํŒŒ์ผ์ด ์ธ๋„ค์ผํŒŒ์ผ์ด๋ผ๋ฉด ์—๋Ÿฌ๋ฐœ์ƒ
      console.log("Error Error!");
      return;
    }
  });

  // ๋“ค์–ด์˜จ ํ”„๋กœ๋ฏธ์Šค๋ฅผ all์„ํ†ตํ•ด ๋ณ‘๋ ฌ์‹คํ–‰
  await Promise.all(uploadPromises);

  return;
};

์ฐธ๊ณ ํ•œ๊ณณ
๊ตฌ๊ธ€-ํด๋ผ์šฐ๋“œ-ํ”Œ๋žซํผ-ํ•จ์ˆ˜๊ด€๋ จ ์ฑŒ๋ฆฐ์ง€
Sharp()๋ฅผ ํ™œ์šฉํ•œ ์ด๋ฏธ์ง€ ๋ฆฌ์‚ฌ์ด์ง•

์œ„ ๋‘๊ณณ์—์„œ ํ•จ์ˆ˜๊ด€๋ จ ์ฑŒ๋ฆฐ์ง€๋กœ ์ด๋ฏธ์ง€ ์—…๋กœ๋“œ๋ฅผ ํ…Œ์ŠคํŠธํ–ˆ๊ณ 
Sharp()๋ฅผ ํ™œ์šฉํ•œ ์ด๋ฏธ์ง€ ๋ฆฌ์‚ฌ์ด์ง•์—์„  ๋ณ‘๋ ฌ์ฒ˜๋ฆฌ์™€ Shapr()์ฒ˜๋ฆฌ๋ฅผ ์‘์šฉํ–ˆ๋‹ค

๋ฉ”์ธํ”„๋กœ์ ํŠธ - ์ธ๋„ค์ผํŠธ๋ฆฌ๊ฑฐ

๋ฉ”์ธํ”„๋กœ์ ํŠธ

์•Œ๊ณ ๋ฆฌ์ฆ˜

ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค-LV1-์ฒด์œก๋ณต

profile
ํƒ€์Šค

0๊ฐœ์˜ ๋Œ“๊ธ€