반응형
aws에서 가장 많이 사용하는 s3를 구축하고 사용하는 방법입니다.
개요
- s3는 사용한 스토리지 만큼 요금이 청구되고 데이터 전송에서 해당 리전 내에서는 데이터 송수신은 무료이고(다른 리전으로는 무료가 아님) s3에서 인터넷으로 데이터를 송수신 하는경우에도 저렴합니다. https://aws.amazon.com/ko/s3/pricing/
- 단순한 웹 서비스 인터페이스를 웹으로 제공해서 언제 어디서나 원하는 양의 데이터를 저장하고 검색 할 수 있습니다.
- 자체 웹 사이트를 글로벌 네트워크 운영에 사용하는 것처럼 높은 확장성과 신뢰성을 제공받습니다.
- 단독으로 사용 가능하며, EC2, EBS, Glacier같은 다른 aws 제품과 함께 사용할 수 있습니다.
- s3의 버킷은 무한대로 객체를 저장할 수 있고 스토리지의 요구를 사전에 추정하여 관리하지 않아도 됩니다.
- HTTP 프로토콜을 사용하여 SSL로 암호화 된 엔드포인트를 통해 데이터를 안전하게 업로드/다운로드 할 수 있으며 자동으로 암호화 하고 AWS KMS로 s3 사용자를 위해 키를 관리하는 방법과 고유키를 제공하는 방법을 제공합니다.
기본 개념
- 객체
- S3에 데이터가 저장되는 최소 단위
- 키가 객체의 이름이며 값이 객체의 데이터
- 객체 하나의 크기는 1바이트부터 5TB까지 지원
- 버킷
- S3에서 생성할 수 있는 최상위 폴더
- 버킷은 리전별로 생성해야 하며 이름은 모든 리전 중 유일
- 폴더 생성 가능하고 버킷안에 객체 저장
- 저장 가능한 객체의 개수와 용량은 무제한
- 접속 제어 및 권한 관리 가능
- 표준 스토리지
- 99.99999999%의 내구성을 보장하고 99.99%의 가용성 제공
- RRS(Reduced Redundancy Storage)
- 표준 스토리지보다 저렴
- RRS 옵션은 여러 시설의 다양한 디바이스에 객체를 저장하며 일반 디스크 드라이브의 400배의 내구성 제공
구축 방법
1. 버킷 생성
2. S3 권한 부여
권한을 부여하지 않은 aws cli를 할 경우 아래처럼 권한이 거부됩니다.
그룹 권한에서 s3를 검색한 후 권한을 추가합니다.
그룹 및 사용자 생성 관련해서는 이전 포스팅 참고
권한을 추가하면 아래처럼 aws-cli에서 검색 할 수 있습니다.
사용 방법
1. aws-cli에서 업로드/다운로드/삭제/목록보기/동기화/버킷생성과삭제
> aws s3 help
위 명령어를 입력하면 s3 사용법을 확인할 수 있습니다.
1-1. cp, mv
cp는 copy를 의미하며 mv는 move를 의미
cp는 복사 mv는 이동
- ec2에서 s3하면 업로드
- s3에서 ec2로 하면 다운로드
> aws s3 cp /local/object s3://bucket/to/object/path
> aws s3 cp s3://bucket/from/object/path /local/to/path
1-2. rm
rm은 remove로 삭제입니다.
> aws s3 rm s3://bucket/to/path
1-3. ls
ls는 list directory contents 입니다.
> aws s3 ls s3://bucket/to/path
1-4. mb, rb
mb는 make bucket이고 rb는 remove butket입니다.
> aws s3 mb s3://bucket
> aws s3 rb s3://bucket
1-5. sync
sync는 synchronize입니다.
세 가지 동기화를 지원합니다.
local to s3
s3 to local
s3 to s3
> aws s3 sync /local/from/path s3://bucket/to/path
> aws s3 sync s3://bucket/from/path /local/to/path
> aws s3 sync s3://bucket/from/path s3://bucket/to/path
2. Spring에서 접속/업로드/다운로드
package com.coezy.coezybackend.aws;
import com.amazonaws.AmazonServiceException;
import com.amazonaws.auth.AWSCredentials;
import com.amazonaws.auth.AWSStaticCredentialsProvider;
import com.amazonaws.auth.BasicAWSCredentials;
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.S3Object;
import com.amazonaws.services.s3.model.S3ObjectInputStream;
import org.junit.jupiter.api.Test;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class AwsS3Test {
private AmazonS3 s3;
private String accessKey = "";
private String secretKey = "";
private String region = "";
private String bucket_name = "";
private String key_name = "";
private String file_path = "";
private String from_bucket= "";
private String object_key ="";
private String to_bucket = "";
@Test
public void s3Connect() {
// 패스워드로 접근
AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
s3 = AmazonS3ClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(credentials))
.withRegion(region)
.build();
}
@Test
public void s3Connect2() {
// Ec2에 접근
s3 = AmazonS3ClientBuilder.standard().withRegion(Regions.DEFAULT_REGION).build();
}
@Test
public void s3Upload() {
try {
s3.putObject(bucket_name, key_name, new File(file_path));
} catch (AmazonServiceException e) {
System.err.println(e.getErrorMessage());
}
}
@Test
public void s3Download() {
try {
S3Object o = s3.getObject(bucket_name, key_name);
S3ObjectInputStream s3is = o.getObjectContent();
FileOutputStream fos = new FileOutputStream(new File(key_name));
byte[] read_buf = new byte[1024];
int read_len = 0;
while ((read_len = s3is.read(read_buf)) > 0) {
fos.write(read_buf, 0, read_len);
}
s3is.close();
fos.close();
} catch (AmazonServiceException e) {
System.err.println(e.getErrorMessage());
} catch (FileNotFoundException e) {
System.err.println(e.getMessage());
} catch (IOException e) {
System.err.println(e.getMessage());
}
}
@Test
public void s3MoveAndCopy() {
try {
s3.copyObject(from_bucket, object_key, to_bucket, object_key);
} catch (AmazonServiceException e) {
System.err.println(e.getErrorMessage());
}
}
@Test
public void s3Delete() {
try {
s3.deleteObject(bucket_name, object_key);
} catch (AmazonServiceException e) {
System.err.println(e.getErrorMessage());
}
}
@Test
public void s3TestController() {
}
}
반응형
'개발(합니다) > OS&Dev&Infra&AWS' 카테고리의 다른 글
[Mac] Mac에서 백 쿼터(`) 사용하는 방법 (0) | 2021.09.12 |
---|---|
[AWS] aws cli 설치와 IAM 설정하는 방법(windows) (0) | 2021.09.09 |
[CMD] windows에서 cmd로 스레드 수 아는 방법 (0) | 2021.08.29 |
[git] 커밋 메시지로 Git 플랫폼 이슈(issue) 자동 종료하는 방법 (0) | 2021.08.22 |
[git] 좋은 커밋 메시지 작성 하는 방법 (0) | 2021.08.21 |