[AWS] S3 (Simple Storage Service)

S3๋Š” ์•„๋งˆ์กด์—์„œ ์ œ๊ณตํ•˜๋Š” ์ €์žฅ๊ณต๊ฐ„ ์„œ๋น„์Šค๋‹ค.
๊ทธ๋ƒฅ ํ‰์†Œ์— ์“ฐ๋˜ ๋“œ๋กญ๋ฐ•์Šค, ๊ตฌ๊ธ€ ํด๋ผ์šฐ๋“œ ์ฒ˜๋Ÿผ ๋ฆฌ์†Œ์Šค ํŒŒ์ผ๋“ค์„ ์˜ฌ๋ ค๋‘๊ณ  ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋Š”๊ฑด๋ฐ, ์•„๋งˆ์กด์˜ ์„œ๋น„์Šค์™€ ๋ฐ”๋กœ ์—ฐ๋™๋œ๋‹ค๋Š” ์ ์ด ๋‹ค๋ฅด๋‹ค.

๋ณดํ†ต ์ด๋ฏธ์ง€๋‚˜ ๋™์˜์ƒ ๊ฐ™์€ ๋ฏธ๋””์–ด ํŒŒ์ผ๋“ค์„ ์ €์žฅํ•  ๋•Œ ์‚ฌ์šฉํ•œ๋‹ค.
์ข€ ๋น„์‹ผ ํŽธ์ด๊ธด ํ•˜์ง€๋งŒ ๊ฐ์ˆ˜ํ• ๋งŒํ•œ ์ •๋„๋‹ค.

๊ธฐ๋ณธ์ ์œผ๋กœ ์ €์žฅํ•œ ์šฉ๋Ÿ‰์— ๋Œ€ํ•ด์„œ ๋‹ค๋‹ฌ์ด ์š”๊ธˆ์ด ๋ถ€๊ณผ๋˜๊ณ , ํŒŒ์ผ์„ ์˜ฌ๋ฆฌ๊ฑฐ๋‚˜ ์กฐํšŒํ• ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ํŠธ๋ž˜ํ”ฝ์— ๋Œ€ํ•ด์„œ๋„ ์š”๊ธˆ์ด ๋‚˜์˜จ๋‹ค.




๋ฒ„ํ‚ท ๋งŒ๋“ค๊ธฐ

S3๋Š” ๋ฒ„ํ‚ท์ด๋ผ๋Š” ๋‹จ์œ„๋กœ ๊ด€๋ฆฌ๋œ๋‹ค.
๊ทธ๋ƒฅ ๊ฐ์ž์˜ ๊ฒฉ๋ฆฌ๋œ ์ €์žฅ๊ณต๊ฐ„์ด๋ผ๊ณ  ๋ณด๋ฉด ๋œ๋‹ค.

์ง€์ •ํ•  ์˜ต์…˜์ด ๊ทธ๋ ‡๊ฒŒ ๋งŽ์ง€๋Š” ์•Š๋‹ค.
์ด๋ฆ„์„ ์ž˜ ์ง“๊ณ 

์ด๋ฏธ์ง€๋ฅผ ๋ˆ„๊ตฌ๋‚˜ ๋ณผ ์ˆ˜ ์žˆ๊ฒŒ ์—ด์–ด์ค„ ํ•„์š”๊ฐ€ ์žˆ๋‹ค๋ฉด ํผ๋ธ”๋ฆญ ์•ก์„ธ์Šค ์ฐจ๋‹จ์„ ๋น„ํ™œ์„ฑํ™”ํ•œ๋‹ค.

๋งŒ์•ฝ ํŒŒ์ผ์ด ๋ฎ์–ด์”Œ์›Œ์ง€๊ฑฐ๋‚˜ ์ง€์›Œ์ง€๋Š”๊ฒŒ ๋”์ฐํ•˜๊ฒŒ ์‹ซ๋‹ค๋ฉด ๋ฒ„์ „๊ด€๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ์ข‹๊ฒ ๋‹ค.

