개발/nodejs

nodejs + s3 upload/get

kwony 2021. 1. 7. 19:56

nodejs로 AWS S3 스토리지에 업로드를 하기 위해선 먼저 S3 access 권한을 갖고 있는 IAM 사용자가 있어야 한다. 이것까지 설명하면 어려우니 아래 사진과 같은 권한을 가진 사용자가 필요하다는 것을 먼저 알아두자. 

 

 

사용자를 만들면 accessKeyId랑 secretAccessKey를 받는다. 이 string 값을 이용해 nodejs의 AWS S3 오브젝트를 만든다

 

const AWS = require('aws-sdk')

const s3 = new AWS.S3({
    accessKeyId: process.env.S3_ACCESS_KEY_ID,
    secretAccessKey: process.env.S3_SECRET_ACCESS_KEY
})

 

만든 객체로 s3 고유 함수를 호출 할 수 있다. 업로드의 인자에는 s3 버킷을 식별 할 수 있는 정보인 버킷 이름(Bucket), 권한 정보(ACL), 컨텐츠 타입 (ContentType), 보낼 파일 스트림 (Body), 파일 저장 경로(Key)를 입력한다. 아래 코드는 sync하게 호출하고자 promise() 함수까지 호출 했는데 원래는 비동기 함수라 .then, catch 함수도 호출이 가능하다.

 

const createUploadParam = (filePath) => {
    return {
        'Bucket': process.env.S3_BUCKET_NAME,
        'ACL': 'public-read',
        'ContentType': 'image/' + path.extname(filePath).substring(1),
        'Body': fs.createReadStream(filePath),
        'Key': moment().format("YYYY-MM-DD") + '/' + path.parse(filePath).base
    }
}

exports.uploadImage = async (filePath) => {
    return await s3.upload(createUploadParam(filePath)).promise()
}

 

파일 가져 올 때도 비슷하게 버킷의 정보가 필요하다. 단 이때는 버킷 이름과, 파일 경로만 있으면 된다. headObject 함수로 파일의 유무를 확인 한 후 있으면 getObject 함수로 파일에 대한 stream을 받을 수 있다

 

exports.createReadParam = (filePath) => {
    return {
        'Bucket': process.env.S3_BUCKET_NAME,
        'Key': filePath
    }
}

s.headObject(createReadParam(filePath)).on('success',() =>{
    s.getObject(param).createReadStream().pipe()
})