Amazon S3(Simple Storage Service)는 AWS에서 제공하는 클라우드 기반 객체 스토리지 서비스입니다. AWS CLI(Command Line Interface)는 이러한 S3 서비스를 터미널이나 명령 프롬프트에서 쉽게 사용할 수 있게 해주는 도구입니다. 이 블로그 글에서는 AWS CLI를 사용하여 S3 서비스를 활용하는 방법에 대해 알아보겠습니다.
AWS CLI를 사용하기 위해서는 먼저 시스템에 설치해야 합니다. 운영체제별 설치 방법은 다음과 같습니다.
Copyaws --version
또는 명령 프롬프트에서 다음 명령어를 사용하여 직접 설치할 수도 있습니다:
Copymsiexec.exe /i https://awscli.amazonaws.com/AWSCLIV2.msi
무인 설치를 위해서는 다음과 같이 /qn
플래그를 사용할 수 있습니다:
Copymsiexec.exe /i https://awscli.amazonaws.com/AWSCLIV2.msi /qn
macOS에서는 다음 방법으로 AWS CLI를 설치할 수 있습니다:
Copy# Homebrew를 사용한 설치 방법
brew install awscli
Linux에서는 패키지 매니저나 공식 설치 스크립트를 사용하여 설치할 수 있습니다:
Copy# Ubuntu/Debian에서 pip를 사용한 설치
sudo apt-get update
sudo apt-get install python3-pip
pip3 install awscli --upgrade --user
# Amazon Linux, RHEL, CentOS
sudo yum install awscli
설치 후에는 다음 명령어로 설치 여부를 확인합니다:
Copyaws --version
AWS CLI를 설치한 후 AWS 계정에 연결하기 위한 구성이 필요합니다. 다음 명령어를 실행하여 기본 구성을 설정합니다:
Copyaws configure
이 명령어를 실행하면 다음 정보를 입력해야 합니다:
AWS CLI에서 S3 관련 명령어는 aws s3
형식으로 사용합니다. 명령어의 기본 형식은 다음과 같습니다:
Copyaws s3 <명령어> [인수] [옵션]
S3 명령어에서 사용되는 경로 인수는 두 가지 타입이 있습니다:
s3://버킷명/키
형식으로 작성해야 합니다.s3://my-bucket/my-folder/my-file.txt
mb
(make bucket) 명령어는 새로운 S3 버킷을 생성합니다:
Copyaws s3 mb s3://버킷명
버킷 이름은 전역적으로 고유해야 하며 DNS 규칙을 준수해야 합니다. 다음 규칙을 따릅니다:
예:
Copyaws s3 mb s3://my-bucket-2025
ls
명령어로 버킷, 폴더 또는 객체 목록을 확인할 수 있습니다:
Copy# 모든 버킷 목록 조회
aws s3 ls
# 특정 버킷 내 객체 목록 조회
aws s3 ls s3://버킷명
# 특정 접두사(폴더)의 객체 목록 조회
aws s3 ls s3://버킷명/접두사/
예:
Copy# 모든 버킷 조회
aws s3 ls
# my-bucket 버킷의 모든 객체 조회
aws s3 ls s3://my-bucket
# my-bucket 버킷의 images 폴더 내 객체 조회
aws s3 ls s3://my-bucket/images/
특정 리전의 버킷만 조회하고 싶은 경우 --region
옵션을 사용할 수 있습니다:
Copyaws s3 ls --region ap-northeast-2
결과를 페이지 단위로 보려면 --max-items
또는 --page-size
옵션을 사용할 수 있습니다:
Copyaws s3 ls --max-items 100 --page-size 10
rb
(remove bucket) 명령어로 S3 버킷을 삭제할 수 있습니다:
Copyaws s3 rb s3://버킷명
기본적으로 이 명령어는 빈 버킷만 삭제할 수 있습니다. 내용이 있는 버킷을 강제로 삭제하려면 --force
옵션을 사용합니다:
Copyaws s3 rb s3://버킷명 --force
이 명령어는 버킷 내 모든 객체를 삭제한 후 버킷을 삭제합니다.
cp
명령어는 로컬과 S3 간 또는 S3 버킷 간에 파일을 복사합니다:
Copy# 로컬 -> S3
aws s3 cp 로컬파일경로 s3://버킷명/키
# S3 -> 로컬
aws s3 cp s3://버킷명/키 로컬파일경로
# S3 -> S3
aws s3 cp s3://원본버킷/원본키 s3://대상버킷/대상키
예:
Copy# 로컬 파일을 S3에 업로드
aws s3 cp file.txt s3://my-bucket/
# S3 객체를 로컬에 다운로드
aws s3 cp s3://my-bucket/file.txt ./
# S3 버킷 간 복사
aws s3 cp s3://my-bucket/file.txt s3://other-bucket/backup/
디렉토리 전체를 복사하려면 --recursive
옵션을 사용합니다:
Copyaws s3 cp 로컬디렉토리 s3://버킷명/접두사/ --recursive
스트리밍 기능도 지원합니다:
Copy# 텍스트를 S3 파일로 저장
echo "hello world" | aws s3 cp - s3://my-bucket/hello.txt
# S3 파일 내용 출력
aws s3 cp s3://my-bucket/hello.txt -
mv
명령어는 파일을 이동시키거나 이름을 변경합니다. 소스 파일/객체를 복사한 후 원본을 삭제합니다:
Copy# 로컬 -> S3
aws s3 mv 로컬파일경로 s3://버킷명/키
# S3 -> 로컬
aws s3 mv s3://버킷명/키 로컬파일경로
# S3 내에서 이동
aws s3 mv s3://버킷명/원본키 s3://버킷명/대상키
예:
Copy# 로컬 파일을 S3로 이동
aws s3 mv file.txt s3://my-bucket/
# S3 객체를 로컬로 이동
aws s3 mv s3://my-bucket/file.txt ./
# S3 내에서 객체 이동 또는 이름 변경
aws s3 mv s3://my-bucket/old-name.txt s3://my-bucket/new-name.txt
폴더 전체를 이동하려면 --recursive
옵션을 사용합니다:
Copyaws s3 mv s3://my-bucket/folder/ s3://my-bucket/new-folder/ --recursive
rm
명령어로 S3 객체를 삭제할 수 있습니다:
Copyaws s3 rm s3://버킷명/키
예:
Copy# 단일 객체 삭제
aws s3 rm s3://my-bucket/file.txt
# 특정 접두사의 모든 객체 삭제
aws s3 rm s3://my-bucket/folder/ --recursive
sync
명령어는 소스와 대상 간의 파일을 동기화합니다. 소스에 있는 파일 중 대상에 없거나 변경된 파일만 복사합니다:
Copy# 로컬 -> S3
aws s3 sync 로컬디렉토리 s3://버킷명/접두사/
# S3 -> 로컬
aws s3 sync s3://버킷명/접두사/ 로컬디렉토리
# S3 -> S3
aws s3 sync s3://원본버킷/접두사/ s3://대상버킷/접두사/
예:
Copy# 현재 디렉토리를 S3와 동기화
aws s3 sync . s3://my-bucket/backup/
# S3 버킷 내용을 로컬 디렉토리로 동기화
aws s3 sync s3://my-bucket/data/ ./data/
-delete
옵션을 사용하면 소스에 없는 파일은 대상에서도 삭제됩니다:Copyaws s3 sync 로컬디렉토리 s3://버킷명/접두사/ --delete
-exclude
와 -include
옵션을 사용하여 특정 패턴의 파일을 포함하거나 제외할 수 있습니다:Copy# .txt 파일만 복사
aws s3 cp 로컬디렉토리 s3://버킷명/ --recursive --exclude "*" --include "*.txt"
# .git 디렉토리 제외하고 동기화
aws s3 sync 로컬디렉토리 s3://버킷명/ --exclude ".git/*"
# .jpg와 .png 파일만 업로드
aws s3 cp 로컬디렉토리 s3://버킷명/ --recursive --exclude "*" --include "*.jpg" --include "*.png"
패턴에서 사용 가능한 특수 문자:
?
: 단일 문자 매칭[시퀀스]
: 시퀀스 내 문자 매칭[!시퀀스]
: 시퀀스에 없는 문자 매칭필터가 여러 개인 경우, 나중에 나오는 필터가 우선합니다.
-acl
옵션으로 S3 객체의 접근 권한을 설정할 수 있습니다:Copy# 공개 읽기 권한으로 파일 업로드
aws s3 cp file.txt s3://my-bucket/ --acl public-read
# 공개 읽기/쓰기 권한으로 동기화
aws s3 sync 로컬디렉토리 s3://my-bucket/ --acl public-read-write
가능한 ACL 값:
private
: 소유자만 모든 권한 가짐public-read
: 소유자는 모든 권한, 다른 사용자는 읽기만 가능public-read-write
: 모든 사용자가 읽기/쓰기 가능-recursive
옵션은 디렉토리나 접두사 내 모든 파일에 명령을 적용합니다:Copy# 디렉토리 전체 업로드
aws s3 cp 로컬디렉토리 s3://버킷명/접두사/ --recursive
# 버킷 내 모든 객체 삭제
aws s3 rm s3://버킷명/ --recursive
정적 웹사이트를 S3에 배포하는 예:
Copy# 빌드된 웹사이트 파일을 S3에 업로드
aws s3 sync ./build/ s3://my-website-bucket/ --acl public-read
# 캐시 제어 헤더 설정
aws s3 cp ./build/index.html s3://my-website-bucket/ --cache-control "max-age=0" --acl public-read
대용량 파일 업로드 시 AWS CLI는 자동으로 멀티파트 업로드를 수행합니다:
Copyaws s3 cp large-file.zip s3://my-bucket/
업로드가 실패한 경우 멀티파트 업로드를 중단하려면:
Copyaws s3api abort-multipart-upload --bucket my-bucket --key large-file.zip --upload-id 업로드ID
S3의 다양한 스토리지 클래스를 활용하여 비용을 최적화할 수 있습니다:
Copy# STANDARD_IA 스토리지 클래스로 업로드
aws s3 cp archive.zip s3://my-bucket/ --storage-class STANDARD_IA
# GLACIER 스토리지 클래스로 업로드
aws s3 cp old-logs.zip s3://my-bucket/ --storage-class GLACIER
AWS CLI를 사용한 S3 관리는 자동화 스크립트 작성이나 대량의 파일 처리 시 특히 유용합니다. 이 문서에서 다룬 명령어와 옵션을 통해 S3의 기본 기능을 활용할 수 있습니다.
더 자세한 정보는 다음 공식 문서를 참조하세요: