[API/Javascript] 카카오 클라우드 Object Storage 기본적인 사용
카카오 클라우드의 Object storage의 기본적인 업로드 및 폴더 읽는 방법에 대해서 올릴 예정입니다.
우선 카카오 클라우드의 경우 s3 와 같은 방식으로 사용이 가능하기에 s3 client 라이브러리를 사용가능합니다.
npm install @aws-sdk/client-s3;
const s3 = new S3Client({
region: 'kr-central-2',
endpoint: S3_Config.baseUrl,
credentials: {
accessKeyId: S3_Config.authKey,
secretAccessKey: S3_Config.secretKey,
},
forcePathStyle: true,
});
카카오 클라우드의 object Storage에 S3용 키를 따로 발급받는게 있는데 그 키를 사용하면 됩니다.
키가 아마 3개 있을텐데, accesskey, secretkey만 있으면 된다.
endpoint의 경우
https://objectstorage.kr-central-2.kakaocloud.com
사용중하면 되고,
다음에는 Bucket, 저장공간에 대한 코드이다.
const {
HeadBucketCommand,
} = require('@aws-sdk/client-s3');
const checkBucket = async () => {
const command = new HeadBucketCommand({
Bucket: BUCKET_NAME,
});
try {
await s3.send(command);
return {
bucketName: BUCKET_NAME,
exists: true,
message: '버킷이 존재합니다.',
};
} catch (error) {
console.log(error);
if (error.name === 'NotFound' || error.$metadata?.httpStatusCode === 404) {
return {
bucketName: BUCKET_NAME,
exists: false,
message: '버킷을 찾을 수 없습니다.',
};
}
throw error;
}
};
위와 같은 코드로 현재 bucket이 존재하는지에 대한 정보 확인이 가능하다.
아래에는 bucket에 파일을 올리는 코드이다.
const {
PutObjectCommand,
} = require('@aws-sdk/client-s3');
const uploadImage = async (file, folderPath = '') => {
const key = folderPath + file.originalname;
const command = new PutObjectCommand({
Bucket: BUCKET_NAME,
Key: key,
Body: file.buffer,
ContentType: file.mimetype,
});
const result = await s3.send(command);
return {
key,
url: `${S3_Config.baseUrl}/${BUCKET_NAME}/${key}`,
etag: result.ETag,
originalName: file.originalname,
size: file.size,
};
};
기본적인 업로드에 대한 코드이다. Bucket은 object storage의 미리 생성해놓은 저장소명이고, body는 받은 파일에 대한 정보를 담아서 s3.send 로 전송이 가능하다.
key의 위치에 이름으로 파일이 저장되게 된다.
폴더의 경로에 파일 및 내부 폴더 구성을 확인할때에는
const {
ListObjectsV2Command,
} = require('@aws-sdk/client-s3');
const listObjects = async (folderPath = '', maxKeys = 100) => {
const prefix = folderPath;
const command = new ListObjectsV2Command({
Bucket: BUCKET_NAME,
Prefix: prefix,
MaxKeys: maxKeys,
});
const result = await s3.send(command);
return {
objects:
result.Contents?.map((obj) => ({
key: obj.Key,
size: obj.Size,
lastModified: obj.LastModified,
etag: obj.ETag,
})) || [],
count: result.Contents?.length || 0,
isTruncated: result.IsTruncated,
folderPath,
};
};
와 같은 방식으로 폴더 내부의 경로와 내부 파일을 알수가 있다.
마지막으로 파일을 외부에서 읽을때, object storage의 보안 설정을 public으로 해놓을 경우, 외부에서도 마음껏 접속이 가능하다. 하지만 그럴경우 보안적으로 위험할수 있기때문에 간단한 보안용 주소를 만들수있다. 경로가 안보이거나 그러진 않지만 public 설정이 아니더라도 특정 파일에 대한 접근을 특정 시간동안 가능하게 조절할수있다.
npm install @aws-sdk/s3-request-presigner;
const {
GetObjectCommand,
} = require('@aws-sdk/client-s3');
const { getSignedUrl } = require('@aws-sdk/s3-request-presigner');
const getSignUrl = async (imageKey) => {
const getCommand = new GetObjectCommand({
Bucket: BUCKET_NAME,
Key: imageKey,
});
const signUrl = await getSignedUrl(s3, getCommand, {
expiresIn: 60 * 10,
});
return signUrl;
};
기존에 설치한 @aws-sdk/client-s3 라이브러리만으로는 할수가 없길래 위와 같은 라이브러리를 하나 더 설치한다.
설치를 했다면 간단하게 getSignedUrl 함수로 암호화를 할 수 있다. 특정 시간동안 key에 있는 파일에만 접근이 가능하게 되고, expiresIn 시간으로 설정할수 있다.
초 기준이라, 60*10 은 10분 설정이다.
이렇게 이번엔 object storage에 대한 간단한 접근 방법을 찾아보았다.
모두 힘냅시다...