버튼 수집상

[AWS S3] S3 버킷에 저장된 객체를 로컬에 다운로드하는 스크립트 aws-cli wrapped in a simple shell script 본문

TIL - AWS

[AWS S3] S3 버킷에 저장된 객체를 로컬에 다운로드하는 스크립트 aws-cli wrapped in a simple shell script

cocokaribou 2025. 1. 17. 11:36

배경

aws s3에서 파일을 벌크로 다운로드 받아야 할 때 웹 프론트에서 조작하기가 어려웠다.

아우 불편해

 

aws 커맨드 툴, aws-cli로 조작해도 옵션과 인자가 붙으면서 명령어가 길어졌다.

그래서 자주 쓰는 aws-cli 커맨드를 감싸서 실행가능한 스크립트로 만들었다.

 

시작하기 앞서 prerequisite

1. aws-cli 설치 링크

2. aws-vault 설치 링크

 

aws-cli로 s3 버킷에 접근하기 위해서는 aws에 자격증명, 로그인돼 있어야 한다.

pem 키로 ssh 접속하는 등 여러 방법이 있지만

이 글에서는 aws-vault 라는 도구를 사용하겠다.

aws-vault 유저 등록하는 법 참고

 

aws-vault 유저 등록 후 확인

$ aws-vault list
Profile                  Credentials              Sessions
=======                  ===========              ========
youngin.lee  	         -                        sso...

aws-vault 로그인

$ aws-vault exec youngin.lee -- bash --login

aws-cli 커맨드가 실행되면 로그인된 것.

# s3 버킷 리스트 확인하기
$ aws s3 ls
2024-11-12 12:01:46 bucket_1
2024-11-09 11:29:53 bucket_2
2024-11-12 15:16:16 bucket_3

 

aws-cli 로 s3 조작하기

공식 문서를 참고해서 s3를 조작하는 기본적인 커맨드들을 모아보았다.

ls: s3 버킷 나열

$ aws s3 ls
2024-11-12 12:01:46 bucket_1
2024-11-09 11:29:53 bucket_2
2024-11-12 15:16:16 bucket_3

 

rm: s3 버킷의 객체 삭제

$ aws s3 rm s3://bucket_1/archive/file_to_remove.txt

cp: s3 버킷의 객체 복사

s3 다른 버킷에 복사할 수도 있고 로컬에 복사할 수도 있다

# aws s3 cp <source> <target> [--options]

$ aws s3 cp s3://bucket_1/archive/file_to_copy.txt ./local_target_dir

 

커맨드의 옵션들은 이 링크에 정리돼있다.

 

스크립트 짜보기

sync_s3.sh 파일.

# bin 위치들
AWS_VAULT_PATH=$(which aws-vault)
AWS_PATH=$(which aws)

# aws-vault 유저 정보 (예시 PROD 검색)
AWS_PROFILE=$(aws-vault list --profiles | grep prod)

# S3 타겟 하위폴더 (예시)
S3_ARCHIVE_DIR='bucket_1/archive'

# 다운받을 로컬폴더
LOCAL_DIR='.'

# 스크립트 실행 시 에러가 발생하면 중단
set -e

# 입력값
# 인자1: 복사해올 S3 버킷 하위폴더
# 인자2: 복사해올 S3 객체 파일 확장자
FOLDER_PREFIX=$1
EXTENSION=$2

# 변수 확인 (디버깅용)
echo "✅"
echo "Using FOLDER_PREFIX: $FOLDER_PREFIX"
echo "Downloading .$EXTENSION archive files"
echo "Syncing from S3: s3://$S3_ARCHIVE_DIR/$FOLDER_PREFIX"
echo "To Local Directory: $LOCAL_DIR/$FOLDER_PREFIX"

$AWS_VAULT_PATH exec $AWS_PROFILE -- $AWS_PATH s3 cp "s3://$S3_ARCHIVE_DIR/$FOLDER_PREFIX" "$LOCAL_DIR/$FOLDER_PREFIX" --recursive --exclude "*" --include "*.$EXTENSION"

aws s3 cp 커맨드를 실행시키는 스크립트다.

옵션들

--recursive 입력된 폴더의 하위 폴더들을 모두 복사.

--include 특정 파일/확장자 포함. 단, --exclude "*"로 전부 제외시킨 다음에 적용해야 함.

 

사용할 때는 아래처럼 쓰면 된다

# sh sync_s3.sh [s3 버킷내 타깃폴더] [s3 타깃 객체 확장자]

$ sh sync_s3.sh source_1 html
✅
Using FOLDER_PREFIX: source_1
Downloading .html archive files
Syncing from S3: s3://bucket_1/archive/source_1
To Local Directory: ./source_1

스크립트를 실행파일로 만들기

aws-cli를 쉘 스크립트로 감쌌어도 여전히 명령줄이 너무 길다.

# 길다.
$ sh sync_s3.sh source_1 html

~/.zshrc 같은 파일에 함수나 alias로 등록할 수도 있다.

대신 실행파일로 만들어서 bin에 올려보겠다.

 

우선 스크립트의 파일권한을 실행가능하도록 바꾼다.

$ chmod +x sync_s3.sh

ls -ld을 실행해서 파일권한 바뀐 것 보기.

$ ls -ld sync_s3.sh
-rwxr-xr-x    1 youngin  staff     0B  1 17 11:16 sync_s3.sh

스크립트 저장된 위치에서 아래 쉘 커맨드를 입력.

스크립트를 /usr/local/bin 로 옮긴다.

# 맥 OS
$ sudo mv sync_s3.sh /usr/local/bin/sync_s3

/usr/local/bin은 실행파일들이 모여있기 때문에 수퍼유저, sudo로 접근해야 한다.

ls 로 잘 옮겨졌나 확인.

$ sudo ls /usr/local/bin
aws
docker
docker-compose
# ...
sync_s3

이제 터미널에서 /usr/local/bin에 등록된 sync_s3 이름만으로도 실행이 가능하다.

# 길다.
$ sh sync_s3.sh source_1 html

# 짧아졌다.
sync_s3 source_1 html
728x90