이끌든지 따르든지 비키든지

Project/Node.js

[Node.js] Node.js 서버에서 AWS S3 이미지 가져오기

SeongHo5 2023. 9. 20. 10:16

AWS S3 Storage에 저장된 이미지를 Node.js를 통해 가져오는 방법에 대해 알아본다.


S3 Bucket 설정

우선, 이미지를 담을 S3 Bucket을 생성한다.

 

버킷 이름을 설정해주고,

 

버킷 퍼블릭 액세스 설정

퍼블릭 엑세스 차단 설정을 반드시 체크해주어야 Node.js 서버에서 S3 버킷에 접근할 수 있다.

 

버킷을 생성했다면, 버킷 속성 → 권한 → 버킷 정책 →  버킷 정책 편집 → 정책 생성기로 들어가 버킷 정책을 만들어준다.

 

입력해야하는 값

  • Type of Policy - S3 Bucket Policy
  • Principal - *
  • Actions - GetObject
  • ARN - 버킷 정책 편집 페이지에서 볼 수 있음

 

내 버킷의 ARN

 

전부 맞게 입력했다면, Add Statement → Generate Policy 버튼을 차례대로 눌러 정책을 생성한다.

 

생성된 정책을 복사해 정책 편집 페이지에 붙여넣기하고 저장했을 때,

 

 

 

퍼블릭 액세스 가능 태그가 있다면 성공

 

S3 Bucket은 AWS 콘솔에서 업로드 버튼을 통해 윈도우 환경에서 파일을 옮기듯이 쉽게 파일을 업로드할 수 있다.

AWS Access Key 생성

이제 서버에서 AWS에 액세스할 때 필요한 액세스 키를 생성한다.

IAM → 사용자 메뉴에서 사용자 생성을 클릭한다.

 

 

구분할 수 있는 적절한 사용자 이름을 입력해주고,

 

 

직접 정책 연결 → 권한 정책 : AmazonS3FullAccess 권한을 연결 후 사용자 생성하기 클릭

(추후에 이미지 업로드도 추가할 계획이라 FullAccess를 선택)

 

생성된 사용자 상세 정보 페이지에 들어가 보안 자격 증명 탭의 액세스 키 만들기를 클릭한다.

 

 

사용 사례를 선택하고 액세스 키를 생성하면 액세스 키와 비밀 키를 발급해주는데, csv 파일로 다운받아 보관하거나, 환경변수 파일(.env)에 기록해두면 된다.

 

.env 파일에 액세스 키, 리전 등을 작성


AWS SDK 설정 및 이미지 가져오기

이제 Node.js 서버에 AWS SDK를 설치하고, 이미지를 가져오는 코드를 작성하면 된다.

// aws-sdk 설치
npm install aws-sdk

npm 명령어를 통해 aws-sdk를 설치하면 된다. Typescript 환경에서 작업하는 경우에도 추가 설치 없이 위 명령어만 실행하면 된다.


import AWS from 'aws-sdk';

const s3 = new AWS.S3({
	accessKeyId: process.env.AWS_ACCESS_KEY_ID,
	secretAccessKey: process.env.AWS_SECRET_KEY,
	region: process.env.AWS_REGION
});
const params = {
	Bucket: process.env.AWS_BUCKET_NAME,
	Key: `images-product/${prodId}.jpg`
}

const data = await s3.getObject(params).promise();

 

위에서 생성한 액세스 키와 비밀키, 버킷 이름으로 S3 인스턴스를 생성하고, 파라미터 값을 설정해준다.

Key값에는 가져올 파일의 경로, 파일명을 적어주면 된다.

 

위 코드에서는 비동기 처리로 s3에서 가져온 이미지를 data 객체에 담아 Image Resize 등에 사용하기 위해 promise()를 사용해 프로미스화했다.