본문 바로가기
DevOps/AWS

S3(Simple Storage Service)

by Mecodata 2024. 9. 14.

정의

- AWS에서 제공하는 온라인 객체 스토리지 서비스 (일종의 파일 저장 서비스)

- 구글 드라이브처럼 데이터를 온라인에 객체(Object) 형태로 저장

- 주로 백엔드에서 파일 업로드/다운로드 기능을 구현할 때 사용

- 저장 용량이 무제한이며 EC2와 EBS 보다 가격이 훨씬 저렴함

- S3에서 저장소의 단위버킷(Bucket), 파일의 단위객체(Object)로 정의 (객체 = S3 버킷에 업로드된 파일)

※ 버킷 = GitHub의 Repository와 비슷한 개념

 

업로드/다운로드 과정(이미지)

업로드

다운로드

기본 세팅

버킷 생성

1. AWS 로그인 후 S3 대시보드 접속 → 버킷 만들기 클릭

2. 퍼블릭 엑세스 차단 해제 + 경고 메시지의 인지 확인 버튼 체크 

3. 나머지 설정은 기본값으로 세팅 버킷 생성

 

버킷 정책 추가 (다운로드)

정책(Policy) = AWS에서 권한을 정의하는 JSON 문서

- AWS는 AWS 리소스에 대한 접근 권한을 기본적(default)으로 미부여하도록 설정되어 있어 AWS의 특정 리소스를 접근하려면 권한을 허용해줘야

 

1. S3 대시보드에서 생성한 버킷 클릭 → 권한 설정에서 버킷 정책 편집 클릭  새 문 추가 클릭

 

2. 검색 창에 S3 입력 후 S3 클릭 검색 창에 getObject 입력 후 getObject 클릭 리소스 추가 클릭

 

3. 리소스 유형 object 선택 리소스 ARN을 다음과 같이 입력 후 리소스 추가 

※ 다음 예시는 S3의 mecodata-bucket 버킷에 있는 모든 객체를 지정

 

4. principal 속성의 값을 *로 수정 (모든 유저에게 권한 부여를 의미) → 변경 사항 저장하여 버킷 정책 추가 완료

 

IAM 엑세스 키 발급

1. AWS에서 IAM 대시보드 접속 IAM 대시보드에서 액세스 관리의 사용자 옵션 클릭 → 사용자 생성

2. 사용자 이름 설정 후 다음 클릭 권한 설정에서 직접 정책 연결 선택 권한 정책 검색 창에 S3Full 검색 AmazonS3FullAccess 선택 후 다음 클릭 → 사용자 생성 클릭

3. 생성한 사용자 이름 클릭 보안 자격 증명 탭에서 액세스 키 만들기 클릭

4. 사용 사례에서 AWS 외부에서 실행되는 애플리케이션 선택 후 다음 클릭 설명 태그 생략 3단계에서 발급 받은 액세스 키를 따로 저장해둔 뒤 완료 클릭

S3와 백엔드 연동

S3 - Spring Boot

1. build.gradle에 의존성 추가

implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'

 

2. application-aws.yml 파일 생성하여 S3 관련 정보 추가 

applicataion.yml

spring:
  profiles:
    include: aws # application-aws.yml 적용

application-aws.yml 

cloud:
  aws:
   s3:
      bucket: [버킷명]
   stack.auto: false (CloudFormation 자동 스캔 방지)
   region.static: ap-northeast-2 (서울 리전)
   credentials:
     accessKey: [발급 받은 accessKey]
     secretKey: [발급 받은 secretKey]

 

3. S3Config.java 파일 추가 (AmazonS3Client 활용)

@Configuration
public class S3Config {

	@Value("${cloud.aws.credentials.accessKey}")
	private String accessKey;
    
	@Value("${cloud.aws.credentials.secretKey}")
	private String secretKey;
    
	@Value("${cloud.aws.region.static}")
	private String region;

	@Bean
	public AmazonS3Client amazonS3Client() {
		BasicAWSCredentials awsCredentials= new BasicAWSCredentials(accessKey, secretKey);
		return (AmazonS3Client) AmazonS3ClientBuilder.standard()
                                                     .withRegion(region)
                                                     .withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
                                                     .build();
	}
    
}

 

4. S3로 업로드 기능을 수행하는 AwsFileService.java 예시

@Service
public class AwsFileService {

	@Value("${cloud.aws.s3.bucket}")
	private String bucket;
	private final AmazonS3Client amazonS3Client;
    
        public FileS3ServiceImpl(AmazonS3Client amazonS3Client) {
            this.amazonS3Client = amazonS3Client;
        }

	// S3로 업로드
	private String putS3(File uploadFile, String fileName) {
		amazonS3Client.putObject(new PutObjectRequest(bucket, fileName, uploadFile)
        			  .withCannedAcl(CannedAccessControlList.PublicRead));
		return amazonS3Client.getUrl(bucket, fileName).toString();
	}

}

 

S3 - Express.js

1. AWS 접속 정보를 가진 .env 파일 생성

AWS_REGION=리전
AWS_ACCESS_KEY_ID=발급 받은 엑세스 키
AWS_SECRET_ACCESS_KEY=발급 받은 시크릿 키
AWS_S3_BUCKET=버켓명

 

2. S3로 업로드 기능을 수행하는 app.js 예시 (S3Client, multer, multerS3 활용)

require('dotenv').config();

const express = require('express');
const app = express();
const port = 80;

const { S3Client } = require('@aws-sdk/client-s3');
const multer = require('multer');
const multerS3 = require('multer-s3');

const s3 = new S3Client({
    region: process.env.AWS_REGION,
    credentials: {
        accessKeyId: process.env.AWS_ACCESS_KEY_ID,
        secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY,
    },
});

const upload = multer({
    storage: multerS3({
        s3: s3,
        bucket: process.env.AWS_S3_BUCKET,
        key: function (req, file, cb) {
            cb(null, file.originalname); // S3에 저장될 파일 경로와 이름
        }    
    }),
});

app.post('/upload', upload.array('photos'), (req, res) => {
	res.send(req.files);
});

app.listen(port, () => {
	console.log('Running');
})

 

Reference

 

[AWS] 📚 S3 개념 & 버킷 · 권한 설정 방법

S3 (Simple Storage Service) 개념 AWS S3는 업계 최고의 확장성과 데이터 가용성 및 보안과 성능을 제공하는 온라인 오브젝트(객체) 스토리지 서비스이다. (참고로 S 앞글자가 3개라서 S3 이라고 한다.) 쉽

inpa.tistory.com

 

'DevOps > AWS' 카테고리의 다른 글

IAM(Identity and Access Management)  (0) 2024.09.15
RDS(Relational Database Service)  (0) 2024.09.13
EC2(Elastic Compute Cloud)  (0) 2024.09.12

댓글