관리 메뉴

Hey Tech

파일 μ—…λ‘œλ“œ μ›Ή νŽ˜μ΄μ§€ ꡬ좕: (6) AWS Lambda ν•¨μˆ˜ μž‘μ„± λ³Έλ¬Έ

SW 개발/Amazon Web Service

파일 μ—…λ‘œλ“œ μ›Ή νŽ˜μ΄μ§€ ꡬ좕: (6) AWS Lambda ν•¨μˆ˜ μž‘μ„±

Tony Park (ν† λ‹ˆ) 2022. 6. 10. 03:02
728x90
λ°˜μ‘ν˜•

πŸ“Œ μ‹œλ¦¬μ¦ˆ ν¬μŠ€νŒ…

1.  νŒŒμΌ μ—…λ‘œλ“œ μ›Ή νŽ˜μ΄μ§€ ꡬ좕: (1) React 기반 Frontend 개발
2.  νŒŒμΌ μ—…λ‘œλ“œ μ›Ή νŽ˜μ΄μ§€ ꡬ좕: (2) AWS IAM μ—­ν•  생성
3.  νŒŒμΌ μ—…λ‘œλ“œ μ›Ή νŽ˜μ΄μ§€ ꡬ좕: (3) AWS Lambda 생성
4.  νŒŒμΌ μ—…λ‘œλ“œ μ›Ή νŽ˜μ΄μ§€ ꡬ좕: (4) AWS S3 생성
5.  νŒŒμΌ μ—…λ‘œλ“œ μ›Ή νŽ˜μ΄μ§€ ꡬ좕: (5) AWS API Gateway 생성
6.  νŒŒμΌ μ—…λ‘œλ“œ μ›Ή νŽ˜μ΄μ§€ ꡬ좕: (6) AWS Lambda ν•¨μˆ˜ μž‘μ„±
7.  νŒŒμΌ μ—…λ‘œλ“œ μ›Ή νŽ˜μ΄μ§€ ꡬ좕: (7) Axios 기반 API Call
8.  νŒŒμΌ μ—…λ‘œλ“œ μ›Ή νŽ˜μ΄μ§€ ꡬ좕: (8) 파일 μ—…λ‘œλ“œ ν…ŒμŠ€νŠΈ
9.  νŒŒμΌ μ—…λ‘œλ“œ μ›Ή νŽ˜μ΄μ§€ ꡬ좕: (9) AWS S3 기반 μ›Ή ν˜ΈμŠ€νŒ…

πŸ‘¨‍πŸ’» λ“€μ–΄κ°€λ©°

λ³Έ ν¬μŠ€νŒ…μ—μ„œλŠ” Backend μ—­ν• λ‘œμ¨ Lambda ν•¨μˆ˜ μž‘μ„± μ½”λ“œλ₯Ό κ³΅μœ ν•©λ‹ˆλ‹€.

1.  전체 μ½”λ“œ

Lambda ν•¨μˆ˜μ— μž‘μ„±ν•΄μ•Ό ν•  전체 μ½”λ“œλŠ” μ•„λž˜μ˜ Github에 μ—…λ‘œλ“œν•˜μ˜€μœΌλ‹ˆ μ°Έκ³ ν•˜μ‹œκΈΈ λ°”λžλ‹ˆλ‹€.

https://github.com/park-gb/file-uploader-backend

 

park-gb/file-uploader-backend

AWS와 Reactλ₯Ό ν™œμš©ν•œ 파일 μ—…λ‘œλ“œ μ›Ή νŽ˜μ΄μ§€ κ΅¬ν˜„: Backend. Contribute to park-gb/file-uploader-backend development by creating an account on GitHub.

github.com

μ•žμ„œ μƒμ„±ν–ˆλ˜ Lambda ν•¨μˆ˜ λ‚΄ μ½”λ“œλŠ” μ•„λž˜μ˜ κ·Έλ¦Ό 1κ³Ό 같이 3개의 μ†ŒμŠ€ 파일둜 κ΅¬μ„±λ©λ‹ˆλ‹€.

κ·Έλ¦Ό 1. Backend λžŒλ‹€ ν•¨μˆ˜ ꡬ성 μ½”λ“œ

2.  μ†ŒμŠ€ 파일

2.1.  인덱슀 파일

3번째 라인에 μƒμ„±ν•œ API κ²Œμ΄νŠΈμ›¨μ΄ λ¦¬μ†ŒμŠ€ 이름을 μž…λ ₯ν•©λ‹ˆλ‹€. λ©”μ„œλ“œκ°€ POSTμ΄λ©΄μ„œ μƒμ„±ν•œ API κ²Œμ΄νŠΈμ›¨μ΄ λ¦¬μ†ŒμŠ€ 이름과 같은 경우, 파일 ν”„λ‘œμ„Έμ‹± μ½”λ“œλ₯Ό μ‹€ν–‰μ‹œν‚΅λ‹ˆλ‹€.

// index.js
const fileProcessingService = require('./file-processing-service');
const util = require('./util');
const fileUploadPath = '/file-upload'; // API κ²Œμ΄νŠΈμ›¨μ΄ λ¦¬μ†ŒμŠ€ 이름

exports.handler = async (event) => {
    console.log('Request Event: ', event);
    let response;
    switch(true){
        case event.httpMethod === 'POST' && event.path === fileUploadPath:
            response = await fileProcessingService.process(event.body);
            break;
        default:
            response = util.buildResponse(404);
    }
    return response;
};