๊ทธ๋Ÿผ ์ด๋ ‡๊ฒŒ ๋ฒ„ํ‚ท ํŽ˜์ด์ง€๊ฐ€ ์ƒ์„ฑ๋˜๋Š”๋ฐ

์—…๋กœ๋“œ ๋ฒ„ํŠผ์„ ๋ˆ„๋ฅด๋ฉด ํŒŒ์ผ์„ ์—…๋กœ๋“œํ•  ์ˆ˜ ์žˆ๊ณ , ํŒŒ์ผ์„ ๋“œ๋ž˜๊ทธํ•ด์„œ ์˜ฌ๋ฆด ์ˆ˜๋„ ์žˆ๊ณ ...
๊ธฐ๋ณธ์ ์ธ ์‚ฌ์šฉ๋ฒ•์€ ๋“œ๋กญ๋ฐ•์Šค ๊ฐ™์€ ์ผ๋ฐ˜์‚ฌ์šฉ์ž์šฉ ํด๋ผ์šฐ๋“œ์™€ ํฐ ์ฐจ์ด๋Š” ์—†๋‹ค.

ํด๋”๋„ ๋งŒ๋“ค๊ณ 

ํŒŒ์ผ๋„ ์˜ฌ๋ฆฌ๊ณ 

๋‹ค์šด๋ฐ›๊ฑฐ๋‚˜ ๋ณด๊ณ ..

์ด๋Ÿฐ ์ผ์ƒ์ ์ธ ๊ฒƒ๋“ค์€ ์ƒ์„ธํ•œ ์„ค๋ช… ์—†์ด๋„ ๋Œ€์ถฉ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฆฌ๋ผ ์ƒ๊ฐํ•œ๋‹ค.

์ด์ œ ๋žŒ๋‹ค๋ฅผ ํ†ตํ•ด ํ•œ๋ฒˆ S3์— ์ ‘๊ทผํ•˜๊ณ , ์—…๋กœ๋“œ๋ฅผ ์ˆ˜ํ–‰ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ๋‹ค.




Lambda๋กœ S3์— ์—…๋กœ๋“œํ•˜๊ธฐ (Node.js)

์ผ๋‹จ ํ•จ์ˆ˜๋ฅผ ํ•˜๋‚˜ ๋งŒ๋“ค์–ด๋ณด๊ฒ ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์™ธ๋ถ€์—์„œ ์ ‘์†ํ•  ์ˆ˜ ์žˆ๊ฒŒ ๊ฒŒ์ดํŠธ์›จ์ด๋„ ๋Œ€์ถฉ ๋‹ฌ์•„์ค€๋‹ค.

๋˜, S3์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋„๋ก ๊ถŒํ•œ๋„ ๋ถ€์—ฌํ•ด์ฃผ์ž

์‹คํ–‰ ์—ญํ• ์— ๋“ค์–ด๊ฐ€

์ •์ฑ… ์—ฐ๊ฒฐ

s3 ๊ถŒํ•œ์„ ์—ฐ๊ฒฐํ•ด์ค€๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๊ท€์ฐฎ์€ ๋ฉ€ํ‹ฐํŒŒํŠธ ํŒŒ์‹ฑ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•ด์ค„ lambda-multipart-parser ๋ชจ๋“ˆ์„ ๋ ˆ์ด์–ด๋กœ ๋ถ™์—ฌ์ค€๋‹ค.

๊ทธ๋Ÿผ ๋ฐ‘์ž‘์—…์€ ๋Œ€์ถฉ ๋œ ๊ฒƒ์ด๋‹ค.

์„œ๋ฒ„ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹์œผ๋กœ ์งค ์ˆ˜ ์žˆ๋‹ค.
upload ํ•จ์ˆ˜์— ํŒŒ์ผ๋ช…(Key)๊ณผ ๋ฒ„ํ‚ท๋ช…(Bucket), ํŒŒ์ผ๋ฐ์ดํ„ฐ(Body), ์ ‘๊ทผ ๊ถŒํ•œ(ACL)์„ ์ง€์ •ํ•ด์„œ ํ˜ธ์ถœํ•˜๋ฉด ๋œ๋‹ค.

