티스토리 뷰
온라인에서 문서를 PDF로 변환하는 프로젝트를 진행 중이다.
가장 큰 걸림돌이라 예상됐던, PDF 변환 솔루션은 다행히도 잘 동작하고 있다.
(몇몇 확장자는 지원한다더니 안되지만 말이다)
문제는 사용자에게 파일 크기가 큰 파일을 어떻게 사용자에게 전달할 것인가? 였다.
가장 먼저 떠오르는 방식은 Base64나 ByteArray로 변환하고 FE에서 파일로 변환하는 거였지만,
사용자가 요청하는 파일 크기가 커진다면 응답의 크기가 얼마나 커질지 알 수가 없다.
이런저런 방법을 알아보다가 퍼블릭한 S3를 만들어서 S3 경로를 던져주고
PDF 뷰어는 브라우저에게 맡기는게 가장 손이 덜 가는 방법이라는 결론을 짓게 됐다.
퍼블릭한 S3 버킷를 만드는건 어렵지 않을거라 생각했다.
왜냐면 생성할 때 주는 옵션이 있기 때문이었다.
하지만 생각보다 적용해야 할 게 많았다는건 언제나 맞아보고나서 알게된다.
하나씩 진행해보자.
버킷 만들기
먼저해야할 것은 퍼블릭 액세스를 허용하는 것이다. 버킷 생성할 때 아래의 옵션을 풀어줘야한다.
AWS S3 > 버킷 > 버킷 만들기 > 이 버킷의 퍼블릭 액세스 차단 설정
버킷을 만들 때 할 수 있는 설정은 이게 끝이다.
이름만 결정해서 만들면 되고, 버전 관리도 필요해주면 설정해준다.
위 설정은 객체를 퍼블릭하게 설정할 수 있는 상태를 만들어 주는 옵션이다.
버킷을 만들었으니 객체(이미지)를 하나 업로드하고 테스트해보자.
이 상태로 이미지를 하나 올려두고 접근해보면 AccessDenied 에러가 발생한다.
AccessDenied는 언제나 그렇듯 권한이 없다는 것이다.
S3 버킷 권한 & ACL 설정하기
다시 권한으로 가서 권한 개요의 액세스 아래를 클릭해보면 아래와 같은 안내가 나온다.
이 안내는 별것 아닌거처럼 보이지만 두 가지 안내를 하고 있다.
1. 이 버킷을 퍼블릭 버킷으로 만들어라
2. 객체에 퍼블릭 액세스 권한을 부여해라
1번은 간단하다. 권한 탭 > 버킷 정책에서 아래의 설정을 추가한다. Sid는 임의로 작성했다.
{
"Version": "2012-10-17",
"Statement": {
"Sid": "AddPublicReadPermissions",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::hello-world-public-s3-test/*"
}
}
위 권한을 S3 버킷에 추가하면 퍼블릭 액세스가 가능해지며, 아래와 같이 빨간 글시로 표기해준다.
아까 올려뒀던 cat_thumb.png에 다시 접근해보면 아래와 같이 잘 나온다.
이 객체는 S3에서 자체적으로 업로드했기 때문에 버킷을 만들 때 아래에 설정한 객체 소유권(ACL) 옵션을 따라가게 된다.
https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/acl-overview.html
그런데, 내가 하고 싶은 건 수동으로 업로드 하는게 아니다.
서버에서 PutObject를 해주고 싶은 것이기 때문에 추가 권한 설정이 필요하다.
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AddPublicReadPermissions",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::hello-world-public-s3-test/*"
},
{
"Sid": "AddPublicPutPermissions",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:PutObject",
"Resource": "arn:aws:s3:::hello-world-public-s3-test/*"
}
]
}
그리고 스프링 부트 서버에서 업로드 할때 ACL을 설정하는 경우도 있다.
(업로드하는 법 : 2023.06.06 - [개발/AWS] - AWS S3란? 스프링 부트에서 S3에 업로드하기)
PutObjectRequest putObjectRequest = PutObjectRequest.builder()
.bucket(dataBucketName)
.key(s3Path)
.acl(ObjectCannedACL.BUCKET_OWNER_FULL_CONTROL)
.build();
위와 같이 다른 프라이빗 S3 버킷은 BUCKET_OWNER_FULL_CONTROL ACL을 갖도록 설정해놨다.
ACL을 보면, PUBLIC_READ 옵션이 있다.
아 퍼블릭 업로드 ACL 설정이 있다. 그대로 가져다 쓰면 되겠지하고 쓰면 안된다.
이 ACL 옵션을 설정하고 업로드를 하면 400에러가 발생한다.
software.amazon.awssdk.services.s3.model.S3Exception: The bucket does not allow ACLs (Service: S3, Status Code: 400, Request ID: V9J59J3R3YEY5Z8R, Extended Request ID: Ex6tNnk7nzKWZK9Jpdh9CgxCe+lZ6L3v7VdC982qot5tfyus/fX5tZcR73UcXG7nztcn5mGNVsw=)
정확한 이유는 모르겠는데, 퍼블릭 설정된 S3 버킷 내에서는 별도의 ACL 설정이 불가능한 것 같다.
그래서 ACL 옵션만 제거하고 PutObject를 하면 된다.
PutObjectRequest putObjectRequest = PutObjectRequest.builder()
.bucket(converterS3Bucket)
.key(s3Path)
.build();
마치며
최근에 지표 관련 업무를 하다보니, 블로그에 쓰기 애매한 업무들이 많았다.
이번 글인 퍼블릭 S3 설정은 그냥 되겠거니하고 작업을 시작했는데 이리저리 애로사항이 많았지만 그래도 금방 해결했다.
하지만, 금방 새로운 큰 이슈들이 있었고 그에 대응하는 포스팅을 할 것 같다.
테라폼+EKS 쪽도 진도가 조금 나갔는데 어떻게 글을 쓰기 시작할지 모르겠다.
'개발 > AWS' 카테고리의 다른 글
한 눈에 알아보는 AWS VPC(Virtual Private Cloud) 정리 (0) | 2024.04.16 |
---|---|
Amazon S3 파일 주기적으로 삭제하기 : SpringBoot에서 미리 서명된 URL(pre-signed URL) 써보기 (0) | 2024.03.28 |
AWS EC2에 SSL/TLS(HTTPS) 인증서 적용기 (0) | 2024.01.26 |
AWS Lambda@Edge로 이미지 사이즈 줄이기(webp 변환) (0) | 2024.01.16 |
꼭 읽어줬으면 하는 AWS Lambda@Edge의 특이 사항들 정리 (0) | 2024.01.16 |
- Total
- Today
- Yesterday
- openAI API
- lambda
- AWS
- 람다
- JWT
- CloudFront
- cache
- AOP
- terraform
- java
- EKS
- 오블완
- docker
- elasticsearch
- OpenFeign
- Elastic cloud
- 스프링부트
- S3
- ChatGPT
- 후쿠오카
- AWS EC2
- Log
- springboot
- OpenAI
- GIT
- Kotlin
- Spring
- MySQL
- serverless
- 티스토리챌린지
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |