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 })
};
};
'내일배움캠프' 카테고리의 다른 글
230713 react 인증을 위한 페이지 컴포넌트 (0) | 2023.07.13 |
---|---|
230712 리액트 같은 src 경로 이미지 리로드하기 (presigned url 업로드 미리보기 시 ) (0) | 2023.07.12 |
230710 mongoose populate 연산을 통한 데이터 한 번에 가져오기 (0) | 2023.07.10 |
230709 내일배움캠프 8주차 WIL (0) | 2023.07.09 |
230708 VScode에서 import문을 별칭을 사용하여 절대 경로로 사용하기 (0) | 2023.07.09 |