NodeJS + AWS S3 버킷 연동하여 파일 업로드/삭제/변경

sangeun jo·2021년 10월 13일
1

Part I. AWS 설정

1. iam 사용자 생성

iam 사용자 생성하고 AmazonS3FullAccess 정책을 추가한다.
발급받은 엑세스 키, 시크릿 키를 꼭 저장해놓는다.

2. 버킷생성

다음과 같이 퍼블릭 엑세스를 모두 차단한다.

3. 버킷 정책 생성

여기에서 생성한다.

다음과 같이 설정한다. (iam, 버킷 ARN확인법은 후술)

  • 모든 사용자가 접근할 수 있게 하려면 Principal에 *를 입력한다.

  • 버킷내 모든 폴더를 지정하고 싶으면 ARN란에 ARN이름/*을 입력하면 된다.
    예를들어 ARN이름이 test라면 arn:aws:s3:::test/*

  • 만약 정적 파일을 서비스할 용도라면 Action에 Principal에 *를 입력하고 액션은 GetObject만 설정하면 된다.

다 설정했다면 Add statement를 누르면 아래 스택에 추가된다. 여기서 초기화(Start Over)하지 않고 다른 정책을 입력한 다중으로 정책을 생성할 수 있다.

모든 사용자는 객체를 읽기만 할 것이므로 GetObject만 설정하고, 서버에서는 객체를 삭제하기도 해야하므로 특정 사용자에게는 DeleteObject 권한도 추가해주었다.

Generate Policy를 누르면 json형태로 정책을 생성한다.

Part II. Nodejs 서버

//폴더 구조 

app.js
routes/
ㄴbucketRouter.js
ㄴcontrollers/
  ㄴbucketController.js

1. awsconfig.js 파일 생성

{
    "accessKeyId": "s3 접근 권한이 있는 iam 사용자의 엑세스 키",
    "secretAccessKey": "s3 접근 권한이 있는 iam 사용자의 시크릿 키",
    "region": "AWS 리전" //버킷 > 속성 탭에서 볼 수 있다. 
}

2. 모듈 설치

npm install multer-s3 
npm install aws-sdk 

3. 객체 업로드

const multerS3 = require('multer-s3'); 
const aws = require('aws-sdk'); 
aws.config.loadFromPath(
  "awsconfig.json 파일 경로"
);
const s3 = new aws.S3();

// s3 버킷에 업로드
const upload = multer({
  storage: multerS3({
    s3: s3,   
    acl: 'public-read-write',
    bucket: '버킷이름/폴더이름', 
    key: function (req, file, cb) {
      let extension = path.extname(file.originalname);
      cb(null, Date.now().toString() + extension)
    }
  })
})

 
router.post('/upload', upload.single('form data 속성 이름'), bucketController.upload);

4. 객체 삭제

const aws = require('aws-sdk'); 
aws.config.loadFromPath(
  "awsconfig.json 파일 경로"
);

s3.deleteObject({
	Bucket: '버킷이름',
    Key: '폴더이름/파일이름'  
}, (err, data) => {
	if (err) { throw err; }
}); 

5. 객체 변경

객체 변경 기능은 존재하지 않는 것 같다. 객체 업로드와 똑같이 구현한 다음, 기존 객체는 삭제한다.

참고

iam 사용자 ARN 확인법

버킷 ARN 확인법
버킷 > 속성 탭 확인

profile
코더가 아니라 개발자가 되자

0개의 댓글