본문 바로가기

AWS Lambda ƛ/Lambda & Python

S3 버킷의 폴더를 삭제 후 새폴더를 생성 및 파일을 업로드 하는 방법

# 작업 구성도

람다 함수를 활용한 특정 데이터 저장.drawio
0.00MB

# 람다 코드

#---------------------------------------------------------------------------------
# 특정 S3 버킷의 폴더를 삭제 후 특정 폴더를 생성과 동시에 파일을 업로드 하는 방법
# 해당 버킷의 Prefix에 1개의 파일만 존재하도록 유지하기 위함 
# → 아테나나 퀵사이트에서 1개의 파일을 읽어야만 하는 경우가 생기는 경우
# → → S3 버킷에 1개의 파일만 존재해야 하는 경우...!!
#---------------------------------------------------------------------------------

import time
import boto3

# query = 'SELECT * FROM zzanggu.zzanggu'
DATABASE = 'zzanggu'
output ='s3://zzanggu/01'

def lambda_handler(event, context):
    s3 = boto3.resource('s3')
    bucket= s3.Bucket('zzanggu')
    bucket.objects.filter(Prefix="01/").delete()
    # client = boto3.client('s3')
    # client.delete_object(Bucket='mybucketname', Key='myfile.whatever')
    query = "SELECT * FROM zzanggu.zzanggu"
    client = boto3.client('athena')
    # Execution
    response = client.start_query_execution(
        QueryString=query,
        QueryExecutionContext={
            'Database': DATABASE
        },
        ResultConfiguration={
            'OutputLocation': output,
        }
    )
    return response
    return

# 정리된 람다 코드

#---------------------------------------------------------------------------------
# 특정 S3 버킷의 폴더를 삭제 후 특정 폴더를 생성과 동시에 파일을 업로드 하는 방법
# 해당 버킷의 Prefix에 1개의 파일만 존재하도록 유지하기 위함 
# → 아테나나 퀵사이트에서 1개의 파일을 읽어야만 하는 경우가 생기는 경우
# → → S3 버킷에 1개의 파일만 존재해야 하는 경우...!!
#---------------------------------------------------------------------------------

import time
import boto3

DATABASE = 'apache_log_db'
output ='s3://zzanggu/01'

def lambda_handler(event, context):
    s3 = boto3.resource('s3')
    bucket= s3.Bucket('zzanggu-delete')
    # 해당 버킷의 폴더?를 삭제
    bucket.objects.filter(Prefix="01/").delete()

    # 아테나의 논리적 테이블에 등록된 데이터를 쿼리하여 CSV 파일로 저장
    # 쿼리에 where절을 입력하여 특정 데이터만 추출하여 저장 가능
    query = "SELECT * FROM apache_log_db.zzanggu_db"
    client = boto3.client('athena')
    
    # Execution
    response = client.start_query_execution(
        QueryString=query,
        QueryExecutionContext={
            'Database': DATABASE
        },
        ResultConfiguration={
            'OutputLocation': output,
        }
    )
    return response
    return

- 작업을 하다보면 특정 S3버킷에 1개의 파일만 쌓아여할 때가 있다. 그럴때 위에 코드를 활용하면 된다.
- 더욱 심플하고 합리적인 다른 여러가지 방법이 있겠지만 내 수준은 여기까지...