[AWS] S3, EC2, RDS

써니·2022년 2월 10일
0

UMC-Server

목록 보기
6/6
post-thumbnail

S3 = Simple Storage Service

: 간단하게 데이터를 저장할 수 있도록 도와주는 서비스

버킷(Bucket) : 데이터가 저장되는 공간

  • 버킷마다 이름과 권한 지정
  • 버킷 삭제 시 '버킷' 자체를 삭제보다 내부의 데이터를 다 지우고 기존의 '버킷'을 새 '버킷'을 사용하는 것처럼 사용하는 것이 권장됨


객체(Object) : 버킷에 담기는 데이터는 객체 안에 담김

  • key : value의 형태로 담김
  • javascript : 객체의 주소값을 참조해서 사용 -> 원본의 손상 방지
  • 원본 데이터의 생성 및 삭제만 가능
  • 수정 기능 대신 => 덮어쓰기 기능 (원본을 다른 원본으로 바꾸는 작업이라 속도가 느림)
  • HTTP요청, 데이터의 접근, 생성등의 정보를 지닌 객체도 가능


데이터의 접근

  • 버킷과 데이터 사이를 /로 구분
  • s3에 REST API로 https방식을 이용해서 요청
    GET "https://버킷의 이름".s3.amazonaws.com/"데이터이름"
  • 데이터의 공개 범위 지정 : '객체 스토리지 클래스'



1. IAM 정책

: MYSQL이 AWS S3에 접근하는 것을 허용하기 위해 생성해야하는 정책

1-1) 새 User 생성

  • AWS 로그인 - IAM Resource에서 사용자 추가
  • Add user : 액세스 권한 유형
    - Programmmatic access(<- 이것 선택!) : 사용자가 API, AWS CLI, 또는 Windows PowerShell용 도구에 대한 액세스 권한이 필요한 경우
    - AWS Management console access : 사용자에게 AWS Management 콘솔에 대한 액세스 권한이 필요한 경우
      

1-2) 정책 추가

  • 정책 이름 : 원하는대로~!
  • 새 permission 설정하기 (permission policy 추가)
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "VisualEditor0",
            "Effect": "Allow",
            "Action": [
                "s3:PutObject",
                "s3:GetObjectAcl",
                "s3:GetObject",
                "s3:ListBucket",
                "s3:DeleteObject",
                "s3:PutObjectAcl"
            ],
            "Resource": [
                "arn:aws:s3:::내-버킷-이름/*",
                "arn:aws:s3:::내-버킷-이름"
            ]
        }
    ]
}
  • "Download.csv"로 key 정보 다운로드하기
    - ec2에서 pem file 저장하듯 IAM정책을 새로 생성하면 그에 대한 access_key, secret_key에 대한 정보 담긴 파일을 다운받아 보관! 추가 다운로드 불가

2. AWS S3 bucket 생성하기

2-1) region : Asia/Seoul

2-2) access 허용하기

  • default로 block된 all pulic access를 해제

2-3) 버킷 버전 관리 및 기본 암호화

  • 일단 비활성화했대요...일단 나도 비활성화...과금될수도...

3. bucket 정책 지정하기

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Stmt15076373*****",
            "Effect": "Allow",
            "Principal": {
                "AWS": "{IAM_user의_ARN}"
            },
            "Action": [
                "s3:GetObject",
                "s3:PutObject",
                "s3:DeleteObject"
            ],
            "Resource": "arn:aws:s3:::{내_버킷의_이름}/*"
        },
        {
            "Sid": "Stmt15076373*****",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::{bucket_name}/*"
        }
    ]
}

⚠ 퍼블릭 경고⚠ ?

퍼블릭으로 설정하고 나면 경고를 한다. 원칙적으로는 S3는 public access를 주지 않는것이 보안상 좋다. S3는 private하게 막고 S3 앞에 CloudFront를 붙혀서 CDN 기능을 구현하는것이 정석이긴 하다.

4. CORS 설정

: 한 도메인에 로드되어 다른 도메인의 리소스와 상호 작용하는 클라이언트 웹 애플리케이션에 대한 방법 정의

  • JSON으로 작성
[
    {
        "AllowedHeaders": [
            "*"
        ],
        "AllowedMethods": [
            "GET", "PUT", "POST", "HEAD"
        ],
        "AllowedOrigins": [
            "*"
        ],
        "ExposeHeaders": [
            "ETag"
        ],
        "MaxAgeSeconds": 3000
    }
]

5. multer와 s3를 이용한 이미지 업로드

multer : 서버에 이미지 저장 시 사용되는 모듈!

5-1) multer-s3, AWS-SDK 설치

  • multer-s3 : 이미지 업로드 시 s3에 업로드 하도록 만들어주는 모듈
  • AWS-SDK : AWS 서비스를 연결하기 위한 모듈
    npm install multer-s3 aws-sdk

5-2) multer 이용할 파일에 multer 가져오기

const multer = require('multer’); 
const upload = multer({ dest: 'uploads/' });
  • dest : 클라이언트에서 넘어온 사진을 저장할 디렉토리(...s3?)

5-3) multer 메소드

  1. single(fieldname) : 하나의 파일 받아서 저장
  2. array(fieldname,최대 개수) : 하나의 필드 명을 가지는 여러개의 파일을 받아서 저장
router.post('/', upload.array('photos', 4), (req, res) => { 
console.log(req.files); 
console.log(req.files[0]); // 파일의 인덱스로 접근 
// 위 single에서와 다르게 req.file이 아닌 req.files에로 넘어옵니다. })
  1. fields([fieldname, maxCount},{fieldname,maxCount},...]) : 여러 개의 필드명을 갖는 여러 개의 파일을 받아 저장
router.post('/', 
      upload.fields([ 
       	{ name: 'mainImage', maxCount: 1 }, 
        { name: 'subImages', maxCount: 5 } 
	   ]), (req, res) => { 
  console.log(req.files); 
  console.log(req.files['접근하려는 fieldname']); 
})

6. 업로드 하기

  • awsconfig.json 파일 생성
  • multer.js 미들웨어 파일 생성
    => 참고 링크










참고:

0개의 댓글