티스토리 뷰

[프로그래밍/AWS] - [AWS] AWS S3 파일 업로드

 

[AWS] AWS S3 파일 업로드

오늘 포스팅 내용은 AWS S3 파일 업로드에 대해 정리해보자. Bucket 생성 및 권한(정책) 수정 AWS 콘솔에서 S3 메뉴에서 버킷 생성을 하고 권한 탭에서 버킷 정책을 수정해야 한다. 버킷 정책은 정책

reference-m1.tistory.com

지난 포스팅에 AWS S3 업로드에 대해 알아보았다. 이번에는 추가적으로 S3 PreSignedURL에 대해 설명하고자 한다. AWS 환경을 구축하고 개발을 하면서 아래에 해당하는 경우에는 preSignedURL이 필수적이다.

 

preSignedURL이 필요한 경우

  • S3 서버 블록 암호화 설정을 하였을 때
  • 10MB 이상의 파일을 업로드, 다운로드(API Gateway)

 

1. S3 서버 블록 암호화

S3 서버 블록 암호화는 프로젝트를 하다 보면 클라우드 보안 요건 사항이다. 블록 암호화를 적용하면 일반적으로 접근했던 파일들이 모두 아래와 같이 접근이 불가하다는 화면으로 바뀌어 버린다.

이제 해당 파일에 접근을 하고자 한다면 preSignedURL을 생성하여 접근해야 한다. 생성할 때는 유효한 시간을 설정할 수 있으며(유효시간은 1분 ~ 7일), 유효시간이 지나면 아래와 같은 화면으로 전환된다.

개발 또는 운영 환경에 맞게 유효시간을 설정하여 preSignedURL을 만들면 된다.

 

2. 10MB 이상의 파일 업로드, 다운로드

API Gateway는 10MB 이상 리소스를 지원하지 않는다. 사실 API Gateway를 구성하면서 미처 생각하지 못하였다. API Gateway의 자세한 리소스 설명은 아래와 같다.

https://docs.aws.amazon.com/ko_kr/apigateway/latest/developerguide/limits.html

 

Amazon API Gateway 할당량 및 중요 정보 - Amazon API Gateway

버스트 할당량은 리전의 해당 계정에 대한 전체 RPS 할당량에 따라 API Gateway 서비스 팀에서 결정됩니다. 이 할당량은 고객이 조절하거나 변경을 요청할 수 없습니다.

docs.aws.amazon.com

 

10MB 이상의 파일을 관리해야 한다면 preSignedURL 생성하여 직접 S3로 올려야 한다. S3 멀티파트 업로드 제한은 아래와 같다. 예를 들어 단일 파일에 대한 최대 업로드 용량은 5 TiB이다.

https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/userguide/qfacts.html

 

Amazon S3 멀티파트 업로드 제한 - Amazon Simple Storage Service

이 페이지에 작업이 필요하다는 점을 알려 주셔서 감사합니다. 실망시켜 드려 죄송합니다. 잠깐 시간을 내어 설명서를 향상시킬 수 있는 방법에 대해 말씀해 주십시오.

docs.aws.amazon.com

 

3. AwsService.java

기존에 작성된 AwsService.java에 아래 함수를 추가하여 작성하면 된다.

/**
 * 서명된 url
 * 
 * @param orgFileName
 * @param fileName
 * @param httpMethod
 * @return
 */
public String getPreSignedURL(String oriFileName, String fileName, HttpMethod httpMethod) {

    // 만료시간 설정
    Date expiryDate = Date.from(Instant.now().plus(expiryTime, ChronoUnit.MINUTES));

    GeneratePresignedUrlRequest generatePresignedUrlRequest = new GeneratePresignedUrlRequest("",
            bucket + "/" + fileName)
            .withMethod(httpMethod)
            .withExpiration(expiryDate);

    if (HttpMethod.GET.equals(httpMethod)) {

        try {
            ResponseHeaderOverrides headerOverrides = new ResponseHeaderOverrides()
                .withCacheControl("No-cache")
                .withContentDisposition("attachment; filename=\"" + URLEncoder.encode(oriFileName, "UTF-8") + "\"");
                
            generatePresignedUrlRequest.withResponseHeaders(headerOverrides);
        } catch (UnsupportedEncodingException e) {
            throw new ResponseStatusException(HttpStatus.INTERNAL_SERVER_ERROR);
        }
            
    }

    URL url = amazonS3Client.generatePresignedUrl(generatePresignedUrlRequest);
    String preSignedURL = url.toString();

    log.info("Pre-Signed HttpMethod : {} URL : {} ", httpMethod, preSignedURL);

    return preSignedURL;
}

getPreSignedURL은 크게 2가지로 구분되어 동작하게 작성하였다.

  • GET 메서드 - S3 파일을 접근, 또는 다운로드(한글 파일명 때문에 URLEncoder) 할 수 있는 url 리턴
  • 그 외 메서드 - PUT일 경우 S3 업로드 가능한 URL를 리턴

만료시간은 yml 파일에서 환경별로 시간을 관리하도록 구성하였다.

 

4. S3 CORS 설정

preSignedURL을 통해 파일을 직접 올릴때는 S3 CORS 설정을 변경해 줘야 한다. 간단한 예시는 아래와 같다.

 

'프로그래밍 > AWS' 카테고리의 다른 글

[AWS] AWS MFA 인증 설정  (0) 2022.08.02
[AWS] AWS SSM(Session Manager) SSH 터널링  (0) 2022.07.18
[AWS] AWS S3 파일 업로드  (0) 2022.07.13
[AWS] RDS 시간 설정(Timezone)  (0) 2022.06.16
[AWS] AWS KMS(CMK) 암복호화  (0) 2022.06.15
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
링크
«   2024/05   »
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
글 보관함