2.2.  파일 ν”„λ‘œμ„Έμ‹± 파일

5번째 라인에 μ•žμ„œ μƒμ„±ν•œ S3 λ²„ν‚·μ˜ 이름을 μž…λ ₯ν•©λ‹ˆλ‹€. μ‚¬μš©μžκ°€ μ—…λ‘œλ“œ ν•œ νŒŒμΌμ„ 객체둜 λ°›μ•„ S3둜 put ν•©λ‹ˆλ‹€.

// file-processing-service.js
const AWS = require('aws-sdk');
const s3 = new AWS.S3();
const util = require("./util");

const bucketName = 'μƒμ„±ν•œ S3 버킷 이름 μž…λ ₯'; // S3 버킷이름 μž…λ ₯
const s3Subfolder = 'data';

async function process(requestBody){
    const fileName = requestBody.split('\r\n')[1].split(';')[2].split('=')[1].replace(/^"|$/g, '').trim();
    let fileContent = requestBody.split('\r\n')[4].trim();
    fileContent += `\n\nProcess Timestap: ${new Date().toISOString()}`
    const params = {
        Bucket: bucketName,
        Key: `${s3Subfolder}/${fileName}`,
        Body: fileContent
    }
    await s3.putObject(params).promise();
    return util.buildResponse(200,requestBody);
}

module.exports.process = process;

2.3. Response Builder 파일

λͺ¨λ“  λ„λ©”μΈμ—μ„œ μ ‘κ·Όν•  수 μžˆλ„λ‘ μ„ΈνŒ…ν•˜μ˜€μŠ΅λ‹ˆλ‹€.

// util.js
function buildResponse(statusCode, body){
    return{
        statusCode: statusCode,
        headers:{
            'Access-Control-Allow-Origin' : '*',
            'Content-Type' : 'application/json'
        },
        body: JSON.stringify(body)
    }
}

module.exports.buildResponse = buildResponse;

이제 Backendλ₯Ό λ‹΄λ‹Ήν•˜λŠ” λžŒλ‹€ ν•¨μˆ˜μ˜ ν•„μš”ν•œ μ½”λ“œλŠ” λͺ¨λ‘ μž‘μ„±ν•˜μ˜€μŠ΅λ‹ˆλ‹€. 이제 μ•„λž˜μ˜ κ·Έλ¦Ό 2와 같이, Deploy(배포) λ²„νŠΌμ„ λˆŒλŸ¬μ£Όμ„Έμš”.

κ·Έλ¦Ό 2. 배포 λ²„νŠΌ 클릭

λ‹€μŒ ν¬μŠ€νŒ…μ—μ„œλŠ” ν”„λ‘ νŠΈμ—”λ“œμ—μ„œ axiosλ₯Ό ν™œμš©ν•˜μ—¬ APIλ₯Ό Callν•˜λŠ” 방법을 μ†Œκ°œν•©λ‹ˆλ‹€.

πŸ“Œ μ‹œλ¦¬μ¦ˆ ν¬μŠ€νŒ…

1.  νŒŒμΌ μ—…λ‘œλ“œ μ›Ή νŽ˜μ΄μ§€ ꡬ좕: (1) React 기반 Frontend 개발
2.  νŒŒμΌ μ—…λ‘œλ“œ μ›Ή νŽ˜μ΄μ§€ ꡬ좕: (2) AWS IAM μ—­ν•  생성
3.  νŒŒμΌ μ—…λ‘œλ“œ μ›Ή νŽ˜μ΄μ§€ ꡬ좕: (3) AWS Lambda 생성
4.  νŒŒμΌ μ—…λ‘œλ“œ μ›Ή νŽ˜μ΄μ§€ ꡬ좕: (4) AWS S3 생성
5.  νŒŒμΌ μ—…λ‘œλ“œ μ›Ή νŽ˜μ΄μ§€ ꡬ좕: (5) AWS API Gateway 생성
6.  νŒŒμΌ μ—…λ‘œλ“œ μ›Ή νŽ˜μ΄μ§€ ꡬ좕: (6) AWS Lambda ν•¨μˆ˜ μž‘μ„±
7.  νŒŒμΌ μ—…λ‘œλ“œ μ›Ή νŽ˜μ΄μ§€ ꡬ좕: (7) Axios 기반 API Call
8.  νŒŒμΌ μ—…λ‘œλ“œ μ›Ή νŽ˜μ΄μ§€ ꡬ좕: (8) 파일 μ—…λ‘œλ“œ ν…ŒμŠ€νŠΈ
9.  νŒŒμΌ μ—…λ‘œλ“œ μ›Ή νŽ˜μ΄μ§€ ꡬ좕: (9) AWS S3 기반 μ›Ή ν˜ΈμŠ€νŒ…

ν¬μŠ€νŒ… λ‚΄μš©μ— 였λ₯˜κ°€ μžˆκ±°λ‚˜ 보완할 점이 μžˆλ‹€λ©΄ μ•„λž˜μ— λŒ“κΈ€ λ‚¨κ²¨μ£Όμ„Έμš”!

그럼 μ˜€λŠ˜λ„ 즐겁고 κ±΄κ°•ν•œ ν•˜λ£¨ λ³΄λ‚΄μ‹œκΈΈ λ°”λžλ‹ˆλ‹€ :)

κ³ λ§™μŠ΅λ‹ˆλ‹€πŸ˜Š

728x90
λ°˜μ‘ν˜•