[TIL] 211219

Lee Syong·2021년 12ė›” 19ėž
0

TIL

ëŠĐ록 ëģīęļ°
123/204
post-thumbnail

📝 ė˜Ī늘 한 ęēƒ

  1. Heroku / AWS / multer S3

📚 ë°°ėšī ęēƒ

1. 배폎

1) Herokuė— 배폎

Heroku Gitė„ ėīėšĐ한 ë°Đëē•ė— ėīė–ī githubëĨž ėīėšĐí•ī 바로 Herokuė— 배폮할 ėˆ˜ë„ ėžˆë‹Ī.

(1) github ėīėšĐ

git push origin main 할 때마ë‹Ī ėžë™ėœžëĄœ ëđŒë“œę°€ ë‹Īė‹œ ė‹œėž‘되ëĐīė„œ 배폮가 된ë‹Ī.
git push heroku main ė„ ėž…ë Ĩ할 필ėš”ę°€ ė—†ė–ī 간íŽļ하ė§€ë§Œ ėĢžė˜ę°€ 필ėš”하ë‹Ī.

2) Amazon Web Services(AWS)

현ėžŽ ė„œëē„ëĨž 파ėž ė €ėžĨė†ŒëĄœ ė‚ŽėšĐ하ęģ  ėžˆë‹Ī.
ėī 때ëŽļė— ė•ąė„ 배폮할 때마ë‹Ī(git push ~) ëđŒë“œę°€ ë‹Īė‹œ ė‹œėž‘돞ė„œ ė›đ ė‚ŽėīíŠļė— ė—…ëĄœë“œë˜ė–ī ėžˆë˜ 데ėī터ë“Ī(ëđ„ë””ė˜Ī, 프로필 ė‚Žė§„)ėī ëŠĻ두 ė‚Žëžė§€ęēŒ 된ë‹Ī.

ëŽļė œëĨž í•īęē°í•˜ęļ° ėœ„í•ī AWSëĨž ėīėšĐ할 ėˆ˜ ėžˆë‹Ī.

(1) ëē„í‚· 만ë“Īęļ°

ęģ„ė •ė„ 만든 후 service - storage - s3로 ėī동하ė—Ž create bucket ëē„튞ė„ íīëĶ­í•œë‹Ī.
ëē„í‚· ėīëĶ„ė„ ėž‘ė„ąí•˜ęģ  ė§€ė—­ė„ ė„œėšļ로 ė„ íƒí•œ 후 ëē„í‚·ė„ 만든ë‹Ī.

(2) API key 만ë“Īęļ°

node.js ė„œëē„ę°€ AWSė™€ ėīė•žęļ°í•  ėˆ˜ ėžˆë„록 API keyëĨž 만ë“Īė–īė•ž 한ë‹Ī.
IAMė„ ęē€ėƒ‰í•ī ė‚ŽėšĐėž(users) 페ėīė§€ė—ė„œ ė‚ŽėšĐėž ėķ”ę°€ ëē„튞ė„ íīëĶ­í•œë‹Ī.
user nameė„ ęļ°ė–ĩ할 ėˆ˜ ėžˆëŠ” 만큾 ęļļęēŒ ėž‘ė„ąí•œ 후 ė•Ąė„ļėŠĪ í‚Ī - 프로ę·ļ래밍 ë°Đė‹ ė•Ąė„ļėŠĪëĨž ė„ íƒí•œë‹Ī.
ęķŒí•œė„ ė„Īė •í•˜ęļ° ėœ„í•ī ë‹ĪėŒ 페ėīė§€ëĄœ 넘ė–ī가ė„œ AmazonS3FullAccessëĨž ęē€ėƒ‰í•ī ėīëĨž ė„ íƒí•œë‹Ī.
ėī는 S3ė—ė„œ 할 ėˆ˜ ėžˆëŠ” ëŠĻ든 ęķŒí•œ ėĶ‰, 파ėžė„ ė—…ëĄœë“œí•  ėˆ˜ ėžˆëŠ” ęķŒí•œė„ ëķ€ė—Ží•˜ëŠ” ęēƒėīë‹Ī.
현ėžŽ 만ë“Īęģ  ėžˆëŠ” ęģ„ė •ėœžëĄœëŠ” ėīęēƒë§Œ 할 ėˆ˜ ėžˆë„록 하는 ęēƒėīë‹Ī.
태ę·ļ는 ė„Īė •í•  필ėš” ė—†ęģ  ë‹Īė‹œ 한 ëēˆ ė „ėēī ė„ íƒ ë‚īėšĐė„ 확ėļ한 후ė— 'ė‚ŽėšĐėž 만ë“Īęļ°' ëē„튞ė„ íīëĶ­í•œë‹Ī.

