본문 바로가기

개발(합니다)/OS&Dev&Infra&AWS

[AWS] aws s3 구축 및 CLI/Spring 사용 방법

반응형

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() {

    }

}
반응형