BLOG
AWS는 그간 모든 유형의 고객과 사용 사례를 지원해왔습니다. 그동안 AWS가 정기적으로 받아온 피드백은 고객은 시스템과 인프라를 배포 및 관리하는 대신 핵심 비즈니스에 집중하기 위해 복잡성과 관리 오버헤드를 줄이고 싶어한다는 것입니다. 복잡성과 오버헤드는 많은 양의 데이터를 효율적으로 검색할 때 겪게 되는 어려움입니다.
오늘 블로그 포스팅으로는 SQL (Structured Query Language) 쿼리를 사용하여 Amazon Simple Storage Service (Amazon S3)에 로드된 데이터를 쉼표로 구분된 값 (CSV) 파일로 검색하는 방법에 대해 다루어 보겠습니다. 이전에는 데이터를 쿼리하기 위해 데이터베이스에 로드해야 했습니다. 데이터베이스를 배포하는 것 외에도 고객은 검색을 가능하게 하려면 애플리케이션 및 웹 사이트를 배포해야 했습니다. 데이터베이스와 관련 리소스를 배포하는 대신 S3 Select 라는 S3 기능을 사용하여 서버가 없는 전화번호부 검색 도구를 만듭니다.
먼저 간단한 전화번호부 .csv 파일에서 결과를 반환하기 위해 SQL 쿼리 실행의 기본 사항을 보여드리겠습니다. 이 솔루션을 조금 더 살펴보기 위해 AWS 예제 GitHub 페이지에서 완전한 서버리스 전화번호부 검색 애플리케이션을 생성하는 데 필요한 모든 구성 요소가 포함된 샘플 전화번호부 검색 도구를 만들었습니다.
고객은 Amazon S3를 활용하여 별도의 스토리지 프로비저닝이나 인프라 관리 없이 어떤 양의 데이터든 저장하고 보호할 수 있습니다. Amazon S3 Select and Amazon S3 Glacier Select를 사용하면 S3 및 Amazon S3 Glacier에 저장된 데이터에 대해 구조화된 쿼리 언어 SQL 쿼리를 직접 실행할 수 있습니다. S3 Select를 사용하면 S3에 데이터를 저장하고 SQL 문을 사용하여 쿼리하여 S3 객체의 내용을 필터링하여 필요한 데이터만 검색할 수 있습니다. 고객은 데이터의 하위 집합만 검색함으로써 Amazon S3가 전송하는 데이터의 양을 줄이고 데이터 검색 비용과 대기 시간을 줄입니다. 비용과 복잡성을 줄이면 AWS 고객은 더 빠르게 움직일 수 있으며 비즈니스와 고객에게 가치를 제공하는 데 필요한 시간을 줄일 수 있습니다.
S3 Select는 CSV, JSON 또는 Apache Parquet 형식으로 저장된 객체에서 작동합니다. S3 Select는 또한 GZIP 또는 BZIP2를 사용하는 CSV 및 JSON 객체와 서버 측 암호화된 객체의 압축을 지원합니다. AWS SDK, SELECT Object Content REST API, AWS Command Line Interface (AWS CLI) 또는 AWS Management Console을 사용하여 SQL 쿼리를 수행할 수 있습니다.
주요 AWS 서비스
간단한 전화번호부 애플리케이션은 다음 AWS 서비스를 활용합니다.
- Amazon S3는 업계 최고의 확장성, 데이터 가용성, 보안 및 성능을 제공하는 객체 스토리지 서비스입니다.
- S3 Select를 사용하면 응용 프로그램은 간단한 SQL식을 사용하여 S3개체에서 데이터의 하위 집합만 검색할 수 있습니다.
S3 및 S3 Select 외에도 Amazon S3 Select – Phonebook Search GitHub sample project에는 다음 서비스가 포함됩니다.
- Amazon API Gateway는 개발자가 모든 규모의 API를 쉽게 생성, 게시, 유지 관리, 모니터링 및 보호할 수 있도록 하는 통합 관리 서비스입니다. Amazon API Gateway는 서버리스 애플리케이션의 공통 구성 요소이며 AWS Lambda와 상호 작용하는 데 사용됩니다.
- AWS Lambda를 사용하면 서버를 프로비저닝하거나 관리하지 않고도 코드를 실행할 수 있습니다. 샘플 프로젝트의 S3 Select 쿼리는 AWS Lambda로 실행됩니다.
- AWS CloudFormation은 클라우드 환경에서 AWS를 모델링하고 프로비저닝할 수 있는 공통 언어와 타사 애플리케이션 리소스를 제공합니다. CloudFormation은 샘플 앱에서 최소한의 노력으로 샘플 프로젝트에 필요한 리소스 배포를 조정하는 데 사용됩니다.
샘플 코드
이 프로젝트의 샘플 코드는 AWS-Samples GitHub 리포지토리에 있으며 자세한 내용은 아래에 요약되어 있습니다.
시작하기
S3 Select는 S3버킷에 저장된 데이터를 사용하여 S3에서 바로 실행되므로 AWS 계정과 S3 버킷만 실행시키시면 됩니다.
기존 AWS 계정에 로그인하거나 새 AWS 계정을 생성하세요. 로그인 후 S3 Select 테스트에 사용할 S3버킷을 생성하세요.
테스트에 사용할 데이터는 사용자의 이름, 전화번호, 도시 및 직업이 포함된 간단한 CSV 파일입니다. CSV 파일의 원시 데이터는 아래와 같으며 GitHub 에서 사용할 수 있으므로 편하게 파일을 다운로드하여 편집하실 수 있습니다!
Name,PhoneNumber,City,Occupation
Sam,(949) 555-6701,Irvine,Solutions Architect
Vinod,(949) 555-6702,Los Angeles,Solutions Architect
Jeff,(949) 555-6703,Seattle,AWS Evangelist
Jane,(949) 555-6704,Chicago,Developer
Sean,(949) 555-6705,Chicago,Developer
Mary,(949) 555-6706,Chicago,Developer
Kate,(949) 555-6707,Chicago,Developer
sample_data.csv 파일을 새 S3 버킷에 업로드하세요.
빠르게 테스트하기 위해 Python에서 다음을 실행합니다. Python에서 “s3select-demo”라는 S3버킷의 “sample_data.csv”객체를 쿼리합니다. 버킷 이름은 생성한 버킷의 이름을 나타내도록 변경해야 합니다.
빠른 테스트를 위해 EC2 인스턴스 Amazon Linux 2를 실행하는 t3.micro를 배포하고 pip 명령을 사용하여 boto3을 설치합니다. 적절한 권한이 있는 IAM 역할을 사용하도록 주의하세요.
S3 Select 쿼리를 실행하도록 EC2 인스턴스 구성
인스턴스가 실행되면 ec2-user로 로그인하고 다음 명령을 실행하여 환경을 설정하세요.
sudo yum update –y
sudo yum install python3 –y
python3 –m venv ~/s3select_example/env
source ~/s3select_example/env/bin/activate
pip install pip —upgrade
pip install boto3
wget https://raw.githubusercontent.com/aws–samples/s3-select-phonebook–search/master/src/samples/jane.py
wget https://raw.githubusercontent.com/aws–samples/s3-select-phonebook–search/master/src/samples/jane-gzip.py
위의 단계에서는 python3 환경을 만들고 다음 내용으로 jane.py라는 Python 파일을 다운로드합니다. 이 파일을 통해 이름이 Jane인 사용자를 검색할 수 있습니다. S3 버킷과 일치하도록 현재 S3 버킷 이름을 바꿔야 합니다.
import boto3
s3 = boto3.client(‘s3’)
resp = s3.select_object_content(
Bucket=’s3select-demo’,
Key=’sample_data.csv’,
ExpressionType=’SQL’,
Expression=”SELECT * FROM s3object s where s.\”Name\” = ‘Jane'”,
InputSerialization = {‘CSV’: {“FileHeaderInfo”: “Use”}, ‘CompressionType’: ‘NONE’},
OutputSerialization = {‘CSV’: {}},
)
for event in resp[‘Payload’]:
if ‘Records’ in event:
records = event[‘Records’][‘Payload’].decode(‘utf-8’)
print(records)
elif ‘Stats’ in event:
statsDetails = event[‘Stats’][‘Details’]
print(“Stats details bytesScanned: “)
print(statsDetails[‘BytesScanned’])
print(“Stats details bytesProcessed: “)
print(statsDetails[‘BytesProcessed’])
print(“Stats details bytesReturned: “)
print(statsDetails[‘BytesReturned’])
OutputSerialization 필드는 CSV로 설정되어 있으므로 “Jane”과 일치하는 결과를 CSV로 인쇄합니다. 사용 사례에 적합하면 JSON으로 설정할 수 있습니다.
S3 Select 쿼리 실행
S3 버킷 이름을 생성한 S3 버킷 이름과 일치하도록 jane.py로 이름을 변경한 후 다음 명령을 사용하여 쿼리를 실행하세요.
python jane.py
결과는 다음과 같습니다.
Jane,(949) 555-6704,Chicago,Developer
Stats details bytesScanned:
326
Stats details bytesProcessed:
326
Stats details BytesReturned:
38
Jane 사용자에 대한 일치가 S3 Select에서 스캔, 처리 및 반환한 데이터를 보여주기 위해 추가한 일부 선택적 세부 정보와 함께 표시됩니다. 이 경우 sample_data.csv는 326 바이트입니다. S3 Select는 전체 파일을 스캔하고 38 바이트만 반환합니다.
압축 데이터로 S3 선택
다시 같은 검사를 해보도록 할 텐데요, 이번에는 sample_data.csv.gz로 저장된 전화번호부의 GZIP 버전을 압축하고 업로드 한 뒤에 진행하겠습니다. 이 파일 또한 GitHub에서 다운로드 할 수 있습니다.
파이썬 코드의 수정은 Key를 gzip의 객체로 변경하고 InputSerialization CompressionType을 None에서 GZIP로 변경하는 것입니다. 새 버전의 Python 스크립트는 jane-gzip.py로 저장되며 AWS-Samples GitHub 페이지에서도 사용할 수 있습니다.
gzip 파일을 지정하기 위해 객체 키 이름을 변경했습니다.
Key = ‘sample_data.csv.gz’,
그리고 CompressionType을 GZIP로 변경하기 위해 InputSerialization 줄을 변경했습니다:
InputSerialization = { ‘CSV’: { “FileHeaderInfo”: “사용”}, ‘CompressionType’: ‘GZIP’},
jane-gzip.py의 전체 파일은 다음과 같습니다. S3 버킷 이름과 일치하도록 현재 S3 버킷 이름을 바꿔야 합니다.
import boto3
s3 = boto3.client(‘s3’)
resp = s3.select_object_content(
Bucket=’s3select-demo’,
Key=’sample_data.csv.gz’,
ExpressionType=’SQL’,
Expression=”SELECT * FROM s3object s where s.\”Name\” = ‘Jane'”,
InputSerialization = {‘CSV’: {“FileHeaderInfo”: “Use”}, ‘CompressionType’: ‘GZIP’},
OutputSerialization = {‘CSV’: {}},
)
for event in resp[‘Payload’]:
if ‘Records’ in event:
records = event[‘Records’][‘Payload’].decode(‘utf-8’)
print(records)
elif ‘Stats’ in event:
statsDetails = event[‘Stats’][‘Details’]
print(“Stats details bytesScanned: “)
print(statsDetails[‘BytesScanned’])
print(“Stats details bytesProcessed: “)
print(statsDetails[‘BytesProcessed’])
print(“Stats details bytesReturned: “)
print(statsDetails[‘BytesReturned’])
다음 명령은 gzip 파일에서 S3 선택 쿼리를 실행합니다.
python jane-gzip.py
결과는 다음과 같습니다.
Jane,(949) 555-6704,Chicago,Developer
Stats details bytesScanned:
199
Stats details bytesProcessed:
326
Stats details bytesReturned:
38
압축 및 비 압축 데이터의 결과 비교
gzip 압축을 사용하면 S3의 공간이 절약되고 데이터 처리량이 줄어 듭니다. 이 테스트를 위한 작은 csv 파일의 경우 압축을 사용하면 공간이 39% 절약됩니다.
다음 표는 sample_data.csv와 sample_data.csv.gz라는 두 파일 간의 S3 Select 실행 차이점을 보여줍니다.
File Size (Bytes) | Bytes scanned | Bytes processed | Bytes returned | Difference | |
Uncompressed | 326 | 326 | 326 | 38 | 해당 없음 |
Compressed | 199 | 199 | 326 | 38 | ~ 39 % 작음 |
~ 1,000,000 줄로 구성된 133,975,755 바이트 CSV 파일 (~ 128MB)과 같은 큰 파일의 사례가 데이터 압축 사례가 눈에 띄는데요, 이러한 파일을 테스트 할 때 파일 크기는 GZIP 압축을 통해 ~ 60 % 감소하여 50,308,104 바이트 (~ 50.3MBytes)로 줄었습니다.
File Size (Bytes) | Bytes scanned | Bytes processed | Bytes returned | Difference | |
Uncompressed | 133,975,755 | 133,975,755 | 133,975,755 | 6 | 해당 없음 |
Compressed | 50,308,104 | 50,308,104 | 133,975,755 | 6 | ~ 60 % 더 작아짐 |
S3 Glacier Select를 사용하여 아카이브 쿼리
S3 Glacier 아카이브 객체에 대한 SQL 쿼리를 제공하면 S3 Glacier Select가 쿼리를 제 위치에서 실행하고 출력 결과를 Amazon S3에 작성합니다. S3 Glacier Select를 사용하면 S3 Standard와 같은 더 높은 계층으로 데이터를 복원하지 않고도 S3 Glacier에 저장된 데이터에 대해 쿼리 및 사용자 정의 분석을 실행할 수 있습니다.
select queries를 수행할 때 S3 Glacier는 expedited, standard, and bulk 세 가지 데이터 액세스 계층을 제공합니다. 이러한 모든 계층은 모두 다른 데이터 액세스 시간과 비용을 제공하며 데이터 사용속도에 따라 계층을 선택할 수 있습니다. 가장 큰 아카이브 (250MB 이상)를 제외한 모든 경우, expedited 계층을 사용하여 액세스하면 데이터는 일반적으로 1-5분 내에 제공됩니다. standard 계층은 3-5시간 안에 완료됩니다. 대량 검색은 5-12시간 내에 완료됩니다.
결론
이 게시물에서는 S3 Select가 Amazon S3 또는 Amazon S3 Glacier에 저장된 데이터에서 직접 SQL 쿼리를 실행하는 간단한 방법을 제공하는 방법을 보여주었습니다. S3 Select는 S3에 저장된 데이터에 대해 실행될 수 있으므로 고객은 이 기능을 사용하여 프로그래밍 방식으로 또는 AWS SFTP (AWS SFTP) 와 같은 서비스에서 S3에 업로드된 데이터를 처리 할 수 있습니다. 예를 들어 고객은 AWS SFTP를 사용하여 S3에 직접 데이터를 업로드 한 다음 S3 Select를 사용하여 데이터를 쿼리할 수 있습니다. 이 작업은 새 CSV 객체가 S3 이벤트 알림으로 S3에 업로드 된 후 AWS Lambda 실행에 의해 자동으로 트리거 될 수 있습니다. S3 Select를 사용하여 데이터를 검색하면 다른 방법으로 데이터를 결합하는 데 소요되는 시간과 비용을 절약할 수 있습니다.
S3 Select를 더 실습하려면 AWS Samples GitHub repo를 방문하세요. 여기서 sample code for the simple phonebook application 찾을 수 있어 S3 Select를 통해 더 많은 실습을 진행할 수 있습니다. GitHub repo는 명령을 Amazon API Gateway에 의해 시작된 AWS Lambda로 오프로드합니다.
정리
이 샘플에서는 S3 버킷을 생성하고 .csv 파일 (sample_data.csv)을 업로드 한 다음 t3.micro EC2 인스턴스를 사용하여 데이터를 쿼리했습니다. 환경을 정리하려면 EC2 인스턴스를 중지하고 종료한 후 S3 버킷에서 sample_data.csv 파일을 삭제하세요. 테스트에 사용한 S3 버킷을 삭제하도록 선택할 수도 있습니다. 이 단계를 수행하면 이 샘플로 인해 계정에 향후 비용이 발생하지 않습니다.
추가 자료
- GitHub repo 전화번호부와 이 샘플 애플리케이션을 배포할 때 필요한 코드가 포함되어있습니다.
- AWS Samples GitHub 몇 가지 AWS 서비스와 사례를 위한 샘플 코드가 포함되어 있습니다.
- Amazon S3 Select documentation
- SQL reference for Amazon S3 Select.
- AWS Transfer for SFTP
- Using AWS Lambda with Amazon S3 Events
** 메가존 클라우드 TechBlog는 AWS BLOG 영문 게재 글 중에서 한국 사용자들에게 유용한 정보 및 콘텐츠를 우선적으로 번역하여 내부 엔지니어 검수를 받아서, 정기적으로 게재하고 있습니다. 추가로 번역 및 게재를 희망하는 글에 대해서 관리자에게 메일 또는 SNS 페이지에 댓글을 남겨주시면, 우선적으로 번역해서 전달해드리도록 하겠습니다.