获取有关上传到 S3 的文件的信息

Get information about a file uploaded to S3

我已经创建了一个 lambda 函数,只要文件上传到 s3 存储桶就会发送电子邮件,但现在我想获得与该文件相关的所有信息,如名称、大小、上传日期和时间,如果它可能来自哪里。 我在 aws 控制台上有所有这些信息,但想把它放在电子邮件正文中。

我正在使用 无服务器框架。 v 1.22.0

这是我的代码

import json
import boto3
import botocore
import logging
import sys
import os
import traceback


from botocore.exceptions import ClientError
from pprint import pprint
from time import strftime, gmtime

email_from = '********@*****.com'
email_to = '********@*****.com'
email_subject = 'new event on s3 '
email_body = 'a new file is uploaded'


#setup simple logging for INFO
logger = logging.getLogger()
logger.setLevel(logging.INFO)

from botocore.exceptions import ClientError

def sthree(event, context):
"""Send email whenever a file is uploaded to S3"""
body = {}
status_code = 200
email_body =  str(context)

try:
    s3 = boto3.client('s3')
    ses = boto3.client('ses')
    ses.send_email(Source = email_from,
                Destination = {'ToAddresses': [email_to,],}, 
                    Message = {'Subject': {'Data': email_subject}, 'Body':{'Text' : {'Data': email_body}}}
         )
except Exception as e:
    print(traceback.format_exc())
    status_code = 500
    body["message"] = json.dumps(e)

response = {
    "statusCode": 200,
    "body": json.dumps(body)
}

return response

这是 S3 在创建对象时发送的事件 json 结构: http://docs.aws.amazon.com/AmazonS3/latest/dev/notification-content-structure.html

您可以这样获取文件名、大小和源 ip:

for record in event['Records']:
    filename = record['s3']['object']['key'];
    filesize = record['s3']['object']['size'];
    source = record['requestParameters']['sourceIPAddress'];
    eventTime = record['eventTime'];
def lambda_handler(event, context):
    s3 = boto3.client('s3')
    email_from = 'XXXXXXXXX@XXX.com'
    email_to = 'XXXXXXXXX@XXX.com'
    email_subject = 'new event on s3'
    email_body = "File Name :" + event[u'Records'][0][u's3'][u'object'][u'key'] + "\n" + "File Size :" + str(event[u'Records'][0][u's3'][u'object'][u'size']) + "\n" +  "Upload Time :" + event[u'Records'][0][u'eventTime'] + "\n" + "User Details :" + event[u'Records'][0][u'userIdentity'][u'principalId']
    ses = boto3.client('ses')
    ses.send_email(Source = email_from,
                Destination = {'ToAddresses': [email_to,],}, 
                    Message = {'Subject': {'Data': email_subject}, 'Body':{'Text' : {'Data': email_body}}}
         )
    print("Function execution Completed !!!")