오늘은 Amazon S3가 무엇이고, 어떻게 만들고 사용할 수 있는지 알아보겠습니다.
Amazon S3 란?
Amazon S3 는 객체 스토리지로 저장된 데이터를 객체로 접근 및 저장할 수 있는 기술입니다. 클라우드 + 객체 스토리지 이므로 외부에 저장된 내 데이터를 객체 형식으로 저장 및 접근할 수 있는 것입니다.
우선 S3 사이트로 가봅시다.
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 |