사용중인 EC2 스토리지를 확장하는 방법에 대한 포스팅 글입니다.

 

1. EC2와 연결된 EBS 볼륨을 수정합니다.

원하는 만큼 볼륨을 확장합니다.
저는 8GB -> 16GB로 올렸습니다.

 

2. EC2에 SSH로 접속해 파티션 크기를 확장해줍니다.

AWS에서 스토리지를 늘렸지만 실제로 적용되지 않았으므로 수동으로 확장해주어야 합니다.

$ df -h 를 입력해 디스크 용량을 확인했을 때 8GB 그대로인 것을 알 수 있습니다.

리눅스의 디바이스 정보를 출력하는 명령어를 입력해서 AWS EBS에서 확장한 스토리지가 있는지 확인합니다.
$ lsblk 

 

파티션 확장

파티션 크기 확장 명령어를 입력합니다.
$ sudo growpart /dev/nvme0n1 1

파티션이 확장되었는지 확인합니다.
$ lsblk

 

3. 파일 시스템을 확장합니다.

파일 시스템 유형을 확인합니다. (중요!!)
$ mount|grep nvme

xfs 일 경우

$ sudo xfs_growfs -d /dev/nvme0n1p1

ex4 일 경우

$ sudo resize2fs /dev/nvme0n1p1

 

4. 확장된 스토리지를 확인합니다.

$ df -h

S3를 생성하지 않았다면 다음 글을 참고해주세요.
2020/11/17 - [IT/AWS] - [AWS] Amazon S3 생성 방법 (Amazon Simple Storage Service)
S3 용어를 알고 싶다면 다음글을 참고해주세요.
2020/11/17 - [IT/AWS] - [AWS] Amazon S3 (Simple Storage Service)란 무엇인가?
 

[AWS] Amazon S3 (Simple Storage Service)란 무엇인가?

1. Amazon S3란? Simple Storage Service의 약자로 내구성과 확장성이 뛰어난 스토리지 서비스입니다. 2. Amazon S3 용어 설명 bucket S3에서 생성되는 최상위 디렉토리이며 디렉터리와 객체를 저장하는 컨테

bamdule.tistory.com

1. pom.xml

...        
        <!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-s3 -->
        <dependency>
            <groupId>com.amazonaws</groupId>
            <artifactId>aws-java-sdk-s3</artifactId>
            <version>1.11.901</version>
        </dependency>
...        

 

2. AwsS3.java

아무나 S3에 파일을 업로드 하지 못하게 막으려면 IAM에서 accessKey와 secretKey를 발급 받아야 합니다.
만약 누구나 업로드가 가능하게 하려면 S3 권한 > 버킷 정책에서 해당 정책을 생성한 후 적용해 주어야 합니다.
import com.amazonaws.AmazonServiceException;
import com.amazonaws.SdkClientException;
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.CopyObjectRequest;
import com.amazonaws.services.s3.model.DeleteObjectRequest;
import com.amazonaws.services.s3.model.PutObjectRequest;
import java.io.File;

public class AwsS3 {

    //Amazon-s3-sdk 
    private AmazonS3 s3Client;
    final private String accessKey = "IAM에서 발급받은 accessKey";
    final private String secretKey = "IAM에서 발급받은 secretKey";
    private Regions clientRegion = Regions.AP_NORTHEAST_2;
    private String bucket = "bamdule-bucket";

    private AwsS3() {
        createS3Client();
    }

    //singleton pattern
    static private AwsS3 instance = null;
    
    public static AwsS3 getInstance() {
        if (instance == null) {
            return new AwsS3();
        } else {
            return instance;
        }
    }

    //aws S3 client 생성
    private void createS3Client() {

        AWSCredentials credentials = new BasicAWSCredentials(accessKey, secretKey);
        this.s3Client = AmazonS3ClientBuilder
                .standard()
                .withCredentials(new AWSStaticCredentialsProvider(credentials))
                .withRegion(clientRegion)
                .build();
    }

    public void upload(File file, String key) {
        uploadToS3(new PutObjectRequest(this.bucket, key, file));
    }

    public void upload(InputStream is, String key, String contentType, long contentLength) {
        ObjectMetadata objectMetadata = new ObjectMetadata();
        objectMetadata.setContentType(contentType);
        objectMetadata.setContentLength(contentLength);

        uploadToS3(new PutObjectRequest(this.bucket, key, is, objectMetadata));
    }

