๐ฝ ์ด๋ ต์ต๋๋ค ๐ฝ
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()์ฒ๋ฆฌ๋ฅผ ์์ฉํ๋ค