정의
- 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 |
댓글