    //PutObjectRequest는 Aws S3 버킷에 업로드할 객체 메타 데이터와 파일 데이터로 이루어져있다.
    private void uploadToS3(PutObjectRequest putObjectRequest) {

        try {
            this.s3Client.putObject(putObjectRequest);
            System.out.println(String.format("[%s] upload complete", putObjectRequest.getKey()));

        } catch (AmazonServiceException e) {
            e.printStackTrace();
        } catch (SdkClientException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void copy(String orgKey, String copyKey) {
        try {
            //Copy 객체 생성
            CopyObjectRequest copyObjRequest = new CopyObjectRequest(
                    this.bucket,
                    orgKey,
                    this.bucket,
                    copyKey
            );
            //Copy
            this.s3Client.copyObject(copyObjRequest);

            System.out.println(String.format("Finish copying [%s] to [%s]", orgKey, copyKey));

        } catch (AmazonServiceException e) {
            e.printStackTrace();
        } catch (SdkClientException e) {
            e.printStackTrace();
        }
    }

    public void delete(String key) {
        try {
            //Delete 객체 생성
            DeleteObjectRequest deleteObjectRequest = new DeleteObjectRequest(this.bucket, key);
            //Delete
            this.s3Client.deleteObject(deleteObjectRequest);
            System.out.println(String.format("[%s] deletion complete", key));

        } catch (AmazonServiceException e) {
            e.printStackTrace();
        } catch (SdkClientException e) {
            e.printStackTrace();
        }
    }


}
파일을 업로드하려면 PutObjectRequest 객체를 생성해야합니다. PutObjectRequest 객체를 생성하는 방법은 두가지가 있는데,
첫번째는 File 객체와 key값을 이용해 만드는 방법이고, 두번째는 InputStream과 key값 그리고 파일 정보(ContentType, file Length 등)를 이용해 만드는 방법입니다. 여기서 key 값은 버킷 내에서 객체를 찾기위해 사용되는 고유 식별자를 의미합니다.

 

3. Main.java

import java.io.File;

public class Main {

    public AwsS3 awsS3 = AwsS3.getInstance();

    public static void main(String[] args) {

        Main main = new Main();

        File file = new File("D://4.png");
        String key = "img/my-img.png";
        String copyKey = "img/my-img-copy.png";

        main.upload(file, key);
//        main.copy(key, copyKey);
//        main.delete(key);
    }

    public void upload(File file, String key) {
        awsS3.upload(file, key);
    }

    public void copy(String orgKey, String copyKey) {
        awsS3.copy(orgKey, copyKey);
    }

    public void delete(String key) {
        awsS3.delete(key);
    }

}

1. Amazon S3란?

2020/11/17 - [IT/AWS] - [AWS] Amazon S3 (Simple Storage Service)란 무엇인가?
 

[AWS] Amazon S3 (Simple Storage Service)란 무엇인가?

1. Amazon S3란? Simple Storage Service의 약자로 내구성과 확장성이 뛰어난 스토리지 서비스입니다. 2. Amazon S3 용어 설명 bucket S3에서 생성되는 최상위 디렉토리이며 디렉터리와 객체를 저장하는 컨테

bamdule.tistory.com

2. Amazon S3 생성하기

1) aws 계정 로그인

2) S3로 이동 후 버킷 만들기 클릭

3) 버킷 이름과 리전 선택

버킷 이름은 고유해야하고, 리전은 서비스 지역에 따라서 설정해주면 됩니다.

 

4) 퍼블릭 액세스 설정

외부에 S3를 공개할 경우 모든퍼블릭 액세스 차단 체크를 해제해주면 됩니다.
외부에 공개하지 않고 내부에서만 사용하려면 모든 퍼블릭 액세스 차단을 체크해주시면 됩니다. 
퍼블릭 액세스가 차단되었을 경우 IAM에서 AWSAccessKeyId와 AWSSecretKey를 발급받고 이를 이용해서 S3 객체에 접근할 수 있습니다.

 

5) 버킷 버전 관리 및 기본 암호화

버킷 버전 관리기능을 활성화하면 파일을 버전별로 관리 하기 때문에 비용이 더 들지만 사용자가 실수로 파일을 삭제해도 복원할 수 있습니다.

기본 암호화를 활성화 하면 버킷에 저장되는 모든 새 객체를 암호화합니다.
그리고 객체를 다운 로드할 때 암호를 해독해합니다.

모든 설정이 끝났으면 버킷을 생성해줍니다.

 

6) 퍼블릭 정책 활성화

bamdule-bucket이 생성된 것을 볼 수 있지만 아직 외부에서 접근할 수 없습니다.
버킷 정책 생성 URL
awspolicygen.s3.amazonaws.com/policygen.html

 

Select Type of Policy : S3 Bucket Policy

Effect :
Allow

Principal
: *

AWS Service
:  Amazon S3

Actions :
GetObject (원하는 만큼 더 선택해도 됩니다.)
조회만 가능하도록 GetObject 권한만 체크합니다.