(3) API key ëģ€ėˆ˜ ėķ”ę°€í•˜ęļ°

ėī렇ęēŒ 만든 ė•Ąė„ļėŠĪ í‚Ī는 한 ëēˆë°–ė— ëģž ėˆ˜ ė—†ęļ° 때ëŽļė— ėĶ‰ė‹œ ėīëĨž ëģĩė‚Ží•īė„œ Heroku ė‚ŽėīíŠļė˜ Settingsė™€ 프로ė íŠļ íī더ė˜ .env 파ėžė— ėķ”ę°€í•œë‹Ī. (AWS_ID & AWS_SECRET)

(4) multer S3 íŒĻí‚Īė§€ ė„Īėđ˜ 및 ė‚ŽėšĐ ė„Īė •

multer-s3 ė°ļęģ 

multer S3 íŒĻí‚Īė§€ëĨž ėīėšĐ하ëĐī 파ėžė„ ė›đ ė‚ŽėīíŠļ ė„œëē„ 대ė‹  AWSė— ė—…ëĄœë“œí•  ėˆ˜ ėžˆë‹Ī.
파ėžė„ ė—…ëĄœë“œí•  때 파ėž ė‹œėŠĪ템 대ė‹  AWSëĨž ė‚ŽėšĐ하는 ęēƒėīë‹Ī.

$ npm i multer-s3

multer ëŊļë“Īė›Ļė–ī가 ėžˆëŠ” middlewares.js 파ėžė„ ėˆ˜ė •í•īė•ž 한ë‹Ī.
aws-sdk íŒĻí‚Īė§€ëĨž ė„Īėđ˜í•ī s3 objectëĨž 만든ë‹Ī.
ėī때 ė˜ĩė…˜ėœžëĄœ ė•žė„œ Herokuė˜ Settingsė™€ .env 파ėžė— ėķ”ę°€í•œ AWS_IDė™€ AWS_SECRETė„ ė „í•īėĪ˜ė•ž 한ë‹Ī.

$ npm i aws-sdk
// middlewares.js
import aws from "aws-sdk";
import multerS3 from "multer-s3";

const s3 = new aws.S3({
  credentials: {
    accessKeyId: process.env.AWS_ID,
    secretAccessKey: process.env.AWS_SECRET
  }
});

ėīëĨž 바탕ėœžëĄœ multerS3ëĨž 만든ë‹Ī.
uploadAvatarė™€ uploadVideo ëŊļë“Īė›Ļė–īė— storageëĨž ėķ”ę°€í•œë‹Ī.

// middlewares.js
const multerUploader = multerS3({
    s3: s3,
    bucket: "ëē„í‚· ėīëĶ„",
});

export const uploadAvatar = multer({
  dest: "uploads/avatars/",
  limit: {
    fileSize: 5000000,
  },
  storage: multerUploader, // ėķ”ę°€
});

export const uploadVideo = multer({
  dest: "uploads/videos/",
  limits: {
    fileSize: 10000000,
  },
  storage: multerUploader, // ėķ”ę°€
});

ė›đ ė‚ŽėīíŠļė—ė„œ 프로필 ė‚Žė§„ė„ ėˆ˜ė •í•œë‹Ī.
ę·ļ럮나 ė—ëŸŽę°€ 발ėƒí•īė„œ ė›đ ė‚ŽėīíŠļė—ė„œ ė‚Žė§„ėī ė œëŒ€ëĄœ ëģīėīė§€ ė•ŠëŠ”ë‹Ī.

ë‹Ī만, ëē„í‚·ė„ 확ėļí•īëģīëĐī 객ėēī가 ėƒęļī ęēƒė„ 확ėļ할 ėˆ˜ ėžˆë‹Ī.
파ėžė„ ė—…ëĄœë“œí•  때 더 ėīėƒ ë‚ī ėŧīí“Ļ터ė˜ íī더ė— ė €ėžĨ하ė§€ ė•Šęģ  AWSëĨž ė‚ŽėšĐ하는 ęēƒėīë‹Ī!

(5) object ęģĩ개 ė„Īė • / 파ėž src ėˆ˜ė •

(ë°Đęļˆ ė—…ëĄœë“œí•œ 파ėžė€ ęģĩ개되ė§€ ė•Šė•„ė„œ 필ėš” ė—†ęļ° 때ëŽļė— ëē„í‚·ė—ė„œ ė‚­ė œí•īėĪ€ë‹Ī.)

