본문 바로가기
공부/프로그래밍

[nodejs] AWS S3 파일업로드

by demonic_ 2019. 7. 22.
반응형

시작하기 전에 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.<anonymous> (/api/node_modules/aws-sdk/lib/request.js:38:9)
    at Request.<anonymous> (/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 발생할 때

브라우저에 접속하니 다음메세지 리턴

<Error>
<Code>AccessDenied</Code>
<Message>Access Denied</Message>
<RequestId>70EDA7EF69B31803</RequestId>
<HostId>
7fADZr47PBMIq/MXca5Bd5ahqdsqApIq0E3pTsesjjnfWQhkwl40uGeEL98OEG0Qp5SeMnNQsnI=
</HostId>
</Error>

 

버킷 권한, 퍼블릭 액세스에서 '임의의 ACL(액세스 제어 목록)을 통해 부여된 버킷 및 객체에 대한 퍼블릭 액세스 차단' 을 비활성화 한다

도메인을 재호출 한다

반응형

댓글