현재 저는 AWS를 공부하고 있는 학생입니다. AWS를 활용해서 데이터 유출 프로그램을 만드는 프로젝트를 진행 중입니다. 저는 S3 버킷에서 1GB 이상의 파일이 다운로드 되는 경우 관리자에게 메일을 보내고 싶습니다. 그리고 현재 람다 함수에 이와 같이 (아래 첨부) 코드를 작성하고 다운로드 할 파일이 있는 S3 버킷과 CloudWatch, CloudTrail의 로그를 기록하는 S3 버킷이 트리거 되도록 설정해두었습니다. 하지만 현재 파일을 다운로드 하면 함수 내부에서 해당 파일의 크기를 제대로 확인하지 못하고 제가 작성한 로그를 기록하지 못하고 있습니다. 이를 해결할 수 있는 방법을 도와주시면 감사하겠습니다.
import json
import boto3
sns_client = boto3.client('sns')
s3_client = boto3.client('s3')
SNS_TOPIC_ARN = 'arn:aws:sns:ap-northeast-2:746669191704:Time_event'
def lambda_handler(event, context):
# 이벤트 구조 확인을 위해 로그 추가
print("Received event: ", json.dumps(event)) # 이벤트 로그 출력
try:
# Extract bucket and object information from event['Records']
for record in event['Records']:
bucket_name = record['s3']['bucket']['name']
object_key = record['s3']['object']['key']
event_name = record['eventName']
# Check the 'Importance' tag of the S3 object
importance_tag = None # Initialize importance tag
try:
if event.get('detail', {}).get('eventName') == 'GetObject':
bucket_name = event['detail']['requestParameters']['bucketName']
object_key = event['detail']['requestParameters']['key']
# Get file size
response = s3_client.head_object(Bucket=bucket_name, Key=object_key)
file_size = response['ContentLength']
for tag in tags:
if tag['Key'] == 'Importance':
importance_tag = tag['Value']
break
if not importance_tag:
importance_tag = 'None' # Default value if no tag is found
except Exception as e:
# Log error if unable to retrieve tags
print(f"Error retrieving object tags: {str(e)}")
importance_tag = 'None' # Default value if tags cannot be retrieved
# Check file size (send email if the size is larger than 900MB)
if event_name == 'GetObject': # Download event
try:
# Get file size from object metadata
response = s3_client.head_object(Bucket=bucket_name, Key=object_key)
file_size = response['ContentLength'] # File size in bytes
# Send alert if the file size is greater than or equal to 900MB
if file_size >= 900 * 1024 * 1024: # 900MB or larger
message = (
f"Large file download detected!\n"
f"S3 Bucket: {bucket_name}\n"
f"Object Name: {object_key}\n"
f"File Size: {file_size / (1024 * 1024 * 1024):.2f} GB\n"
f"Importance: {importance_tag}"
)
subject = "Large File Download Alert"
else:
# Regular download alert for files smaller than 900MB
message = f"Notification: Object '{object_key}' in S3 bucket '{bucket_name}' was downloaded. Importance: {importance_tag}"
subject = 'S3 Data Download Notification'
except Exception as e:
print(f"Error retrieving object metadata: {str(e)}")
return # Exit if file size retrieval fails
else: # Other events (upload, delete, etc.)
message = f"Notification: Object '{object_key}' in S3 bucket '{bucket_name}' has changed. Importance: {importance_tag}"
subject = 'S3 Data Change Notification'
# Send notification via SNS
try:
sns_client.publish(
TopicArn=SNS_TOPIC_ARN,
Message=message, # Message body
Subject=subject # Subject
)
print(f"Message sent to SNS: {message}")
except Exception as e:
# Log error if SNS message sending fails
print(f"Error sending SNS message: {str(e)}")
except KeyError as e:
print(f"Error: Missing expected key in event data: {e}")
print(f"Event: {json.dumps(event)}") # Output event structure
현재 클라우드트레일에 파일을 다운로드 받을 버킷을 연결해두었지만 파일을 다운로드 받아도 클라우드트레일에 GetObject 이벤트가 캡쳐되지 않고 있는 상황입니다. 이런 경우에는 어떤 설정을 해야 하나요?