const aws = require('aws-sdk');
const s3 = new aws.S3();

const parser = require('lambda-multipart-parser');

exports.handler = async (event) => {
    const {files} = await parser.parse(event);

    console.log('## ํŒŒ์ผ');
    console.log(files);

    const result = await s3.upload({
        Key: `/public/${Date.now()}.jpg`, // ํŒŒ์ผ path
        Bucket: 'boom-bucket', // ๋ฒ„ํ‚ท๋ช…
        Body: files?.[0]?.content, // ํŒŒ์ผ ๋ฐ์ดํ„ฐ
        ContentEncoding: "base64", // ํŒŒ์ผ์˜ ์ธ์ฝ”๋”ฉ ํ˜•์‹. (๋žŒ๋‹ค๋Š” ๋ญ๋“  base64๋กœ ๋ฐ›์•„์˜ด)
        ContentType: "image/jpeg",
        ACL: 'public-read', // ์ฝ๊ธฐ๋Š” ํผ๋ธ”๋ฆญ
    }).promise();

    const response = {
        statusCode: 200,
        body: JSON.stringify(result),
    };

    return response;
};

๊ทธ๋Ÿฐ๋ฐ ์—ฌ๊ธฐ์„œ ์กฐ๊ธˆ ๊ท€์ฐฎ์•˜๋˜๊ฒŒ, ์ด๋ฏธ์ง€๋ฅผ ๋ฐ›์„ ๋ฉ€ํ‹ฐํŒŒํŠธ ๋ฐ์ดํ„ฐ๋ฅผ ๋žŒ๋‹ค์—์„  ์ข€ ๋ถˆํŽธํ•˜๊ฒŒ ๋ฐ›์•„์˜จ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.
๋ชฝ๋•… base64๋กœ ๋ฐ›๋Š”๋ฐ๋‹ค ํŒŒ์‹ฑํ•˜๊ธฐ๋„ ์ข€ ๊ท€์ฐฎ์•„์„œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ lambda-multipart-parser๋ฅผ ๋Œ€์ถฉ ๊ฐ–๋‹ค์ผ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์—…๋กœ๋“œ ํŽ˜์ด์ง€ ์ฝ”๋“œ๋‹ค. ๋ณ„๊ฑฐ์—†๋‹ค.

<html>
    <script>
    </script>
    <body>
        <h1>ํ…Œ์ŠคํŠธ</h1>
        <form action="https://qdx7bkukn8.execute-api.ap-northeast-2.amazonaws.com/default/s3_test" method="POST" enctype="multipart/form-data">
            <input type="file" name="image">
            <button>ํŒŒ์ผ ์ „์†ก</button>
        </form>
    </body>
</html>

์ €๊ฑธ๋กœ ํŒŒ์ผ์„ ์ฒจ๋ถ€ํ•˜๊ณ  ์—…๋กœ๋“œ๋ฅผ ์‹œ๋„ํ•˜๋ฉด

์˜ฌ๋ผ๊ฐ”๋‹ค๊ณ  ํŒŒ์ผ๊ฒฝ๋กœ๋ฅผ ๋Œ๋ ค์ค„ ๊ฒƒ์ธ๋ฐ

S3์— ๊ฐ€๋„ ์ง€์ •ํ•œ๋Œ€๋กœ ์ž˜ ์˜ฌ๋ผ๊ฐ€์žˆ์„ ๊ฒƒ์ด๋‹ค.

๋šœ๋‘”



์ฐธ์กฐ
https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#upload-property
https://stackoverflow.com/questions/27980612/converting-base64-to-blob-in-javascript/27980815
https://www.npmjs.com/package/lambda-multipart-parser