일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- ExoPlayer
- DiffUtil.ItemCallback
- ChatGPT
- kotlin collection
- video caching
- android
- list map
- FastAPI
- 시행착오
- ListAdapter DiffUtil
- ktor client
- ktor api call
- android exoplayer
- 유튜브 요약
- build with ai
- Zsh
- map
- Python
- kotlin list
- android custom view
- exoplayer cache
- 안드로이드
- android ktor
- doc2vec
- ListAdapter
- 유튜브
- getChangePayload
- AWS EC2
- 스피너
- llm
- Today
- Total
버튼 수집상
[AWS S3] S3 버킷에 저장된 객체를 로컬에 다운로드하는 스크립트 aws-cli wrapped in a simple shell script 본문
[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 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
'TIL - AWS' 카테고리의 다른 글
[EC2 Ubuntu] Apache2 Proxy 서버 설정해서 포트번호 생략된 주소로 접속하기 (1) | 2024.02.08 |
---|---|
[EC2 Ubuntu] 서버 GUI로 띄워서 보기 - 시행착오 (0) | 2023.07.05 |