내가 생각해낼 수 있는 아이디어는 3가지정도였다.
API 3개를 설계하였다.
1) s3query
: 클라이언트가 dashboard에 진입했을 때 버킷의 파일 리스트들을 리턴
2) s3download
: 클라이언트가 dashboard에 특정 파일의 다운로드를 요청했을 때 파일의 signed-url을 리턴
3) s3search
: 클라이언트가 특정 일자의 파일을 요청했을 때 특정 일자에 해당하는 파일 리스트를 리턴
구현: s3.js
const AWS = require("aws-sdk");
const dotenv = require("dotenv");
dotenv.config();
AWS.config.update({
accessKeyId: process.env.accessKey,
secretAccessKey: process.env.secretKey,
region: "ap-northeast-2",
});
const s3 = new AWS.S3();
function s3query(req, res) {
const params = {
Bucket: "ssrg-log",
Prefix: "23/", // prefix가 아닌 Prefix임
};
s3.listObjects(params, function (err, data) {
if (err) {
throw err;
}
res.json(data.Contents);
});
}
function s3download(req, res) {
const fileName = req.query.fileName;
try {
const signedUrl = s3.getSignedUrl("getObject", {
Bucket: "ssrg-log",
Key: fileName,
Expires: 15,
});
res.json(signedUrl);
} catch (e) {
throw e;
}
}
function s3search(req, res) {
const year = req.query.year;
let doy = req.query.doy;
const params = {
Bucket: "ssrg-log",
Prefix: `${year}/SSRG${doy}`,
};
try {
s3.listObjects(params, function (err, data) {
if (err) {
throw err;
}
res.json(data.Contents);
});
} catch (e) {
throw e;
}
}
진행하다가 signaturedoesnotmatch
라는 에러를 마주했다.
액세스 키
라는 탭에서 한개를 더 발급하거나 (계정 당 최대 2개를 가질 수 있다.) 한개를 삭제하고 재발급하면 된다.
https://aws.amazon.com/ko/s3/pricing/
https://velog.io/@daydream_03/SignatureDoesNotMatch-%EC%98%A4%EB%A5%98-%ED%95%B4%EA%B2%B0%ED%95%9C-%EC%8D%B0
https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/API/Welcome.html