[nodejs] AWS S3 파일업로드
시작하기 전에 iam 에서 권한을 등록하고 Access key 와 Secret key 를 가지고 있어야 한다
node module 설치
npm install aws-sdk
획득한 Access key 와 Secret key를 awsConfig.json 파일로 생성해 저장한다
리전의 경우 서울리전을 쓰면 ap-northeast-2 를 등록한다.
다른 리전을 사용하면 해당내용을 변경한다
awsConfig.js 파일 --- { "accessKeyId": [Access Key], "secretAccessKey": [Secret Key], "region": "ap-northeast-2" }
s3_upload.js 파일을 만든다
awsConfig.json 파일을 같은 경로에 둔다
var AWS = require('aws-sdk') var fs = require('fs'); // 접속정보 설정 AWS.config.loadFromPath('./awsConfig.json')
업로드 기능을 추가한다
var file = fs.createReadStream([파일경로]) var params = { Bucket: [버킷이름], Key: [버킷 내 파일이름], ACL: 'public-read', /* 권한: 도메인에 객체경로 URL 을 입력하여 접근 가능하게 설정 */ Body: file, ContentType:'image/png' } let s3 = new AWS.S3(); s3.upload(params, function(err, data){ if(err){ console.log("err: ", err) } console.log('============') console.log("data: ", data) })
성공하면 다음 메시지를 확인할 수 있다
{ ETag: '"59e58528079b9241e6fb2d0aabcde05d"', Location: 'https://[버킷명].s3.ap-northeast-2.amazonaws.com/[버킷 내 파일이름]', key: [버킷 내 파일이름], Key: [버킷 내 파일이름], Bucket: [버킷명] }
등록확인
접근할 가상 도메인을 확인하려면 파일을 클릭해 상세페이지로 가면 객체 URL 부분에 표기되어 있다.
끝.
# 403 에러
403 에러가 날 경우 로그에서 다음 메세지를 확인할 수 있다
{ AccessDenied: Access Denied at Request.extractError (/api/node_modules/aws-sdk/lib/services/s3.js:585:35) at Request.callListeners (/api/node_modules/aws-sdk/lib/sequential_executor.js:106:20) at Request.emit (/api/node_modules/aws-sdk/lib/sequential_executor.js:78:10) at Request.emit (/api/node_modules/aws-sdk/lib/request.js:683:14) at Request.transition (/api/node_modules/aws-sdk/lib/request.js:22:10) at AcceptorStateMachine.runTo (/api/node_modules/aws-sdk/lib/state_machine.js:14:12) at /api/node_modules/aws-sdk/lib/state_machine.js:26:10 at Request. (/api/node_modules/aws-sdk/lib/request.js:38:9) at Request. (/api/node_modules/aws-sdk/lib/request.js:685:12) at Request.callListeners (/api/node_modules/aws-sdk/lib/sequential_executor.js:116:18) message: 'Access Denied', code: 'AccessDenied', region: null, time: 2019-07-21T13:28:22.284Z, requestId: 'E99894677A1FC27B', extendedRequestId: 'F15AwosmtEj/Iru4hm3r2GcapnfB2WRkMhqk23A6M4DlZYl232m3wYUjXXbmtyHxDzW2UMlghBU=', cfId: undefined, statusCode: 403, retryable: false, retryDelay: 82.0657633690838 }
AWS 에서 IAM 을 점검해야 한다.
AccessKey 가 연결되어 있는 계정에 AmazonS3FullAccess 권한이 있어야 한다
이후 버킷 권한으로 들어간다
AWS 에서 IAM 을 점검해야 한다.
퍼블릭 액세스 탭을 클릭한 후 '새 ACL(액세스 제어 목록)을 통해 부여된 버킷 및 객체에 대한 퍼블릭 액세스 차단' 를 비활성화 한다
# 등록 후 도메인으로 접근했을 때 AccessDenied 발생할 때
브라우저에 접속하니 다음메세지 리턴
AccessDenied Access Denied 70EDA7EF69B31803 7fADZr47PBMIq/MXca5Bd5ahqdsqApIq0E3pTsesjjnfWQhkwl40uGeEL98OEG0Qp5SeMnNQsnI=
버킷 권한, 퍼블릭 액세스에서 '임의의 ACL(액세스 제어 목록)을 통해 부여된 버킷 및 객체에 대한 퍼블릭 액세스 차단' 을 비활성화 한다
도메인을 재호출 한다
from http://lemontia.tistory.com/874 by ccl(A) rewrite - 2020-03-06 12:54:07
댓글
댓글 쓰기