지금까지 S3에 버킷을 생성하고 파일을 저장하려면 웹브라우저 콘솔 화면에 가서 일일히 화면을 눌러 적용해야 했다.
기능상에는 문제는 없지만 웹서비스 자체가 조금 느리다는 점이 사용에 불편함을 느끼게 된다. 거기다 브라우저 한 페이지에 표시되는 파일 갯수 역시 한계가 있다.
하지만 AWS CLI를 이용하면 간편하게 S3 버킷을 제어하고 S3 오브젝트에 접근할 수 있어 활용성이 높아진다.
예를들어 10만 단위의 파일을 한 번에 이동하거나 삭제하고 싶을 때 커맨드를 이용해 패턴을 이용해 빠르게 처리를 할수 있다.
Info
AWS CLI 란? AWS Command Line Interface(AWS CLI)는 명령줄 셸의 명령을 사용하여 AWS 서비스와 상호 작용할 수 있는 오픈 소스 도구. 최소한의 구성으로 AWS CLI를 사용하면 터미널 프로그램에 있는 명령 프롬프트에서 브라우저 기반 AWS Management Console에서 제공하는 것과 동일한 기능을 구현하는 명령을 실행할 수 있다.
# 버킷의 123123.pdf 파일을 folder1/ 에 복사
$ aws s3 cp s3://test-bucket-inpa/123123.pdf s3://test-bucket-inpa/folder1/
copy: s3://test-bucket-inpa/123123.pdf to s3://test-bucket-inpa/folder1/123123.pdfCopy
디렉터리 동기화 (sync)
만일 디렉토리에 있는파일 전부를 S3에 옮기고 싶을 때 어떻게 할까?
파일을 일일히 커맨드를 옮겨주는 것보다 동기화 기능을 이용하면 간단하게 옮길수 있다.
여기서 동기화란, 내가 가지고 있는 상태와 상대방이 가지고 있는 상태를 일치시킨다는 개념으로 이해하면 된다.
다만 동기화는 파일을 업로드/다운로드 할때 동작되고, 파일 삭제 동작은 하지않는다. (빈 버킷과 동기화되도 내 로컬 파일들이 삭제되지 않는다)
S3 커맨드 옵션
자주 사용하는 cli 명령어 옵션은 --force 강제, --exclude 제외, --include 포함 등이 있다.
하위 디렉토리 포함 (--recursive)
--recursive 옵션과 함께 사용하면 커맨드 적용 범위가하위 디렉터리까지 적용된다.
예를 들어 aws s3 rm 커맨드를 --recursive 옵션과 함께 사용하면 하위 디렉터리까지 적용되서 모든 파일과 디렉토리가 삭제된다.
반대로 aws s3 cp 커맨드를 --recursive옵션과 함꼐 사용하면Bucket에 있는 모든 파일이 복사된다.
BASH
$ 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 # favorites폴더 안에있는 파일 까지 복사Copy
BASH
$ 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 # 하위 디렉토리 파일까지 모두 삭제Copy
Tip
참고로 위에서 배운 aws s3 sync 커맨드는 기본적으로 하위 디렉터리까지 모두 동기화해주기 때문에 별도로--recursive 옵션이 안먹힌다.
파일 제외 (--exclude)
--exclude옵션은 명령에서 객체만 제외하도록 규칙을 설정하고 옵션은 지정된 순서대로 적용된다.
BASH
# 모든 .txt 파일을 제외하고 나머지 파일을 copy
$ aws s3 cp . s3://my-bucket/path --exclude "*.txt"
# MyFile1.txt, MyFile2.rtf, MyFile88.txt 등을 제외하고 copy
$ aws s3 cp . s3://my-bucket/path --exclude "*.txt" --include "MyFile*.txt"Copy
BASH
# 디렉터리 내 파일을 삭제하되 .sh로 끝나는 파일은 남겨두기 위해, --exclude 옵션으로 *.sh 패턴을 지정.
$ aws s3 rm --recursive --exclude "*.sh" s3://test/rm_test/Copy
Info
S3 와일드카드 패턴 와일드카드(wildcard character)는 컴퓨터에서 특정 명령어로 명령을 내릴 때, 여러 파일을 한꺼번에 지정할 목적으로 사용하는 기호를 가리킨다. 주로 특정한 패턴이 있는 문자열 혹은 파일을 찾거나, 긴 이름을 생략할 때 쓰인다.
기본적으로 aws cli는 와일드카드 패턴을 지원하지 않는다. 예로,aws s3 rm abc*커맨드를 실행하면 abc1, abc2, abc3, ... 파일이 지워지지 않는게 아니라 abc* 라는 파일이 지워지게 된다.
다만, --include와 --exclude 옵션과 함께 사용하면 와일드카드 패턴을 지원한다. 위 --exclude 옵션에 할당한 문자열을 보면,"*.txt"와 같이 와일드카드 문자를 사용한걸 볼 수 있다.
파일 포함 (--include)
--include옵션은 명령에 지정된 객체만 포함하도록 규칙을 설정하며 옵션은 지정된 순서대로 적용된다
BASH
// 모든 .txt 형식의 파일을 포함하여 copy
$ aws s3 cp . s3://my-bucket/path --include "*.txt"
# 모든 .txt 형식의 파일을 포함, 그러나 MyFile로 시작하는 파일명은 제외, 그런데 MyFile1.txt만은 제외하지않고 포함해서 copy
$ aws s3 cp . s3://my-bucket/path --include "*.txt" --exclude "MyFile*.txt" --include "MyFile1.txt"Copy
BASH
# .log 파일만 제외한 모든 파일과 하위 디렉토리 파일이 로컬에 복사
$ aws s3 cp s3://BucketName/ ./ --recursive --exclude "*.log" --include "*"
# 특정 날짜의 nginx 로그를 다운로드
$ aws s3 cp s3://BucketName/nginx/ . --recursive --exclude "*" --include "access*2016-10-23*"Copy
BASH
# 'imgae-숫자' 로 시작되는 복수 파일만 업로드
$ aws s3 cp /Images s3://test-s3/cp-test/ --recursive --exclude "*" --include "image-*"
upload: ./image-1.jpg to s3://test-s3-squirrel/cp-test/image-1.jpg
upload: ./image-4.jpg to s3://test-s3-squirrel/cp-test/image-4.jpg
upload: ./image-2.jpg to s3://test-s3-squirrel/cp-test/image-2.jpg
upload: ./image-3.png to s3://test-s3-squirrel/cp-test/image-3.pngCopy
커맨드 테스트 (--dryrun)
명령어 조합이 애매모호 하여, 실제로 수행결과는 얻지말고 동작만 보고 싶다면,--dryrun옵션을 이용해 동작 수행만 하고 실제로 적용이 되지 않게 할 수 있다.
실수로 파일을 삭제해 난감해지는 일을 방지하기 위해명령을 사전에 테스트할 목적으로 사용된다.
BASH
# 결과 출력 시, dryrun임을 표시하여 실제로 수행되지 않았음을 알려준다.
$ aws s3 rm s3://test-bucket-inpa/folder1/ --dryrun
(dryrun) delete: s3://test-bucket-inpa/folder1/Copy
S3 권한 커맨드
파일에 권한 주기 (--acl)
콘솔 브라우저에서 일일히 객체를 클릭하여 권한을 설정하지말고 명령어로 간단하게 처리해보자.
Amazon S3는 미리 준비된 ACL이라고 하는 미리 정의된 권한 부여 세트를 지원한다.
이렇게 명령어를 칠 경우 이전주소에서 이후 주소로 복사를 하게되고 public-read 권한을 주게 된다.
그리고 객체 URL로 접속해보면 권한 경고 없이 바로 접속됨을 확인 할 수 있다.
파일에 권한 주기 (--grants)
개체에 대한 권한을 부여하는 데 사용할 수 있는 --grants 옵션도 존재한다.
BASH
--grants Permission=Grantee_Type=Grantee_IDCopy
Permission: 권한 지정 (read,readacl,writeacl,full)
Grantee_Type:피부여자를 식별하는 방법을 지정(uri,emailaddress, id)
Grantee_ID:Grantee_Type에 따라 피부여자를 지정 (uri, emailaddress, id)
BASH
# 모든 사람이 읽을수 있게 권한을 부여하고 업로드
aws s3 cp filename s3://bucket/folder/filename --grants read=uri=http://acs.amazonaws.com/groups/global/AllUsersCopy
S3 커맨드 응용하기
S3 특정 파일을 얻어서 다운받기 (루프문)
BASH
# 버킷 목록을 가져와서 날짜별로 sort하고
# awk 명령어로, 첫번째 필드($1)가 2021-01-20 날짜 이상일경우 and 네번째 필드($4)가 공백이 아닌경우,
# $4만 출력 (파일명 출려)
for f in $(aws s3 ls s3://bucket-name/ | sort | awk '$1 > "2021-01-20" && $4 > "" {print $4}'); do
aws s3 cp s3://bucat-name/"$f" ./ # 그리고 그 파일명으로 현재 디렉토리에 다운
done;Copy
AWS S3 CLI고급명령어
aws s3vs aws s3api
위에서aws s3커맨드를 통해 Amazon S3를 파일 시스템처럼 접근할 수 있었다.
반면에aws s3api커맨드를 통해서는 좀 더 Restful API 처럼 버킷에 접근할 수 있다.
즉, aws s3와 s3api 명령어의 차이는 s3의 명령어를 좀 더 추상화하여 쉽게 사용할 수 있게끔 만든 것 정도로 알아두면 된다.
BASH
# aws s3 명령어
$ aws s3 ls s3://test-bucket/css/
2018-06-09 20:08:24 121200 bootstrap.min.css
2018-06-09 20:08:24 542194 bootstrap.min.css.mapCopy
# 버킷 생성하기
aws s3api create-bucket \
--bucket cloudaffaire-s3-select-demo \
--region ap-south-1 \
--create-bucket-configuration LocationConstraint=ap-south-1
# 버킷의 Region 확인
$ aws s3api get-bucket-location --bucket [버킷명]
# 버킷의 객체를 모두 json으로 조회
$ aws s3api list-objects-v2 --bucket [버킷명]
# 객체의 메타데이터 확인
$ aws s3api head-object --bucket [버킷명] -key [fileName]
# 객체의 태그 조회
$ aws s3api get-object-tagging --bucket [버킷명] --key [fileName]
# 해당 버킷이 버저닝을 사용하는지 체크
$ aws s3api get-bucket-versioning --bucket [버킷명]
# 버킷의 버저닝된 객체 리스트를 출력
$ aws s3api list-object-versions --bucket [버킷명]
# 특정 객체를 다운로드
# [version id] : 위의 list-object-versions 명령어를 통해 가져온 id
# [outfileName] : 받은 객체를 어떤 이름으로 저장할지
$ aws s3api get-object --bucket [버킷명] --key [fileName] --version-id [version id] [outfileName]Copy
S3 SELECT 커맨드
S3 Select는 SQL 문을 기반으로 S3 객체의 콘텐츠를 필터링하는 커맨드이다.
한마디로 S3의 데이터를 조회할때 SQL문으로 조회한다고 보면 된다.
이 S3 Select 요청에는 받기 원하는 데이터 포맷(JSON, CSV, or Apache Parquet)을 지정해야 한다.
Info
S3 SELECT VS AWS Athena
S3 Select는 설계된 S3 기능중 하나이다. 전체 개체 대신 (단순 SQL 식을 사용하여) 개체의 데이터 하위 집합을 검색하여 작동한다. s3 select는 s3 버킷에서 한 번에 단일 개체에 대해 쿼리를 실행한다.
반면 Amazon Athena는 표준 SQL을 사용하여 S3에 저장된 데이터를 쉽게 분석할 수 있는 아마존의 쿼리 서비스 이다. Athena는 서버리스이므로 설정하거나 관리할 인프라가 없으며 쿼리에 대해서만 비용을 지불하는 식이다. 쿼리를 병렬로 실행하므로 대규모 데이터 세트와 복잡한 쿼리에서도 더 빠른 결과를 얻을 수 있다.