본문 바로가기
Cloud

Amazon S3

by Ahngyuho 2025. 2. 16.

오늘은 Amazon S3가 무엇이고, 어떻게 만들고 사용할  수 있는지 알아보겠습니다.

 

Amazon S3 란?

Amazon S3 는 객체 스토리지로 저장된 데이터를 객체로 접근 및 저장할 수 있는 기술입니다. 클라우드 + 객체 스토리지 이므로 외부에 저장된 내 데이터를 객체 형식으로 저장 및 접근할 수 있는 것입니다.

 

우선 S3 사이트로 가봅시다.

 

https://ap-northeast-2.console.aws.amazon.com/s3/get-started?region=ap-northeast-2&bucketType=general

 

https://ap-northeast-2.console.aws.amazon.com/s3/get-started?bucketType=general®ion=ap-northeast-2

 

ap-northeast-2.console.aws.amazon.com

 

 

여기서 버킷 생성에서 버킷 만들기를 눌러줍니다.

 

 

버킷을 만들기 위한 설정들이 나옵니다.

버킷 이름은 임의대로 하시면 됩니다.

 

 

이건 버킷의 접근을 퍼블릭하게 열어준다는 것인데, 저는 이 S3 버킷을 모든 사용자가 접근할 수 있도록 하고 싶기 때문에 접근을 퍼블릭으로 설정했습니다.

 

 

 

여기서 기본 암호화에서 버킷 키 부분이 있는데 비활성화/활성화 기준은 KMS( AWS Key Management Service ) 기반 암호화를 각 개별 객체마다 적용할 것인지 / 버킷 단위로 적용할 것인지 입니다.

 

활성화하게 되면 파일을 업로드 / 다운로드 할 때, KMS 딱 한번 호출하여 암호화한 버킷 키를 동일한 버킷에 사용하기 때문에 KMS 호출 횟수가 줄어 비용이 감소합니다.

 

비활성화 하게 되면 각 객체마다 KMS 를 호출해서 비용이 늘겠지만, 그만큼 보안은 강화됩니다.

 

저는 일단 비활성화로 만들겠습니다. 

 

 

그렇게 해서 이제 버킷 생성이 완료됩니다.

 

우선 어떤 이미지 하나를 업로드 해봅니다.

 

 

 

 

이 객체 URL 에 있는 것으로 들어가보면 

 

이런 화면이 나오게 됩니다.

 

이건 권한 설정 문제인데,

 

 

권한 > 버킷 정책 부분에서 이 권한을 추가해 줄 수 있습니다. 

 

 

이 권한을 JSON 형태로 넣어주어야 하는데, 직접 권한을 넣는 것이 어렵기 때문에 정책 생성기를 통해서 정책을 만들 수 있습니다. 

 

여기서 3가지 정보를 넣어주면 되는데, 3가지는 다음과 같습니다. 

 

  • Principal : 정책이 적용될 수 있는 대상

https://docs.aws.amazon.com/ko_kr/IAM/latest/UserGuide/reference_policies_elements_principal.html

 

AWS JSON 정책 요소: Principal - AWS Identity and Access Management

역할 신뢰 정책의 Principal 요소에 특정 IAM 사용자를 가리키는 ARN이 포함되어 있으면, IAM은 정책을 저장할 때 ARN을 사용자의 고유한 보안 주체 ID로 변환합니다. 그러면 누군가가 해당 사용자를 제

docs.aws.amazon.com

 

  • Actions : 허용될 수 있는 동작
  • ARN : 버킷 정책 편집 부분에 버킷 ARN 참고

 

 

 

그리고 나온 결과를 복사해서 넣어 정책 편집의 정책 부분에 붙여넣어 주시면 됩니다.

 

이제 다시 접근해 보시면 이미지가 잘 나올겁니다!

 

 

자바 스프링에서 S3 접근하기

 

이제 이 S3 를 프로그래밍에 이용하기 위한 작업을 해보려고 합니다.

 

액세스 키 만들기

아마존 홈페이지 홈에서 우측 상단을 보시면 계정명이 파란색으로 나와있는 부분을 누르면 보안 자격 증명이라는 것을 누르시면 됩니다. 

 

 

여기서 액세스 키 부분을 보시면

 

 

 

 

 

위 과정을 차례대로 하시고 액세스 키와 시크릿 액세스 키를 만들 수 있습니다. 이건 이 웹 화면을 벗어나면 다시는 이 키들에게 접근할 수 없기 때문에 다른 곳에 저장해 두시면 되고, 이건 절대 공유되면 안 됩니다. 깃 헙에 이런 키 값들이 올라가는 일이 있어서는 안됩니다!

 

이제 이 코드를 build.gradle 의존성 추가 부분에 넣어줍니다.

    implementation 'io.awspring.cloud:spring-cloud-aws-starter-s3:3.3.0'

 

application.yaml

이건 꼭 환경 변수를 사용합시다!

spring:
  cloud:
    aws:
      credentials:
        access-key: ${AWS_ACCESS_KEY}
        secret-key: ${AWS_SECRET_KEY}
      region:
        static: ${AWS_REGION} # AWS_REGION 환경 변수 사용
      s3:
        bucket: gyuho-s3

 

 

@RequiredArgsConstructor
@Service
public class PreSignedCloudImageService {
    @Value("${spring.cloud.aws.s3.bucket}")
    private String bucketName;

    public String upload(String fileName, String contentType) {
        PutObjectRequest objectRequest = PutObjectRequest.builder()
                .bucket(bucketName) // 버킷명 
                .key(fileName) //key 는 파일명이 됩니다.
                .contentType(contentType) 
                .build();

        PresignedPutObjectRequest presignedRequest = s3Presigner.presignPutObject(b -> b
                .signatureDuration(Duration.ofMinutes(10)) // URL 유효 시간 설정
                .putObjectRequest(objectRequest)
        );

        return presignedRequest.url().toString();
    }
}

 

 

'Cloud' 카테고리의 다른 글

[Docket-compose]  (0) 2025.03.10
[Docker] Docker 란?  (0) 2025.03.10
aws ec2 Ubuntu의 systemd에 Java application을 Service로 등록  (0) 2023.08.02