기능/서비스 | EBS (Elastic Block Store) | EFS (Elastic File System) | S3 (Simple Storage Service) |
---|---|---|---|
유형 | 블록 스토리지 | 파일 시스템 | 객체 스토리지 |
주요 사용 사례 | EC2 인스턴스에 연결된 영구적이고 고성능의 디스크로 사용 | 여러 EC2 인스턴스에서 동시에 마운트 가능한 공유 파일 시스템 | 웹사이트 호스팅, 백업, 아카이빙 등 대량의 데이터 저장 및 검색 |
가용성 | 고가용성, 하나의 AZ(Availability Zone) 내 사용 | 여러 AZ에 걸쳐 고가용성 제공 | 전역 가용성, 여러 지역에서 접근 가능 |
내구성 | 높은 내구성 (99.999%의 가용성) | 높은 내구성 (99.999999999%의 내구성) | 매우 높은 내구성 (99.999999999%의 내구성) |
확장성 | 수동으로 크기 조정 필요 | 자동 확장 | 무제한 스토리지, 자동 확장 |
성능 | 프로비저닝된 IOPS 옵션으로 고성능 제공 | 여러 EC2 인스턴스에서 동시 접근 가능하며, 성능은 사용량에 따라 달라짐 | 높은 처리량 및 저지연 |
가격 | 사용한 스토리지 양과 프로비저닝된 IOPS에 따라 비용 발생 | 사용량에 기반하여 비용 발생 (스토리지 사용량과 요청 수에 따라 다름) | 저장된 데이터의 양, 요청 횟수, 데이터 전송 비용에 따라 비용 발생 |
적합한 사용 사례 | 데이터베이스, 부팅 볼륨 | 홈 디렉토리, 애플리케이션 공유 스토리지 | 웹사이트 이미지 및 비디오, 데이터 레이크, 백업 |
특성 | 블록 스토리지 | 파일 스토리지 | 오브젝트 스토리지 |
---|---|---|---|
사용 예시 | 데이터베이스 저장소, 가상 머신 디스크 | 네트워크 파일 시스템, 공유 드라이브 | 미디어 스트리밍, 백업 및 아카이브, 대규모 데이터 저장소 |
액세스 방식 | 블록 수준 액세스, 랜덤 액세스 | 파일 및 디렉토리 구조를 통한 액세스 | 파일 시스템이나 API를 통한 객체 수준 액세스 |
파일 시스템 | 해당 없음 | 존재함 | 파일 시스템 없음 (객체 단위 저장) |
데이터 구조 | 블록으로 분할된 고정 크기 데이터 | 파일 및 디렉토리 구조를 가진 데이터 | 객체(파일)와 메타데이터(예: 키, 값)가 결합된 데이터 |
확장성 | 유연하지 않음 | 중간 정도 | 매우 높음 |
가용성 | 높은 가용성, 장애 복구가 더 어려움 | 일반적으로 높은 가용성, 장애 복구가 가능 | 매우 높은 가용성, 자동 복제 및 장애 복구 |
비용 | 고가 | 중간 정도 | 저렴 |
대용량 데이터 처리 | 미비한 대용량 데이터 처리 성능 | 적절한 대용량 데이터 처리 성능 | 우수한 대용량 데이터 처리 성능 |
보안 | 데이터 암호화 및 접근 제어가 필요 | 파일 시스템의 접근 제어 및 암호화가 가능 | 데이터 암호화 및 접근 제어가 필요하지만 파일 시스템의 보안은 필요하지 않음 |
예시 서비스 및 제품 | AWS EBS (Elastic Block Store), 온프레미스 SAN/NAS | AWS EFS (Elastic File System), 온프레미스 NAS | AWS S3 (Simple Storage Service), Google Cloud Storage, Azure Blob Storage |
프라이빗으로 버킷을 만들었어서 권한이 없다고 뜬다
퍼블릭으로 바꿔주면 사진이 잘 뜬다
다시 프라이빗으로 바꾸려면 cli 명령어로 설정해야 한다
버전 관리 활성화하면 이 이후 업로드하는 것부터 버전 기록 된다
<조건 1>
S3의 옵션을 수정하지 않고 코드를 통해 퍼블릭으로 업로드 되도록
<조건 2>
객체 URL을 클릭하면 다운 받아지는 게 아니라 미리보기가 되도록
import boto3
from botocore.exceptions import NoCredentialsError
ACCESS_KEY = '(액세스키)'
SECRET_KEY = '(비밀 액세스키)'
BUCKET_NAME = '(버킷 이름)'
def upload_to_s3(file_name, bucket, object_name=None):
"""
파일을 S3 버킷에 업로드하고 퍼블릭으로 설정합니다.
:param file_name: 업로드할 파일의 경로
:param bucket: S3 버킷 이름
:param object_name: 버킷에 저장될 파일 이름. 지정하지 않으면 file_name이 사용됩니다.
"""
if object_name is None:
object_name = '(폴더명)/' + file_name.split('/')[-1] # S3의 shinyoung 폴더에 업로드
# S3 서비스 클라이언트를 생성합니다.
s3_client = boto3.client('s3', aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY)
try:
# 파일을 업로드하고 퍼블릭으로 설정합니다.
s3_client.upload_file(file_name, bucket, object_name,
ExtraArgs={'ACL': 'public-read', 'ContentType': 'image/jpeg'})
# MIME 유형을 설정하여 사진을 바로 볼 수 있도록 설정
print(f"{file_name} has been uploaded to {bucket}/{object_name} and made public")
# 공개적인 URL을 생성합니다.
url = s3_client.generate_presigned_url('get_object',
Params={'Bucket': bucket, 'Key': object_name},
ExpiresIn=10800) # URL 만료 시간(3시간)
print(f"Public URL to access the file: {url}")
except NoCredentialsError:
print("Credentials not available")
if __name__ == "__main__":
file_name = '짱구 배경화면.jpeg' # 로컬에서 업로드하려는 파일명
upload_to_s3(file_name, BUCKET_NAME, object_name=None)
출처 : https://velog.io/@glassesholder/posts
import boto3
import mimetypes
def upload_to_s3(file_name, bucket_name, object_name=None):
"""
AWS S3로 파일을 업로드하면서 ACL을 설정하여 퍼블릭으로 설정하는 함수
:param file_name: 업로드할 파일의 로컬 경로
:param bucket_name: S3 버킷 이름
:param object_name: S3에 저장될 객체 이름 (선택 사항)
:return: 성공적으로 업로드된 경우 True, 그렇지 않으면 False
"""
# 객체 이름이 제공되지 않으면 로컬 파일 이름을 사용
if object_name is None:
object_name = file_name
# AWS credentials 로드
session = boto3.Session(
aws_access_key_id='(액세스키)',
aws_secret_access_key='(비밀 액세스키)'
)
# S3 클라이언트 생성
s3_client = session.client('s3')
try:
# 파일 업로드
content_type, _ = mimetypes.guess_type(file_name)
print(content_type)
s3_client.upload_file(file_name, bucket_name, object_name, ExtraArgs={'ContentType': content_type})
s3_client.put_object_acl(ACL='public-read', Bucket=bucket_name, Key=object_name)
# ACL 설정하여 퍼블릭으로 설정
except Exception as e:
print(f"파일 업로드 실패: {e}")
return False
return True
if __name__ == "__main__":
# 파일 이름과 버킷 이름을 지정하여 함수 호출
file_name = '짱구 배경화면.jpg' # 업로드할 이미지 파일의 로컬 경로
bucket_name = '(버킷 이름)' # S3 버킷 이름
object_name = '(객체 이름)' # S3에 저장될 객체 이름 (선택 사항)
# 파일 업로드
upload_to_s3(file_name, bucket_name, object_name)
# 삭제하는 방법
import boto3
from botocore.exceptions import NoCredentialsError
ACCESS_KEY = '(액세스키)'
SECRET_KEY = '(비밀 액세스키)'
BUCKET_NAME = '(버킷 이름)'
def delete_from_s3(bucket, object_name):
"""
S3 버킷에서 객체를 삭제합니다.
:param bucket: S3 버킷 이름
:param object_name: 삭제할 객체의 키
"""
# S3 서비스 클라이언트를 생성합니다.
s3_client = boto3.client('s3', aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY)
try:
# 객체 삭제를 수행합니다.
s3_client.delete_object(Bucket=bucket, Key=object_name)
print(f"{object_name} has been deleted from {bucket}")
except NoCredentialsError:
print("Credentials not available")
if __name__ == "__main__":
object_name = '짱구 배경화면.jpg' # 삭제할 객체의 키
delete_from_s3(BUCKET_NAME, object_name)
미리보기도 잘 된다.
📖'천재교육'의 '프로젝트 기반 빅데이터 서비스 개발자 양성 과정' 내용을 바탕으로 작성하였습니다.