Logo

AWS CLI로 Amazon S3 다루기 - 1

Amazon S3는 AWS에서 제공하는 클라우드 스토리지 서비스입니다. AWS CLI를 이용하면 간편하게 S3 버킷을 제어하고 S3 오브젝트에 접근할 수 있으며, Unix의 파일 시스템 커맨드와 매우 유사해서 배우기도 쉽습니다. 이 번 포스팅에서는 자주 사용되는 AWS CLI의 Amazon S3 관련 커맨드을 살펴보도록 하겠습니다.

버킷 생성하기

Amazon S3에 데이터를 저장하려면 먼저 버킷(Bucket)을 생성해야 합니다. 버킷은 Amazon S3에서 파일 시스템의 최상위 디렉터리나 드라이브 정도의 역할을 하는 저장 단위 개념입니다. 마치 PC에 여러 개의 하드 디스크를 꼽을 수 있는 것 처럼 하나의 계정에 여러 개의 버킷을 생성할 수 있습니다.

새로운 버킷을 생성하는 방법은 AWS CLI의 aws s3 mb 커맨드(Make Bucket)에 s3://버킷명을 인자로 넘겨주시면 됩니다.

$ aws s3 mb s3://fruits
make_bucket failed: s3://fruits An error occurred (BucketAlreadyExists) when calling the CreateBucket operation: The requested bucket name is not available. The bucket namespace is shared by all users of the system. Please select a different name and try again.

Amazon S3에 fruits라는 버킷이 이미 존재해서 거부를 당했습니다. 버킷 이름은 본인 계정 범위가 아닌 AWS 모든 계정 기준으로 유일해야 함을 주의 바랍니다.

$ aws s3 mb s3://my-fruits
make_bucket: my-fruits

my-fruits라는 이름으로 다시 커맨드를 실행하였고 버킷 생성에 성공하였습니다.

버킷 목록 조회하기

aws s3 ls 커맨드(List)를 이용하여 자신의 AWS 계정이 가지고 있는 버킷 목륵을 조회할 수 있습니다.

$ aws s3 ls
(...생략...)
2018-06-02 10:26:35 my-fruits

파일 복사하기

방금 생성한 버킷에 로컬 파일을 복사해보도록 하겠습니다.

먼저 본인 PC의 임의의 경로에 버킷 이름과 동일한 이름의 디렉터리를 생성합니다.

$ mkdir my-fruites

그리고 그 디렉터리 내에 3개의 파일을 생성합니다.

$ cd my-fruites
$ echo 'apple' > apple.txt
$ echo 'banana' > banana.txt
$ echo 'cherry' > cherry.txt
$ ls
apple.txt  banana.txt cherry.txt

aws s3 cp 커맨드(Copy)를 이용하여 로컬 파일을 하나를 버킷으로 복사합니다.

$ aws s3 cp apple.txt s3://my-fruits
upload: ./apple.txt to s3://my-fruits/apple.txt

파일 이동하기

이번에는 로컬 파일을 복사하지 않고, S3 버킷으로 아예 이동시켜 보겠습니다.

$ aws s3 mv banana.txt s3://my-fruits
move: ./banana.txt to s3://my-fruits/banana.txt
$ ls
apple.txt  cherry.txt

aws s3 mv 커맨드(Move)를 이용했더니 해당 파일이 로컬 디스크에서 삭제되었습니다.

파일 목록 조회하기

aws s3 ls 커맨드에 버킷명을 인자로 넘겨주면 버킷 내의 파일 목록을 마치 로컬 파일 시스템처럼 조회할 수 있습니다.

$ aws s3 ls s3://my-fruits
2018-06-02 10:51:55          6 apple.txt
2018-06-02 10:57:19          7 banana.txt

파일 삭제하기

aws s3 rm 커맨드(Remove)를 이용하여 복사 또는 이동시켰던 파일을 S3 버킷으로 부터 삭제시킬 수 있습니다.

$ aws s3 rm s3://my-fruits/banana.txt
delete: s3://my-fruits/banana.txt

디렉터리 동기화 시키기

aws s3 sync 커맨드를 이용하여 로컬 디렉터리와 S3 버킷을 동기화 시킬 수 있습니다.

$ aws s3 sync . s3://my-fruits
upload: ./cherry.txt to s3://my-fruits/cherry.txt

이미 apple.txt는 이동시켜 놓았기 때문에 cherry.txt만 업로드되는 것을 확인할 수 있습니다.

—recursive 옵션

aws s3 cpaws s3 mv, aws s3 rm 커맨드는 --recursive 옵션과 함께 사용하면 하위 디렉터리까지 적용되기 때문에 편리합니다.

먼저 로컬 디렉터리에 favorites라는 디렉터리를 생성하고, 그 안에 melon.txt라는 파일을 생성해보겠습니다.

$ mkdir favorites
$ echo 'melon' > favorites/melon.txt

그 다음, --recursive 옵션과 함께 aws s3 cp 커맨드를 실행하면 하위 디렉터리의 파일까지 모두 복사할 수 있습니다.

$ aws s3 cp . s3://my-fruits --recursive
upload: ./cherry.txt to s3://my-fruits/cherry.txt
upload: ./apple.txt to s3://my-fruits/apple.txt
upload: favorites/melon.txt to s3://my-fruits/favorites/melon.txt

aws s3 rm 커맨드로 S3 버킷 내의 파일을 삭제할 때도 --recursive 옵션을 주면 다음과 같이 하위 디렉터리의 파일까지 모두 삭제할 수 있습니다.

aws s3 rm s3://my-fruits/ --recursive
delete: s3://my-fruits/apple.txt
delete: s3://my-fruits/cherry.txt
delete: s3://my-fruits/favorites/melon.txt

참고로 aws s3 sync 커맨드는 기본적으로 하위 디렉터리까지 모두 동기화해주기 때문에 별도로 --recursive 옵션을 제공하지 않습니다.

$ aws s3 sync . s3://my-fruits
upload: ./apple.txt to s3://my-fruits/apple.txt
upload: favorites/melon.txt to s3://my-fruits/favorites/melon.txt
upload: ./cherry.txt to s3://my-fruits/cherry.txt

버킷 제거하기

마지막으로 예제를 위해 만든 my-fruits 버킷을 제거해보록 하겠습니다. ws s3 rb 커맨드(Remove Bucket)를 사용하시면 됩니다.

$ aws s3 rb s3://my-fruits
remove_bucket failed: s3://my-fruits An error occurred (BucketNotEmpty) when calling the DeleteBucket operation: The bucket you tried to delete is not empty

S3 버킷이 비어 있지 않을 경우 위와 같이 버킷 제거가 되지 않습니다. 이럴 경우 --force 옵션을 주시면 S3 버킷 내의 모든 파일을 먼저 삭제하고 그 다음 S3 버킷을 제거합니다.

$ aws s3 rb s3://my-fruits --force
delete: s3://my-fruits/apple.txt
delete: s3://my-fruits/cherry.txt
delete: s3://my-fruits/favorites/melon.txt
remove_bucket: my-fruits

정리

지금까지 Amazon S3 다루기 위한 여러 가지 AWS CLI 커맨드들을 살펴보았습니다. 커맨드들을 최종 정리를 해보면 다음과 같습니다.

커맨드 용도
aws s3 mb 버킷 생성
aws s3 ls 버킷/파일 목록 조회
aws s3 cp 디렉터리/파일 복사
aws s3 mv 디렉터리/파일 이동
aws s3 rm 디렉터리/파일 삭제
aws s3 sync 디레토리 간 동기화
aws s3 rb 버킷 제거