내일배움캠프

230711 AWS S3 Presigned URL로 게시글 이미지 업로드

Neda 2023. 7. 11. 20:43

230711 AWS S3 Presigned URL로 게시글 이미지 업로드

이미지와 같은 대용량 파일을 서버에서 모두 처리하면 서버에서 받은 다음 다시 업로드 해야 하므로
응답 시간도 오래 걸리고 부하도 커진다. s3에서는 presigned url을 통해 원하는 곳에서 파일을 업로드할 수 있도록 기능을 제공하고 있다

 

이미지 업로드 시 클라이언트에서 서버로 presigned url을 요청
-> 서버에서 apigateway rest api로 presigned url 요청
-> apigateway에서 lambda 함수 호출
-> lambda 함수는 url을 만들어 서버에게 반환
-> 서버에서 클라이언트에게 url 반환
-> 클라이언트에서 presigned url로 이미지 업로드

 

//nodejs 18 Lambda 함수
import { PutObjectCommand, S3Client } from "@aws-sdk/client-s3";
import uuid4 from "uuid4";
import {
  getSignedUrl,
  S3RequestPresigner,
} from "@aws-sdk/s3-request-presigner";

const Client = new S3Client({ region:"ap-northeast-2" });


const createPresignedUrlWithClient = ({ bucket, key, contentType }) => {
  const command = new PutObjectCommand({ Bucket: bucket, Key: key, ContentType: contentType });
  return getSignedUrl(Client, command, { expiresIn: 3600 });
};

export const handler = async (event,context) => {
  const { fileName, contentType }= JSON.parse(event.body) 
  console.log(fileName,contentType)
  
  const key = `upload/images/${uuid4()}-${fileName}`
  
  const url = await createPresignedUrlWithClient({
    bucket: "react-level4-images",
    key
  })
  
  return {
    statusCode: 200,
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({ url, key, contentType })
  };
};