作者:mobiledu2502871567 | 来源:互联网 | 2023-08-10 13:37
我一直在关注CloudTrail和CloudWatch上的AWS教程,并使用它来设置一个规则,该规则将在S3存储桶上发生PUT操作时触发Lambda。 Lambda将打印存储桶的名称和其他详细信息。
import json
import urllib.parse
import boto3
# instantiate an S3 object
s3 = boto3.client('s3')
def lambda_handler(event,context):
# Start processing by looking at Records key-value
try:
records = event['Records']
if len(records) == 0:
raise Exception("Records was zero!")
else:
packet = []
for row in records:
msg = "Received event type - {}".format(row["eventName"]) + \
" caused by user - {}".format(
row["userIdentity"]["principalId"]) + \
" on bucket - {}".format(row["s3"]["bucket"]["name"]) + \
" whose owner is - {}".format(
row["s3"]["bucket"]["ownerIdentity"]["principalId"]) + \
" The specific object that got put was {}".format(
row["s3"]["object"]["key"]
)
print(msg)
packet.append(
{
"eventName":row["eventName"],"userIdentity":row["userIdentity"]["principalId"],"bucket":row["s3"]["bucket"]["name"],"bucketOwner":row["s3"]\
["bucket"]["ownerIdentity"]["principalId"],"objectKey":row["s3"]["object"]["key"]
} )
return {"statusCode":200,"body":packet}
except:
raise Exception("Could not find Records from Events")
我注意到,在Cloudwatch日志中(位于日志组下),只要将文件放在S3存储桶下,我都会看到S3存储桶的所有活动。
但也有例外->无法从事件中找到记录-存在。
为什么在这种情况下会触发Lambda?
您可以打印例外情况,看看引发了什么例外情况。
,
替代解决方案-如果cloudwatch提供错误。您可以在s3中使用通知配置。在s3中创建对象时,这将调用lambda。
public Task Serialize(TData data)
where TData : class
{
using (var buffer = new MemoryStream())
{
// Serialize the data.
var avroSerializer = Microsoft.Hadoop.Avro.AvroSerializer.Create(_settings);
avroSerializer.Serialize(buffer,data);
// Return the contents of the buffer.
buffer.Seek(0,SeekOrigin.Begin);
return Task.FromResult(buffer.ToArray());
}
}