Amazon Web Service의 무제한 스토리지, S3
S3 (Simple Storage Service)
AWS의 스토리지 특화 서비스.
생성 즉시 용량 한도 없는 스토리지가 할당되며 사용한 만큼 금액을 지불하여 사용한다.
EC2와의 비교
- EC2는 VM Computing Machine으로, 일반적인 PC 1대의 컴퓨팅 파워를 제공하고 있다.
- 인스턴스를 새로 만들 때 정해진 양 만큼의 스토리지를 할당한다.
- 스토리지를 더 추가하고 싶다면 고정된 양의 스토리지인 EBS를 추가하고 마운트한다.
- S3는 데이터 저장에 특화된 서비스이다. 용량 제한이 없는 스토리지를 생성하여 사용하기 때문에 EC2처럼 추가 스토리지 할당/마운트 작업이 불필요하다.
구성요소
버킷
- 데이터를 저장하는
컨테이너
- 버킷 하나가 하나의 저장소
- 데이터를 저장하는
객체
- S3에 저장되는 기본 개체
- 객체 잠금 기능을 사용하면
write-once-read-many
정책을 적용할 수 있다.
키
버킷 내
객체의 고유 식별자
로, 객체는 반드시 하나의 키를 가져야 한다.버킷 + 키 + 버전
으로 여러 버킷에서 고유한 파일을 식별할 수 있다.http://doc.s3.amazonaws.com/2006-03-01/AmazonS3.swdl 위의 URL에서 버킷명은 doc이며 2006-03-01/AmazonS3.swdl은 키이다.
리전
- 버킷의 지리적 위치
- 사용자가 객체를 다른 위치로 전송하지 않는 한 해당 리전을 벗어나지 않는다.
- 리전과 리전 사이 data replication을 지원한다.
스토리지 클래스
S3는 저장소의 활용 목적에 따라 각기 다른 과금 정책을 부여한다.
저장소가 어떻게 활용되는지를 분석하고 적절한 클래스를 선택해야 비용을 효과적으로 절감할 수 있다.
Standard
클라우드 애플리케이션, 컨텐츠 배포, 게임, 빅데이터 분석 등 다용도로 사용 가능
짧은 지연 시간, 많은 처리량
요금
스토리지 요금
Intelligent-Tiering
사용자가 스토리지를 사용하는 패턴을 모니터링하고 비용 절감에 효과적인 스토리지 클래스로 자동 전환
분류 규칙에 따라 Standard / Standard-IA로 자동 스위칭
요금
스토리지 요금
다른 클래스와는 달리 모니터링 요금이 추가된다.
Standard-IA (Infrequent Access)
자주 액세스하진 않지만 필요 시 빠르게 접근해야 하는 유형으로, 30일 이상 액세스가 잘 이루어지지 않는다면 고려해볼만한 클래스
이슈성 데이터에도 적합 (업로드 시 잦은 액세스, 시간이 지나며 트래픽 감소, 특정 시기에 트래픽 다시 급등하는 경우)
요금
스토리지 요금
One Zone-IA
S3는 사용자가 모르게 3곳 이상의 물리적 영역에 백업이 되지만, One Zone은 1곳의 물리적 영역에만 데이터를 저장
One Zone이라는 특성으로 인해 처리가 곤란하지만 약간 유실되어도 서비스에 큰 영향을 주지 않는 데이터 백업에 저장 (로그형 데이터)
요금
스토리지 요금
Glacier
가장 저렴한 스토리지 요금
가장 비싼 트래픽 요금
백업이 필요하지만 거의 접근하지 않는 데이터에 적합
요금
스토리지 요금 (Glacier/Glacier Deep Archive)
각 클래스의 트래픽 요금
- Standard의 트래픽 요금이 가장 저렴하다.
- 스토리지 요금이 저렴할 수록 트래픽 요금은 비싸게 책정되어 있다.
S3 버킷 생성
https://aws.amazon.com/ko/s3/ 에 접속하여 시작하기 버튼을 누르면 S3용 콘솔창이 나타난다.
먼저 버킷을 생성해야 한다.
리전과 이름만 변경하고 초기 옵션 그대로 생성했다.
- 객체 잠금 옵션은 모든 데이터를 읽기 전용으로 저장한다.
- 보존 기간을 설정할 수 있다. 설정하지 않으면 영구적으로 보존한다.
AWS SDK for Java
Reference (AWS SDK 1.11)
Run Sample Code
샘플 프로젝트 다운로드
git clone https://github.com/awslabs/aws-java-sample.git
액세스 키 구성
액세스 키 탭 클릭 후 생성
키는 생성 즉시 다운로드 해서 보관하지 않으면 다시 찾을 수 없다. (아래 사진 참조)
액세스 키 파일 생성
Windows
C:\Users\{USER_NAME}\.aws\credentials
Linux
~/.aws/credentials
파일 내용 (value 값을 본인의 ID로 교체)
[default] aws_access_key_id = YOUR_ACCESS_KEY_ID aws_secret_access_key = YOUR_SECRET_ACCESS_KEY
샘플 프로젝트 컴파일/실행
mvn clean compile exec:java
만약 메이븐 빌드 중 501 에러가 발생한다면 보통은 central repository의 프로토콜 정책 변경 때문이다. pom 파일에 아래의 내용을 추가한다. (Reference)
<pluginRepositories> <pluginRepository> <id>central</id> <name>Central Repository</name> <url>https://repo.maven.apache.org/maven2</url> <layout>default</layout> <snapshots> <enabled>false</enabled> </snapshots> <releases> <updatePolicy>never</updatePolicy> </releases> </pluginRepository> </pluginRepositories> <repositories> <repository> <id>central</id> <name>Central Repository</name> <url>https://repo.maven.apache.org/maven2</url> <layout>default</layout> <snapshots> <enabled>false</enabled> </snapshots> </repository> </repositories>
실행하면 임시 버킷 생성 - 버킷 목록 - 임의의 파일 업로드 - 파일 다운로드 - 파일 삭제 - 버킷 삭제 순으로 동작한다.
실행이 완료되면 로그를 확인한다. 계정이 잘 연결되었다면 목록 중 {USER_BUCKET_NAME}에 내가 생성한 버킷의 이름이 나타난다.
=========================================== Getting Started with Amazon S3 =========================================== Creating bucket my-first-s3-bucket-bb3cc539-ade5-4dbb-b27f-190cd21bf0f4 Listing buckets - my-first-s3-bucket-bb3cc539-ade5-4dbb-b27f-190cd21bf0f4 - {USER_BUCKET_NAME}
Develop Example Code
Sample Code는 임시 버킷을 생성해서 API를 어떻게 활용하는지를 보여주었다.
예제 코드를 바탕으로, 필요 위주로 재구성을 해보았다.
참고로 예제는 AWS SDK 1.9.6 버전을 사용하고 있다.
- 개발 환경
- AWS SDK 1.11
- JDK 1.7
JDK 1.7을 사용한 이유는 AWS SDK를 적용해야 할 사내 서버가 1.7이기 때문이다.
만약 AWS SDK 2.0+을 사용할 경우 JDK도 1.8 이상을 사용해야 한다.
DynamoDB와 같은 기능은 2.0 이상에서 아직 지원되지 않으니 목적에 맞는 SDK를 선택한다. (Reference)
Maven
예제에선 Region을 US-WEST-2로 설정하고 임시 버킷을 생성했다. 서울 리전에 생성한 내 버킷을 직접 연결한다.
AWS SDK 1.9.6에는 서울 리전 코드
Regions.AP_NORTHEAST_2
가 포함되어 있지 않다. SDK를 최신 버전으로 교체했다.<dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk</artifactId> <version>1.11.749</version> </dependency> </dependencies>
AmazonS3
인스턴스 생성AmazonS3Client
생성자는 최신 버전에 Deprecated 되었다. 빌더를 사용하여 인스턴스를 할당했다.String accessKey = ""; String secretKey = ""; AmazonS3 s3 = AmazonS3ClientBuilder.standard() .withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey))) .withRegion(Regions.AP_NORTHEAST_2) .build();
withCredentials로 인증을 시도한다. 액세스 키를 이 곳에 등록하여 사용한다.
withRegion로 가져오려는 버킷의 리전을 설정한다.
버킷 목록 가져오기
예제 코드와 달라진 것이 없다.
public static void listingBucket(AmazonS3 s3) { System.out.println("Listing buckets"); for (Bucket bucket : s3.listBuckets()) { System.out.println(bucket.getName()); } }
파일 업로드
시험용 이미지로 많이 쓰이는 Lenna.png를 업로드한다.
resources에 Lenna.png를 포함시켰다.
objectKey는 버킷 내 유일하게 존재해야 하는 파일 식별자이다.
private static void uploadLennaToS3(AmazonS3 s3) throws Exception { String objectKey = "lenna-" + UUID.randomUUID(); System.out.println("Uploading a new Lenna to S3"); s3.putObject(new PutObjectRequest(bucketName, objectKey, createLennaPngFile())); }
특정 폴더에 업로드하는 경우
key에 폴더명을 prefix로 추가한다.
myFolder 아래에 Lenna.png를 업로드하였다.
private static void uploadLennaToS3Folder(AmazonS3 s3) throws Exception { String objectKey = "lenna-" + UUID.randomUUID(); System.out.println("Uploading a new Lenna to S3"); s3.putObject(new PutObjectRequest(bucketName, "myFolder/" + objectKey, createLennaPngFile())); }
파일 교체 (업데이트)
이미 존재하는 key에 새 파일을 넣으면 파일이 새 파일로 교체된다.
private static void updateImage(AmazonS3 s3, String objectKey) throws Exception { System.out.println("Updating the lenna to other image."); s3.putObject(new PutObjectRequest(bucketName, objectKey, createS3LogoImageFile())); }
파일 목록
prefix로 폴더명을 주면 특정 폴더의 파일을 전부 호출할 수 있다.
prefix는 파일명을 사용할 수도 있고 폴더명을 사용해도 된다.
private static void listing(AmazonS3 s3, String prefix) { System.out.println("Listing objects (" + prefix + ")"); ObjectListing objectListing = s3.listObjects(new ListObjectsRequest() .withBucketName(bucketName) .withPrefix(prefix)); for (S3ObjectSummary summary : objectListing.getObjectSummaries()) { System.out.println("key: " + summary.getKey() + ", size: " + summary.getSize()); } }
파일 다운로드
다운로드 API를 수행하면 객체의 메타데이터와 콘텐츠를 읽기 위한 Input Stream을 반환한다.
private static void download(AmazonS3 s3, String objectKey) { System.out.println("Downloading an object"); S3Object object = s3.getObject(new GetObjectRequest(bucketName, objectKey)); System.out.println("Content-Type of Lenna: " + object.getObjectMetadata().getContentType()); }
예제 코드는 github에 업로드되어 있다. (Repository Link)
'Infra & Dev tools > Cloud platform' 카테고리의 다른 글
AWS 망(VPC) 구성하기 (2) - 네트워크 구성 (0) | 2021.07.15 |
---|---|
AWS 망(VPC) 구성하기 (1) - CIDR 표기법 (1) | 2021.07.15 |
GCP 가입 및 가입 오류 해결, 인스턴스 생성하기 (13) | 2019.12.21 |
AWS EC2 인스턴스 생성해보기 (0) | 2019.12.21 |