티스토리 뷰

 

온라인에서 문서를 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 쪽도 진도가 조금 나갔는데 어떻게 글을 쓰기 시작할지 모르겠다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
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
글 보관함