안녕하세요!
오늘은 리액트 VSCode환경에서 AWS S3 연결하고 사진을 올리는 방법에 대해 소개해 드려요.
AWS S3 연결
AWS에 계정을 만든 상태로 시작하고 본 코드는 리액트 VSCode환경에서 제작했습니다!
AWS S3 버킷 만들기(AWS 콘솔)
먼저 AWS 콘솔에 들어가서 S3를 만들어 보겠습니다.
AWS 리전과 이름을 정하고 저는 다른 차단은 건들지 않고 생성했습니다.
IAM 사용자 생성
다음은 S3를 사용하기 위해 사용자 권한을 만들어야 하는데요.
사용자는 Identity and Access Management로 IAM에서 만들어요.
콘솔을 이용해 IAM으로 넘어갑니다.
IAM에서 사용자 탭으로 넘어간 뒤 사용자를 만들어 줍니다.
다음 이 사용자에 대한 S3에 대한 정책을 연결하고 만들어줍니다.
마지막으로 이 사용자에 대한 토큰 키를 받고 개인적인 공간에 담아서 관리를 해줘야 해요.
이 코드는 나중에 다른 IDE 환경에서 나중에 사용될 키이니 따로 복사해두거나 csv 파일을 저장해주세요.
S3 권한 연결
다음 AWS S3로 넘어와서 해당 버킷의 권한 창을 열고 정책을 연결해 줍니다.
여기서 IAM에서 만들었던 사용자의 arn이 필요하니 창을 두 개 열어 놓고 사용하시는 게 편해요!
편집을 누르고 S3을 검색한 뒤 이 버킷에게 어떤 행동을 부여할지 검색합니다.
저는 이 버킷에 파일을 업로드하고 삭제하고 가져오는 권한을 부여해 보겠습니다.
Object를 검색하고 put, delete, get을 넣고 어떤 버킷에 넣을지 정합니다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "Statement1",
"Principal": {"이곳에 사용자 arn이 들어가야함
예시)" "AWS" : "arn예시"},
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:DeleteObject",
"s3:GetObject"
],
"Resource": ["이곳에 사용할 버킷"]
}
]
}
다음 Principal에 “AWS” : “사용자 arn”을 넣고 Resource에는 리소스 추가 버튼을 누르고 어떤 버킷을 대상을 할지 적어줍니다.
CORS 연결
다음 버킷과 연결하는 Cross Origin Resource Sharing의 CORS 정책도 연결해 줍니다.
[
{
"AllowedHeaders": [
"*"
],
"AllowedMethods": [
"PUT",
"POST",
"DELETE",
"HEAD",
"GET"
],
"AllowedOrigins": [
"http://localhost:3000"
],
"ExposeHeaders": []
}
]
이 코드에서 AllowedMethod는 어떤 메서드를 사용할지 허용하고 Origins에서는 허용하는 도메인을 적어줍니다.
어디든지 가능하게 하려면 “*”을 적어줍니다.
리액트로 업로드할 VSCode에서는 3000번 포트를 사용하기 때문에 적었습니다.
VS 코드 리액트로 사진 업로드
다음 VSCode에서 사진을 업로드해 보겠습니다.
리액트를 만들어주고 aws에 필요한 라이브러리를 설치합니다.
터미널 환경에서 아래의 코드 아마존 sdk를 설치합니다.
npm install aws-sdk
라이브러리를 받은 뒤에 AWS에서 제공해 주는 예제를 코드를 가져와 보겠습니다.
import './App.css';
import React, { useState } from 'react';
import AWS from 'aws-sdk';
function App() {
const [selectedFile, setSelectedFile] = useState(null);
const handleFileChange = (e) => {
setSelectedFile(e.target.files[0]);
};
const handleUpload = () => {
if (!selectedFile) {
alert('Please select a file');
return;
}
// AWS S3 설정
AWS.config.update({
accessKeyId: 'YOUR_ACCESS_KEY_ID', // IAM 사용자 엑세스 키 변경
secretAccessKey: 'YOUR_SECRET_ACCESS_KEY', // IAM 엑세스 시크릿키 변경
region: 'YOUR_REGION', // 리전 변경
});
const s3 = new AWS.S3();
// 업로드할 파일 정보 설정
const uploadParams = {
Bucket: 'your-s3-bucket-name', // 버킷 이름 변경
Key: `folder/${selectedFile.name}`, // S3에 저장될 경로와 파일명
Body: selectedFile,
};
// S3에 파일 업로드
s3.upload(uploadParams, (err, data) => {
if (err) {
console.error('Error uploading file:', err);
} else {
console.log('File uploaded successfully. ETag:', data.ETag);
// 업로드 성공 후 필요한 작업 수행
}
});
};
return (
<div>
<input type="file" onChange={handleFileChange} />
<button onClick={handleUpload}>Upload</button>
</div>
);
}
export default App;
다음 APP.js에 코드를 넣고 실행해 보겠습니다.
여기서 변경해야 할 코드는 사용자의 엑세스 키, 시크릿키, 버킷 이름, 리전 총 4가지를 바꿔야 해요.
변경하고 파일이 업로드가 되는지 확인해 볼까요?
결과 확인
사진이 정상적으로 올라가는 것을 확인했습니다!
여기서 주의할 점이 깃허브에서 프로젝트를 할 때 그대로 push를 하면 사용자 엑세스 키와 비밀 키가 그대로 올라가기 때문에 꼭 제거하신 후 올리거나 env 파일을 만들고 업로드하시길 바랍니다.
여기까지 리액트 VSCode 환경에서 AWS S3 버킷에 파일 업로드하는 방법이었습니다!
다음은 AWS Lambda를 사용해서 사진 파일을 변경해 보는 시간을 가져보겠습니다.