AWS - S3
0. 서론
AWS의S3서비스는 스토리지 서비스로 다양한 종류의 데이터를 업로드하거나 내려받을 수 있는 서비스이다.
실제로 S3로 파일이나 정적 데이터를 서비스하고 EC2는 동적인 리소스를 처리하는 방식으로 구성하다니 한번 실습하도록 하겠다.
1. S3 세팅
S3서비스에서 [버킷 - 버킷만들기]를 이용하면 설정 페이지가 나오는데 엑세스 설정은 외부에서 사용 가능하도록 설정한다.
버킷을 생성 후 [권한] 설정을 위해 생성한 버컷을 선택하고 [권한] 항목에서 버킷 정책 편집을 선택하면 문자열 작성하는 페이지가 나오는데 쉽게 하기 위해 [정책 생성기]를 이용한다.
정책을 생성할 때 주의할 점
- 첫단계에서 S3 Bucket Policy를 선택
- Principal 항목에는
*을 입력 - Actions항목에는
GetObject,PutObject,DeleteObject를 선택 - Amazon Resource Name항목에 생성한 버킷의
ARN값 뒤에/*를 추가
위 과정을 다하고 밑에 [Generate Policy]를 실행하면 JSON이 만들어지게 된다.
생성된 JSON 문자열을 복사해서 이전 버킷 정책으로 지정하고 저장하여 완료하자.
완료가 되었으면 버킷에 파일을 업로드하여 테스트를 해보자
참고로 업로드 한 다음 파일 객체를 선택해서 [객체 URL]를 선택하면 파일을 볼 수 있다.
2. 제어 설정
스프링 부트와 같은 프로그램으로 S3에 접근해서 파일 업로드를 진행하기 위해서 추가적인 보안 설정이 필요하다.
먼저 AWS의 IAM항목에 들어가 [사용자]항목을 선택하여 사용자 생성을 하도록 하자
사용자의 정책은 검색해서 amazonS3FullAccess를 찾아서 지정하자.
사용자를 생성하면 [액세스 키 만들기]를 이용해 [CLI]를 선택하여 엑세스 키를 만들고 나면 따로 기록하든지 아님 .csv파일 내려받아서 보관하도록 하자.
이제 사용자 생성이 완료되었으니 다시 S3항목으로 돌아와서 생성한 버킷의 [권한]을 확힌해 보면 [객체 소유권]이라는 항목이 있을텐데 [ACL 활성화됨]으로 편집해 주어야 한다.
3. 인텔리제이에서 S3를 이용하기 위한 의존성 및 설정
인텔리제이에서 S3관련해서 이용할려면 아래와 같은 라이브러리 의존성 추가, 설정을 해줘야 하는데 책에는 없지만 난 config설정 클래스도 만들어 빈으로 등록까지 해야 에러가 나지 않았다.
- build.gradle
1
implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE'
- application.properties
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
cloud.aws.credentials.access-key=${AWS_ACCESS_KEY_ID}
cloud.aws.credentials.secret-key=${AWS_SECRET_ACCESS_KEY}
cloud.aws.s3.bucket=생성한 버킷 이름
cloud.aws.region.static=자신이 이용하는 지역
cloud.aws.stack.auto=false
com.example.upload.path=파일을 실제로 저장할 폴더 경로
spring.servlet.multipart.enabled=true
spring.servlet.multipart.location=파일 업로드 시 임시 저장할 폴더 경로
spring.servlet.multipart.max-request-size=30MB
spring.servlet.multipart.max-file-size=10MB
logging.level.com.amazonaws.util.EC2MetadataUtils=error
- Amazon Config
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
@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 AmazonS3 amazonS3Client(){
BasicAWSCredentials awsCredentials = new BasicAWSCredentials(accessKey, secretKey);
return AmazonS3ClientBuilder.standard()
.withRegion(region)
.withCredentials(new AWSStaticCredentialsProvider(awsCredentials))
.build();
}
}
4. EC2에서 S3 설정
로컬에서 이것저것 테스트를 했다면 EC2환경에서 확인하고 싶을 텐데 난 인텔리제이에서 테스트한 프로젝트를 깃허브에 푸시 시도를 할려고 하였는데 application.properties파일에 엑세스 키 정보를 적었기 때문에 설정 파일에 입력한 민감한 정보는 환경 변수로 설정하는 것이 좋다고 한다.
- application.properties
1
2
cloud.aws.credentials.access-key=${AWS_ACCESS_KEY_ID}
cloud.aws.credentials.secret-key=${AWS_SECRET_ACCESS_KEY}
그러면 정상적으로 수정한 프로젝트를 다시 푸시하면 올라갈 것이고, EC2에서 이 엑세스 키를 환경 변수 설정을 위한 수정을 해야 한다.
먼저 홈 디렉터리에서 .bashrc파일을 수정한다.
1
nano ~/.bashrc
.bashrc파일 아래에 다음과 같이 환경 변수를 추가한다.
1
2
export AWS_ACCESS_KEY_ID="your-aws-access-key-id"
export AWS_SECRET_ACCESS_KEY="your-aws-secret-access-key"
이렇게 수정이 완료 되었으면 EC2에서 정상적으로 프로젝트가 실행할 수 있을 것이다.