[AWS] S3(Simple Storage Service)μλ²μ Spring Boot μ°λ
μ§νμ€μ΄λ νλ‘μ νΈμ νμΌ μ λ‘λ κΈ°λ₯μ΄ μμμ΅λλ€.
- ex) κ²μκΈμ μ λ‘λ ν λ μ΄λ―Έμ§λ ν¨κ» μ λ‘λ, νμμ 보λ₯Ό μμ ν λ νλ‘ν μ΄λ―Έμ§λ₯Ό λ±λ‘
νμΌ μ λ‘λμ κ²½μ°, EC2 μλ²κ° μλ λ‘컬 μλ²λ₯Ό μ¬μ©νμ λλ μλμ κ°μ΄ ymlμ μ κ°μΈ PCμ μ μ₯νλλ‘ μ€μ ν΄μ£Όμλλ°, λ°°ν¬λ₯Ό μμνκ² λλ©΄μ νμΌ κ΄λ¦¬λ₯Ό μν S3 μλ²λ₯Ό μ¬μ©νκ² λμμ΅λλ€.
upload:
post:
image:
location: /Users/kdo6301/Desktop/sharing_platform_server/post/
member:
image:
location: /Users/kdo6301/Desktop/sharing_platform_server/member/
μ΄λ² ν¬μ€ν μμλ Spring Bootμμ AWS S3 μλ²λ₯Ό μ΄μ©νμ¬ νμΌ κ΄λ¦¬λ₯Ό νλ λ°©λ²μ λν΄ μμλ³΄κ² μ΅λλ€.
1. S3 (Simple Storage Service) λ?
- AWSμμ μ§μνλ νμΌ κ΄λ¦¬ μ€ν λ¦¬μ§ μλ²μ λλ€.
- νμ₯μ±κ³Ό λ΄κ΅¬μ±μ΄ μ’μ΅λλ€.
- κ°μ μΌ κΈ°μ€ 12κ°μκ° λ¬΄λ£λ‘ μ¬μ©ν μ μμ΅λλ€.
2. μ¬μ μ€λΉ
- S3 λ₯Ό μ¬μ©νκΈ° μν΄μλ AWSμμ λ²ν·κ³Ό IAMμ λ¨Όμ μμ±ν΄μ£Όμ΄μΌν©λλ€.
- λ²ν· : λ€μμ κ°μ²΄λ₯Ό κ΄λ¦¬νλ 컨ν μ΄λ ( νμΌμ κ΄λ¦¬ν μ μλ νμΌ μμ€ν μ΄λΌκ³ 보면 λ¨ )
- IAM : S3μ μ κ·ΌνκΈ° μν μ¬μ©μ μ 보
μ¬μ©μ(IAM) μμ±
1. AWS κ²μμ°½μ iam μ κ²μν ν μ£Όμ κΈ°λ₯ - μ¬μ©μ ν΄λ¦
2. μνλ μ¬μ©μ μ΄λ¦ μ§μ - λ€μ
3. μλμ κ°μ΄ κΆν μ€μ - λ€μ
4. κ²ν λ° μμ± - μ¬μ©μ μμ±
5. μ‘μΈμ€ ν€ μ€μ - μ¬μ©μ μ΄λ¦ ν΄λ¦
6. μμ½ - μ‘μΈμ€ ν€ λ§λ€κΈ°
7. μ‘μΈμ€ ν€ μ¬μ© μ¬λ‘ μ ν - μ무거λ μ ν ν΄λ ok
8. μνλ νκ·Έ μμ± ( μ ν ) ν - μ‘μΈμ€ ν€ λ§λ€κΈ°
9. csv νμΌ λ€μ΄λ‘λλ₯Ό ν΄λ¦ν©λλ€. ( μ΄ νμΌμλ 곡κ°ν€μΈ Access Keyμ , λΉλ°ν€μΈ Secret Key μ λ³΄κ° λ€μ΄κ° μκΈ° λλ¬Έμ νμΌ κ΄λ¦¬μ μ£Όμκ° νμν©λλ€ )
μ΄μ S3μ μ κ·ΌνκΈ° μν IAMμ λν μ€μ μ΄ μλ£λμμ΅λλ€. λ²ν·μ μμ±ν΄λ΄ μλ€.
λ²ν· μμ±
1. κ²μμ°½μ s3 κ²μ
2. λ²ν· λ§λ€κΈ° ν΄λ¦
3. μΌλ° κ΅¬μ± - λ²ν· μ΄λ¦ μ§μ
4. Public Access μ°¨λ¨ ν΄μ λ° λ²ν· λ§λ€κΈ° ν΄λ¦
νμΌμ κ΄λ¦¬ν μ μλ νλμ λ²ν·μ΄ μμ±λμμ΅λλ€. μ΄μ μ¬μ μ€λΉκ° λͺ¨λ λλ¬μ΅λλ€. μ΄μ Spring bootμ μ΄ λ²ν·κ³Ό μ°λν΄λ΄ μλ€.
3. Spring Bootμ μ°λ
1. build.gradleμ μμ‘΄κ΄κ³ μΆκ°
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'
2. IAM μμ±μμ λ°κΈλ°μ csv νμΌμ 곡κ°ν€μ λΉλ°ν€, κ·Έλ¦¬κ³ λ²ν·μ μμ±ν λ μ§μ ν λ²ν· μ΄λ¦μ ymlμ λ€μκ³Ό κ°μ΄ μ€μ ν΄μ€λλ€.
- μ΄ λ AccessKeyμ SecretKey μ 보λ githubμ μ¬λΌκ°κ² λλ©΄ ν΄νΉμΌλ‘ μΈν κ³ΌκΈ μνμ΄ λ°μν μ μμΌλ―λ‘ yml νμΌμ gitignoreλ‘ μ€μ νμ¬ λ°λμ githubμ μ¬λΌκ°μ§ μλλ‘ ν©μλ€.
- cloud.aws.region.static: ap-northease2 : μ§μ νκ΅ κ³ μ
3) μ€νλ§ μ€μ μΆκ°
@Configuration
public class S3Config {
@Value("${cloud.aws.credentials.access-key}")
private String accessKey;
@Value("${cloud.aws.credentials.secret-key}")
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 μλ²μ λ²ν·μ μ μ₯νλλ‘ Refactoring
PostFileService
@Service
@RequiredArgsConstructor
public class PostFileService {
@Value("${cloud.aws.s3.bucket}")
private String BUCKET;
private final AmazonS3Client amazonS3Client;
public void upload(MultipartFile file, String filename) {
try {
ObjectMetadata metadata= new ObjectMetadata();
metadata.setContentType(file.getContentType());
metadata.setContentLength(file.getSize());
amazonS3Client.putObject(BUCKET + "/post", filename, file.getInputStream(), metadata);
} catch(IOException e) {
throw new FileUploadFailureException();
}
}
public void delete(String fileName){
DeleteObjectRequest request = new DeleteObjectRequest(BUCKET + "/post", fileName);
amazonS3Client.deleteObject(request);
}
}
- κΈ°μ‘΄μλ upload()λ©μλμμ try/catchλ¬ΈμΌλ‘ λ‘컬μμ νλμ μ§μ ν μμΉμ μ κ·Όνμ¬ νμΌμ μ μ₯νκ³ , λ§μ½ IOExceptionμΌλ‘ νμΌμ λ‘λμ μ€ν¨νλ κ²½μ° Customν extended RuntimeExceptionμΈ FileUploadExceptionμ λμ§λλ‘ κ΅¬ννμ΅λλ€.
- κΈ°μ‘΄μλ delete() λ©μλλ νλμ μ§μ ν μμΉμ μ κ·Όνμ¬ νμΌμ μμ νλλ‘ κ΅¬ννμ΅λλ€.
- S3 μ€ν λ¦¬μ§ μλ²λ₯Ό μ¬μ©ν μ΄ν λΆν°λ μ μ½λμ κ°μ΄ ymlμ μ§μ ν΄μ€ BUCKETμ ν΄λμ μ κ·Όνμ¬ νμΌμ μ λ‘λνκ³ , μ§μΈ μ μλλ‘ λ³κ²½νμμ΅λλ€.
5. Postman Test
μ λ‘λ ν μ€νΈ
1) κ²μκΈ μμ± μμ² with νμΌ
- μ΄ λ λ³λλ‘ μμ±ν΄λ Post Image λ°μ΄ν°λ² μ΄μ€μ νμΌμ originNameκ³Ό uniqueNameμ΄ μ μ₯λ©λλ€. (for μ¬μ©μκ° νμΌμ μμ±νκ³ , μμ ν λ S3μ μ μ₯λ νμΌμ΄ 무μμΈμ§ νμ νκΈ° μν΄μ)
2) λ²ν·μ νμΌμ΄ μ μ μ₯λ κ²μ νμΈν μ μμ΅λλ€.
κ²μκΈ μμ ν μ€νΈ - μ΄λ―Έμ§ νμΌ μμ
1) μμ μμ²
2) λ²ν·μμ μμ λ κ²μ νμΈν μ μμ΅λλ€.
- μ°Έκ³ λ‘ μ΄λ―Έμ§ μμ λ λ΄λΆμ μΌλ‘ κ²μκΈ μμ APIμμ Post Imageλ₯Ό μν λ³λμ λ°μ΄ν°λ² μ΄μ€λ₯Ό μ΄μ©νμ¬ μμ² APIμ νΌλ°μ΄ν°μ deleteImageNamesλ‘ μμ±ν originNameκ³Ό μΌμΉνλ νμΌμ uniqueNameμ S3μλ²μμ μμ νλλ‘ κ΅¬ννμμ΅λλ€)
<μ°Έκ³ μλ£>
[Spring boot] AWS S3 λ₯Ό μ΄μ©ν νμΌ μ λ‘λ
κ°μΈ νλ‘μ νΈλ₯Ό νλ©° μ΄λ―Έμ§ μλ²λ‘ μ¬μ©νκΈ° μν΄ AWS S3 λ²ν·μ λ§λ€κ³ Spring μ μ°λνλ λ°©λ²μ μ 리ν΄λ³΄μλ€. [1] AWS S3 κ°μ AWS S3 λ? S3λ Simple Storage Service μ μ½μλ‘ μ£Όλ‘ νμΌ μλ²λ‘ μ¬μ©
gaeggu.tistory.com