Amazon Resource Name (ARN) :
arn:aws:s3:::bucket-name/*
다 입력되었다면 Add Statement를 눌러주세요.

입력 값을 확인 한 다음 Generate Policy를 눌러주세요.

정책이 명시된 JSON 값을 복사 한 뒤 버킷 정책에 입력해주세요.
권한 > 버킷 정책

변경 사항 저장 후 아래그림과 같이 액세스가 퍼블릭으로 변경되었다면, 외부에서 S3에 접근할 수 있는 상태입니다.

7) 테스트

버킷에 아무 파일이나 올린 후 해당 파일의 객체 URL을 브라우저 주소창에 입력하면 됩니다.

8) 액세스 키 생성

액세스키는 모든 퍼블릭 액세스를 차단했을 경우 필요합니다.
S3에 접근하려면 별도의 인증 과정이 필요한데, 이때 사용되는 것이  액세스 키 입니다.
액세스 키는 AWSAccessKeyId와 AWSSecretKey로 구성되어 있습니다.

IAM > 액세스 키 > 새 액세스 키 만들기

액세스 키를 생성하면 키 파일을 다운로드 받을 수 있고 해당 파일에 AWSAccessKeyId와 AWSSecretKey가 명시되어있습니다.  AWSAccessKeyId와 AWSSecretKey는 절때 외부에 노출되어서는 안됩니다.

자바를 이용해서 S3로 업로드, 복사, 삭제 하는 방법

2020/11/17 - [IT/AWS] - [AWS] JAVA S3로 파일 업로드, 복사, 삭제 하기

 

1. Amazon S3란?

Simple Storage Service의 약자로 내구성과 확장성이 뛰어난 스토리지 서비스입니다. 

 

2. Amazon S3 용어 설명

bucket
S3에서 생성되는 최상위 디렉토리이며 디렉터리와 객체를 저장하는 컨테이너입니다. 버킷의 이름은 S3에서 유일해야 하며, 버킷 단위로 region을 지정할 수 있고, 버킷 별로 접근 제어 설정을 할 수 있습니다.

Object
S3에 저장되는 데이터를 객체라고 하며, 파일과 메타데이터로 이루어져 있습니다.
객체의 크기는 최대 5TB 까지 허용됩니다.

Key
버킷 내에서 객체를 찾기 위해 사용되는 고유 식별자입니다.
보통 "디렉터리 + 파일명"으로 명명됩니다.

Region
버킷 생성 시 버킷의 위치를 지정할 수 있습니다. 버킷 위치를 어디에 지정하냐에 따라서 지연 시간 최적화, 비용 최소화 등이 결정됩니다.

 

3. Amazon S3의 장점

1) 일반적인 파일 서버는 사용자 트래픽이 증가하면 스토리지 증설 작업을 해야하지만 S3는 시스템 적으로 트래픽 증가에 대한 처리를 미리 해두었기 때문에 파일 서버 관리자는 별도의 처리를 해주지 않아도 됩니다.

2) 저장할 수 있는 파일 수의 제한이 없습니다.

3) 버킷 마다 인증 시스템을 설정할 수 있어서 보안이 좋습니다.

4) HTTP와 BitTorrent 프로토콜을 지원합니다.

5) REST, SOAP(HTTPS만 가능) 인터페이스를 제공합니다.

6) 버전관리 기능을 사용하면 사용자가 실수할 경우에도 복원이 가능합니다.

 

4. S3 사용 요금

S3는 사용자가 실제 사용한 만큼만 요금을 책정합니다.

참조:

https://docs.aws.amazon.com/ko_kr/AmazonS3/latest/dev/Introduction.html

1. aws cli 다운로드

1) 파이썬 다운로드
# yum install python

2) get-pip.py 다운로드
# curl -O https://bootstrap.pypa.io/get-pip.py

3) get-pip.py 실행
# python get-pip.
py

4) pip 버전 확인
# pip --version

5) pip를 이용해서 awscli 설치
# pip install awscli

6) aws 버전 확인
# aws --version

 

2. aws configure 등록

# aws configure list

AccessKey, SecretKey IAM(Identity and Access Management)에서 사용자를 등록하면 발급 받을 수 있습니다.

# aws configure
access_key : ############
secret_key : ############
region : (ex : ap-northeast-2)
format : (ex : json)

 

3. S3 모든 파일 다운로드 및 업로드

3. aws s3 명령어

1) help

# aws s3 help

다양한 aws cli s3 명령어 설명을 확인할 수 있습니다.

2) cp(복사), mv(이동), rm(삭제)

로컬에서 S3 버킷으로 데이터를 업로드하거나, 다운로드 할 수 있습니다.
사용방법은 각 명령어마다 유사하기 때문에 cp를 기준으로 명령어를 사용하겠습니다.

1. S3 버킷 > 로컬
1) 일부 파일
# aws s3 cp s3://bucketName/Path/test.txt ./

2)디렉토리 전체
# aws s3 cp s3://bucketName/Path ./ --recursive

2. 로컬 > S3 버킷
1) 일부 파일

# aws s3 cp test.txt s3://bucketName/Path 
2) 디렉토리 전체
# aws s3 cp ./ s3://bucketName/Path --recursive

3) ls(목록), mb(버킷 생성), rb(버킷 삭제), sync(동기화)

1). 버킷 목록보기
# aws s3 ls s3://bucketName
2). 버킷 생성

# aws s3 mb s3://bucketName
버킷 삭제

# aws s3 rb s3://bucketName

4)버킷 동기화
aws s3 sync /local s3://bucketName
aws s3 syncs3://bucketName/local
aws s3 syncs3://bucketName1s3://bucketName2

+ Recent posts