ė—…ëĄœë“œí•œ 파ėžė„ ė›đ ė‚ŽėīíŠļė—ė„œ ė œëŒ€ëĄœ ëģž ėˆ˜ ėžˆë„록 하ęļ° ėœ„í•ī ė—…ëĄœë“œëœ 파ėžë“Īė„ ęģĩ개í•īė•ž 한ë‹Ī.
'ëē„í‚· - ęķŒí•œ - 퍞ëļ”ëĶ­ ė•Ąė„ļėŠĪ ė°Ļë‹Ļ(ëē„í‚· ė„Īė •)'ėœžëĄœ ėī동한ë‹Ī.
'ėƒˆ 퍞ëļ”ëĶ­ ëē„í‚· 또는 ė•Ąė„ļėŠĪ ė§€ė  ė •ėą…ė„ í†ĩí•ī ëķ€ė—Žëœ ëē„í‚· 및 객ėēīė— 대한 퍞ëļ”ëĶ­ ė•Ąė„ļėŠĪ ė°Ļë‹Ļ'ęģž 'ėž„ė˜ė˜ 퍞ëļ”ëĶ­ ëē„í‚· 또는 ė•Ąė„ļėŠĪ ė§€ė  ė •ėą…ė„ í†ĩí•ī ëķ€ė—Žëœ ëē„í‚· 및 객ėēīė— 대한 퍞ëļ”ëĶ­ 및 ęĩė°Ļ ęģ„ė • ė•Ąė„ļėŠĪ ė°Ļë‹Ļ'만 ę·ļ대로 활ė„ąí™” ėƒíƒœëĄœ 두ęģ , ACLsė™€ ęī€ë Ļ된 ë‚īėšĐė€ ëđ„활ė„ąí™” 한ë‹Ī.

ë‹ĪėŒėœžëĄœ, Access Control List(ACL)ëĨž ė „ë‹Ží•īė•ž 한ë‹Ī.
누ęĩŽë‚˜ 파ėžė„ ė―ė„ ėˆ˜ ėžˆë„록 public-read로 ė „ë‹Ží•īė•ž 한ë‹Ī.

// middlewares.js
const multerUploader = multer({
  s3: s3,
  bucket: "ëē„í‚· ėīëĶ„",
  acl: "public-read", // ėķ”ę°€
});

한íŽļ, 파ėžė„ ė—…ëĄœë“œ 할 때마ë‹Ī users DBëĨž 확ėļí•īëģīëĐī avatarUrlėī null 값ė„ 가ė§€ëŠ” ęēƒė„ 확ėļ할 ėˆ˜ ėžˆë‹Ī.
ė—ëŸŽė˜ ė›ėļė„ 파ė•…하ęļ° ėœ„í•ī userController.jsė—ė„œ postEdit ėŧĻíŠļëĄĪ럮ëĨž ė‚īíŽīëģīëĐī ë‹ĪėŒęģž 같ë‹Ī.

// userController.js
export const postEdit = async (req, res) => {

  const updatedUser = await User.findByidAndUpdate(
    _id,
    {
      avatarUrl: file ? file.path : avatarUrl,
      // ėĪ‘ëžĩ
    },
  );
  
};

avatarUrlėī null 값ėī띾는 ęēƒė€ file.pathėī nullėī띾는 ëœŧėīë‹Ī.
console.log(file)ëĨž í•īëģīëĐī, fileė€ 더 ėīėƒ pathëĨž 가ė§€ęģ  ėžˆė§€ ė•Šęģ  locationė„ 가ė§€ęģ  ėžˆėœžëŊ€ëĄœ ęī€ë Ļ ė―”ë“œëĨž ëŠĻ두 ėˆ˜ė •í•īė•ž 한ë‹Ī.
또한, pug 파ėžė—ė„œ 파ėž srcė™€ ęī€ë Ļí•ī loggedInUser.avatarUrl ė•žė— ëķ™ė˜€ë˜ "/"ë“Īė„ ëŠĻ두 ė‚­ė œí•˜ë„록 한ë‹Ī.

ę·ļ럮나 ė—Žęļ°ęđŒė§€ í•ī도 ė—ëŸŽę°€ 발ėƒí•œë‹Ī.


âœĻ ë‚īėž 할 ęēƒ

  1. credentials request ė—ëŸŽ í•īęē°...
profile
ëŠĨ동ė ėœžëĄœ ė‚īėž, 행ëģĩ하ęēŒðŸ˜

0개ė˜ 댓ęļ€