작업 중 node.js 환경에서 요청으로 받은 object 자체를 json으로 변환해서 s3에 올려야 하는 일이 생겼다.
해당 글에서는 node.js에서 s3로 업로드 하는 방법과 IAM 설정 방법에 대해 서술한다.
환경
node.js: v16.15.0
aws-sdk: 2.1166.0
S3 버킷 생성
S3 버킷 생성에 대해서는 예전에 다루었기 때문에 스킵한다.
만약 S3 버킷이 생성되지 않은 상태라면 아래 글을 참고해서 S3 버킷을 생성하자.
IAM 유저 생성
Node.js에서 S3에 접근하기 위해서는 S3 접근권한이 있는 IAM 유저가 필요하다.
본 글에서는 S3에 모든 권한을 가진 유저를 생성해서 사용한다.
1. AWS 콘솔에서 IAM 접속
2. 액세스 관리 -> 사용자 -> 사용자 추가
3. 사용자 이름을 입력하고 AWS 자격 증명 유형을 엑세스 키로 설정한다.
4. 기존 정책 직접 연결을 클릭한다. 클릭 후 2번 창에서 s3FullAccess를 검색하고 체크해준다.
5. 태그는 선택이다. 필자는 태그는 등록하지 않았다.
6. 검토 후 사용자 만들기 클릭
7. IAM 유저는 생성완료.
- 이때 액세스 키 ID와 비밀 액세스 키가 생성되는데 이 키들은 .csv 파일을 다운로드 하거나 다른 곳에 메모해두자. (이 화면에서 나가면 다시는 얻을수 없다.) 이 키는 차후 프로젝트에서 S3에 접근할 때 사용된다.
Node.js에서 S3로 파일 업로드
이제 프로젝트에서 S3로 파일을 올리기 위한 밑작업이 완료 되었다. 이제 object를 json으로 변환해서 S3에 업로드 해보자.
1. 프로젝트에서 aws-sdk 다운로드
$ npm install aws-sdk
1-1. typescript와 함께 사용하고 싶다면 추가로 다운로드
$ npm install --save-dev @types/node
2. aws-sdk 불러오기
import AWS from 'aws-sdk'
3. S3 객체 생성
- IAM 유저 생성시에 생성된 accessKeyId와 secretAccessKey가 여기서 쓰인다. 각각의 키를 넣어주면 된다.
- S3의 리전은 생성된 버킷 확인에서 AWS 리전을 보면 알 수 있다. (꼭 입력하지 않아도 괜찮다.)
const s3 = new AWS.S3({
accessKeyId: "엑세스 키 ID",
secretAccessKey: "시크릿 키 ID",
region: 'S3의 리전', // ex) ap-northeast-2
});
4. S3에 올리고자 하는 object를 stream으로 변환
const testObject = {
test1: 'test1',
test2: 'test2',
test3: 'test3',
test4: 'test4',
test5: 'test5',
};
// object를 string으로 변환
const stringObject = JSON.stringify(testObject);
// string을 Stream으로 변환
const objectStream = Readable.from([stringObject]);
5. S3에 업로드한다.
- 아래 s3.upload의 Key가 파일을 저장할 위치이다.
const result = s3
.upload({
Bucket: '생성한 s3의 버킷이름',
Key: `testObject/test.json`, // 저장할 경로
Body: objectStream,
});
4-1. 기본적으로 s3업로드는 비동기적으로 실행된다. 동기적으로 실행을 하고 싶다면 뒤에 .promise()를 붙이면 된다.
const result = await s3
.upload({
Bucket: '생성한 s3의 버킷이름',
Key: `testObject/test.json`,
Body: objectStream,
})
.promise();
5. 업로드 된 s3의 주소 확인
const s3Location = result.Location; // https://s3.ap-northeast-2.amazonaws.com/버킷이름/testObject/test.json
6. S3에 업로드 되었는지 확인
성공적으로 업로드 된걸 확인 할 수 있다.
속도 관련 팁
s3에 업로드시 2MB 파일 기준으로 0.2초 ~ 0.3초 정도 걸리는 걸로 확인되었다. 혹시나 속도가 느리다면
S3의 리전과 서버의 위치를 확인해보자. 예를 들어 S3의 리전은 미국인데 내 서버는 로컬에서 실행해서 S3에 올린다면 속도가 느릴수 있다. 이럴 때는 S3 클래스를 확인하고 맞는 클래스를 사용하거나 S3 리전의 위치를 서버가 존재하는 리전으로 옮기면 해결된다.
'Programming > Node.js' 카테고리의 다른 글
[Node.js] Error: bind EADDRINUSE null:80 (0) | 2022.12.08 |
---|---|
[Node.js] node.js에서 메모리 사용량을 확인하는 방법 (0) | 2022.11.29 |
[Node.js] Node.js에서 base64로 문자열 Encoding, Decoding 하는 방법 (2) | 2022.08.30 |
[Node.js] Express.js에서 Multer로 S3에 이미지를 여러장 업로드하는 방법 (0) | 2022.08.12 |
[Node.js] ubuntu에 Node.js 설치하는 방법 (0) | 2022.07.03 |