๋์ ํ๊ฒ ๋ ๊ณผ์
์ฌ์ฉ์๊ฐ ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ํด์ผํ๋ ์ํฉ ๋ฐ์ํ๋ค.
ํ๋ก ํธ ๊ฐ๋ฐ์๋ค๊ณผ ์ด๋ฏธ์ง ์ ๋ก๋ ๊ตฌํ์ Multipart ์์ฒด๋ฅผ ์ฃผ๊ณ ๋ฐ๋ ๊ฒ์ผ๋ก ๋ ผ์๋ฅผ ํ๋ค๊ฐ, ํด๋น ๊ตฌํ์ ๋ฌธ์ ์ ์ด ์์๋ค.
์๋ฒ ๋ถํ๊ฐ ์ฌ ๊ฐ๋ฅ์ฑ์ด๋ค.
ํ์ฌ ์ฐ๋ฆฌ ์๋ฒ๋ ec2 micro2๋ฅผ ์ฌ์ฉํ๊ณ ์์ผ๋ฉฐ, ์ด๋ฏธ ๋ฉ๋ชจ๋ฆฌ ๋ถ์กฑ ์ด์๊ฐ ๋ฐ์ํ๊ณ ์๋ค.
์ด๋ฏธ์ง ํ์ผ์ฉ๋ ์์ฒด๊ฐ ๋งค์ฐ ํฌ๊ธฐ์, ์ด๋ฏธ์ง ์ ๋ก๋๊ฐ ๋ฐฑ์๋ ์๋ฒ๋ฅผ ๊ฑฐ์น๊ฒ๋๋ฉด ๋ฐฑ์๋ ์๋ฒ๊ฐ ๊ธ๋ฐฉ ์ฃฝ๊ฒ ๋๋ค.
ํด๋น ๋ฌธ์ ์ ๋ํ ํด๊ฒฐ ๋ฐฉ๋ฒ์ผ๋ก Presigned-url์ ์ฌ์ฉํ๋ค๊ณ ํ๋ค.
๊ธฐ์กด์ ๋ฐฉ์
1. ์๋ฒ๊ฐ ํด๋ผ์ด์ธํธ์๊ฒ ์ด๋ฏธ์ง ์์ฒด๋ฅผ ๋ฐ๋๋ค.
2. ์๋ฒ๊ฐ ๋ณด์์ ์ฐจ๋ฅผ ๊ฑฐ์น๋ค.(AWS sdk secret key๋ฅผ ํ์ฉํด s3์ ์)
3. ์๋ฒ๊ฐ ๋ฒํท์ ์ด๋ฏธ์ง๋ฅผ ์ฌ๋ฆฐ๋ค.
์ด๋ ๊ฒ ๊ตฌํ๋ ์ด์ ๋ ๋ณด์์ด์ ๋๋ฌธ์ด๋ค. ์๋ฌด๋ ์ด๋ฏธ์ง๋ฅผ ์ ๋ก๋ํ๊ฒ ํ๋ฉด ์๋๊ธฐ์, ์๋ฒ๋ฅผ ๊ฑฐ์ณ ์ด๋ฏธ์ง ์ ๋ก๋๋ฅผ ๊ตฌํํ์๋ค.
PresignedUrl์ด๋?
๋ชจ๋ ๊ฐ์ฒด๋ ๊ธฐ๋ณธ์ ์ผ๋ก ๋น๊ณต๊ฐ์ด๋ฉฐ, ๊ฐ์ฒด ์์ ์๋ง ๊ฐ์ฒด์ ์ก์ธ์ค ํ ์ ์๋ค. ๊ฐ์ฒด ์์ ์๋ ํ์ํ ๊ฒฝ์ฐ ์์ ์ ๋ณด์ ์๊ฒฉ ์ฆ๋ช ์ ์ฌ์ฉํ์ฌ ์ผ์ ๊ธฐ๊ฐ ๋์ ๊ฐ์ฒด ๋ค์ด๋ก๋๋ฅผ ํ๊ฐํ๋ ๋ฏธ๋ฆฌ ์๋ช ๋ URL ์ ๋ง๋ค์ด ๋ค๋ฅธ ์ฌ์ฉ์์ ๊ฐ์ฒด๋ฅผ ๊ณต์ ํ ์ ์๋ค.
์ด Presigned-Url์ ํตํด ํด๋ผ์ด์ธํธ๋ ๋ฐฑ์๋ ์๋ฒ๋ฅผ ๊ฑฐ์น์ง ์๊ณ , ๋ฐ๋ก S3๋ก ์ ๋ก๋๊ฐ ๊ฐ๋ฅํด์ง๋ค.
์์ ๊ธฐ์กด ๋ฐฉ์ 2๋ฒ์ ์ฐจ๋ฅผ ์๋ฒ๊ฐ ํ๊ณ , 3๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ ํ๋ ๋ฐฉ์์ด๋ค.
๋ฐฑ์๋๋ presignedUrl์ ์์ฑํด์ค ๋ณด์์ ์ฐจ ์์ ์ ์งํํด์ฃผ๊ณ , Client๋ ์ด๋ฅผ ๋ฐ์ AWS S3๋ก ๋ฐ๋ก ์ ๋ก๋๊ฐ ๊ฐ๋ฅํด์ง๋ค.
PresignedUrl์ ์ด์ฉํ๊ฒ ๋๋ฉด
1. ์ฌ์ฉ์๊ฐ ์ด๋ฏธ์ง ์ ๋ก๋๋ฅผ ํ๋ค.
2. ํด๋ผ์ด์ธํธ๋ ์๋ฒ์ filename์ ๋ณด๋ด๋ฉฐ PresignedUrl ์์ฒญ์ ๋ณด๋ธ๋ค.
3. ์๋ฒ๋ ์๋ต๊ฐ์ผ๋ก PresignedUrl๊ณผ ํ์ผ ์ด๋ฆ๋ค์ ๋ ์ง๊ฐ ์ถ๊ฐ๋ filename์ ๋ณด๋ธ๋ค.
4. ํด๋ผ์ด์ธํธ๋ PresignedUrl์ Put ๋ฉ์๋๋ก file์ ํจ๊ป ๋๊ฒจ์ฃผ๋ฉด ์ ๋ก๋๊ฐ ์๋ฃ๋๋ค.
5. ์ ๋ก๋ ํ ๋ฐ์ ์ด๋ฏธ์ง ๊ฒฝ๋ก๋ฅผ String ํํ๋ก ์๋ฒ์ ์ ๋ฌํ๋ค.
๊ตฌํ ๊ณผ์
1. S3์์ ๋ฒํท ์์ฑํ๊ธฐ
์ ํฌ ์๋น์ค๋ ๋ชจ๋ ์ฌ์ฉ์๊ฐ ์ ๋ก๋ํ ํ์ผ์ Publicํ๊ฒ ์ ๊ทผํ ์ ์์ด์ผํ๋ค.
๋ฒํท์ ์์ฑํ ๋ ํผ๋ธ๋ฆญ ์์ธ์ค ์ฐจ๋จ ์ค์ ์ ํด์ ํจ.
์ด๋ ๊ฒ ์ค์ ํ๊ณ ๋๋ฉด ๋ฒํท ์์ฑ์๋ฃ!
๋ฒํท ์์ฑํ ํ, ์ ์ฑ ์ค์ ์ ํ๊ธฐ ์ํด ๋ฒํท์ ํธ์ง
๋ฒํท > ๊ถํํญ์ ์ ์ฑ ํธ์ง์ ํด๋ฆญ
1 - 1 . ์ ์ฑ ์์ฑ
๋ฒํท ARN ๋ณต์ฌํ๊ณ ๋ค์ /* ๋ถ์ด๊ธฐ
Effect: Allow
Principal: *
AWS Service: Amazon S3
Actions: Get*, Put*
ARN : arn:aws:s3:::{bucket_name}/*
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:Put*",
"s3:Get*"
],
"Resource": "arn:aws:s3:::wish-image-bucket/*"
}
]
}
1 - 2. CORS ์๋ฌ ๋ฐฉ์ง ์ค์
[
{
"AllowedHeaders": [
"*"
],
"AllowedMethods": [
"HEAD",
"GET",
"PUT",
"POST"
],
"AllowedOrigins": [
"*"
],
"ExposeHeaders": [
"ETag"
]
}
]
2. IAM ๊ถํ ์์ฑ
S3๋ฒํท์ ์ ๊ทผํ ์ ์๋ ์ฌ์ฉ์๋ฅผ ํตํด API ๋ด์์ ํ์ผ์ ๋ฒํท์ ์ ๋ก๋ํ ์ ์๋๋ก IAM ์๋น์ค์ ์ ๊ทผ ๊ฐ๋ฅํ ์ฌ์ฉ์๋ฅผ ์ถ๊ฐํด์ผํ๋ค.
์ฌ์ฉ์ ์ด๋ฆ ์ ๋ ฅ > ์ง์ ์ ์ฑ ์ฐ๊ฒฐ ์ต์ ์ ํ AmazonS3FullAccess๊ถํ์ ์ถ๊ฐํ๊ณ ์ฌ์ฉ์๋ฅผ ์ถ๊ฐํ๋ค.
์์ธ์คํค๋ฅผ ๋ง๋ค๊ณ , CSV ํ์ผ์ ๊ผญ ๊ผญ ์ ์ฅํด์ผํ๋ค!!!!!!!!!!!!!!!!!
3. Springboot ํ๋ก์ ํธ ์ ์ฉํ๊ธฐ
์์กด์ฑ ์ถ๊ฐ
implementation 'software.amazon.awssdk:s3:2.17.285'
Properties ํ์ผ
cloud:
aws:
region: ap-northeast-2
credentials:
access-key: {IAM access-key}
secret-key: {IAM secret-key}
s3:
bucket: {๋ฒํท์ด๋ฆ}
Config ํ์ผ ์์ฑ
package com.sopterm.makeawish.config;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import software.amazon.awssdk.auth.credentials.AwsBasicCredentials;
import software.amazon.awssdk.auth.credentials.AwsCredentials;
import software.amazon.awssdk.auth.credentials.StaticCredentialsProvider;
import software.amazon.awssdk.regions.Region;
import software.amazon.awssdk.services.s3.S3Client;
import software.amazon.awssdk.services.s3.presigner.S3Presigner;
@Configuration
public class S3Config {
@Value("${cloud.aws.region}")
private String region;
@Value("${cloud.aws.credentials.access-key}")
private String accessKey;
@Value("${cloud.aws.credentials.secret-key}")
private String secretKey;
@Bean
public AwsCredentials basicAWSCredentials() {
return AwsBasicCredentials.create(accessKey, secretKey);
}
@Bean
public S3Presigner s3Presigner(AwsCredentials awsCredentials) {
return S3Presigner.builder()
.region(Region.AP_NORTHEAST_2)
.credentialsProvider(StaticCredentialsProvider.create(awsCredentials))
.build();
}
@Bean
public S3Client s3Client (AwsCredentials awsCredentials) {
return S3Client.builder()
.region(Region.AP_NORTHEAST_2)
.credentialsProvider(StaticCredentialsProvider.create(awsCredentials))
.build();
}
}
https://github.com/Make-A-Wish-Sopt/Make-A-Wish-Server/pull/110/files
'Server๐งค > SpringBoot' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Spring] ์ ์ CRUD ๊ตฌํํ๊ธฐ (0) | 2022.04.28 |
---|---|
[Server] ๊ฐ๋ฐํ๊ฒฝ ๊ตฌ์ถํ๊ธฐ - Spring (0) | 2022.04.28 |