크게 3가지 방법이 있다.
: 기본적으로 s3는 퍼블릭에서 접근하는 요청을 차단한다. put / get 다 그렇다.
근데 엑세스 차단 해제를 하면 누구나 CRUD가 가능해지기 때문에 어느순간 일어났을때 통장에 감당하지 못할 금액이 찍힐 수 있기에 되도록이면 해제를 하지 말자.
: ec2에 역할을 부여하고 그 역할만 s3에 접근가능하도록 정책을 명시해주면 된다.
먼저 iam에서 s3fullaccess할 수 있는 built-in정책을 선택하거나 아니면 s3의 좀 더 제한된 기능을 원한다면 custom 정책을 만들 수 있다.
보안 - iam 역할 수정
을 클릭하고 위에서 만든 역할을 지정해준다.s3 - 권한 탭 - 정책 - 수정
을 클릭하여 아래 정책을 입력해준다.{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "1",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::your-ec2-role"
},
"Action": [
"s3:PutObject",
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::your-s3-name",
"arn:aws:s3:::your-s3-name/*"
]
}
]
}
ec2 arn은 ec2 인스턴스 정보란에 있으니 잘 살펴보아라.
s3 정책설정이 끝나고 해당 ec2에서 파일을 업로드할 수 있는지 cli로 간단하게 테스트 가능하다.
aws s3 cp {업로드할 object 경로} s3://{업로드할 S3 버킷의 폴더}
aws s3 cp ./test.jpeg s3://your-s3-name/
그리고 클라이언트에서 파일을 받아올 수 있도록 s3 cors설정을 아래처럼 해주자.
[
{
"AllowedHeaders": [
"*"
],
"AllowedMethods": [
"GET",
],
"AllowedOrigins": [
"https://domain",
"http://localhost:3000"
],
"ExposeHeaders": [
"ETag"
]
}
]
그럼 ec2에서 업로드하고 브라우저에서 s3에 업로드된 파일을 받아 볼 수 있게 된다.
여기서 끝난게 아니다. 브라우저에서 사용하려면 s3-sdk를 사용해야하는데 이때 키가 필요하다.
s3 sdk 이용 방법은 아래 출처 링크를 확인바람
:가장 간단한 방법이다. s3에 임시적으로 파일을 조작할 수 있는 url을 가져오는 방법이다. 파일 용량이 크지 않는 이상, url 유효기간을 60초로 해놓으면 적당할 듯하다.
서버를 신경쓰지 않고 바로 브라우저에서 get/put할 수 있기에 유지보수도 간단하다.
const getObjectParams = {
Bucket: process.env.NEXT_PUBLIC_S3_BUCKET_NAME,
Key: "파일또는 폴더 이름",
};
const command = new GetObjectCommand(getObjectParams);
const url = await getSignedUrl(client, command, { expiresIn: 60 });
url을 이미지 src에 넣어주면 끝!
const uploadImage = async (file: File) => {
const uploadParams: PutObjectCommandInput = {
Bucket: process.env.NEXT_PUBLIC_S3_BUCKET_NAME,
Key: `${file.name}`,
Body: Buffer.from(await file.arrayBuffer()),
ContentType: file.type,
};
try {
const putCommand = new PutObjectCommand(uploadParams);
const signedUrl = await getSignedUrl(client, putCommand, {
expiresIn: 60,
});
await fetch(signedUrl, {
method: "PUT",
body: file,
headers: {
"Content-Type": file.type,
},
});
alert("File uploaded successfully!");
} catch (error) {
console.error("Error uploading file:", error);
alert("Failed to upload the file. Please try again.");
}
};
pre-signedUrl을 이용해서 'PUT' method를 이용하여 업로드할 수 있다.
:vpc를 이용해서 보안을 더 강화하려고 했으나 기본적으로 s3를 생성하면서 기본vpc가 적용되어있기때문이기도 하고 pre-signedUrl만으로도 충분히 보안을 강화한다 생각하여 따로 vpc를 만들지는 않았다.