我正在尝试创建一个AWS Lambda函数,该函数通过S3触发器使用CloudTrail事件。此函数将在删除CloudWatch日志时发出警报。事件:
“eventSource”:“日志”。amazonaws。com'
和
事件名称:删除日志流
需要作为同一个事件一起找到。我的事件中有数据,但我无法捕获和打印它。
import boto3
import gzip
import json
SNS_TOPIC = "<SNS TOPIC ARN>"
SNS_SUBJECT = "<SUBJECT>"
s3_client = boto3.client('s3')
sns_client = boto3.client('sns')
def handler(event, context):
for record in event['Records']:
bucket = record['s3']['bucket']['name']
key = record['s3']['object']['key']
# Fetch logs from S3
s3_object = s3_client.get_object(
Bucket=bucket,
Key=key,
)
# Extract file and metadata from gzipped S3 object
with gzip.open(s3_object['Body'], 'rb') as binaryObj:
binaryContent = binaryObj.read()
# Convert from binary data to text
raw_logs = binaryContent.decode()
# Change text into a dictionary
dict_logs = json.loads(raw_logs)
# Make sure json_logs key 'Records' exists
if 'Records' in dict_logs.keys():
print("Printing Dictionary Content: {} \n\n".format(dict_logs))
if dict_logs['Records'][0]['eventSource'] == 'logs.amazonaws.com' and dict_logs['Records'][0]['eventName'] == 'DeleteLogStream':
print("Found DeleteLogStream event from logs.amazonaws.com!")
# Print Key-Value pair for each item found
for key, value in dict_logs['Records'][0].items():
# Account for values that are also dictionaries
if isinstance(value, dict):
print("Parent Key: {}".format(key))
for k, v in value.items():
print("Subdict Key: {}".format(k))
print("Subdict Value: {}".format(v))
continue
else:
print("Key: {}".format(key))
print("Value: {}".format(value))
alert_message = "The following log was found: <extracted log contents here>"
# Publish message to SNS topic
sns_response = sns_client.publish(
TopicArn=SNS_TOPIC,
Message=alert_message,
Subject=SNS_SUBJECT,
MessageStructure='string',
)
else:
print("Records key not found")
下面是我得到的结果:来自代码的结果
我的代码打印键/值以进行调试。知道为什么要使用“DeleteLogStream”和“logs”吗。amazonaws。com的值没有解析出来?
下面的json事件示例:https://raw.githubusercontent.com/danielkowalski1/general-scripts/master/sampleevent
好的,修复了问题。这将遍历整个记录列表,然后对每个列表值的字典进行筛选,从而找到所有出现的“DeleteLogStream”。
EVENT_SOURCE = "logs.amazonaws.com"
EVENT_NAME = "DeleteLogStream"
# Make sure 'Records'key exists
if 'Records' in dict_logs.keys():
for item in dict_logs['Records']:
# Trigger only if a log
if ('eventSource' in item):
if (item['eventSource'] == EVENT_SOURCE):
if (item['eventName'] == EVENT_NAME):
# Grab other useful details for investigation
if item['sourceIPAddress']:
src_ip = item['sourceIPAddress']
if item['userIdentity']['arn']:
src_user = item['userIdentity']['arn']
问题内容: 我在获取想要在JSON文件中的数据时遇到了一些麻烦。这是控制台输出的简化版本: 我正在尝试使用内置的JSON解析库来解析文件。这是我的方法中的解析器 : 我想将货币代码(如)与货币词典中包含的其他一些数据一起存储,但是现在我的应用崩溃了。错误代码: 似乎没有任何对象添加到 救命? 编辑:获取键以显示适当的数据填充其他字段显示: 问题答案: 您的数据不包含任何数组,而是所有字典,请尝试上
问题内容: 我正在使用angular的请求,该请求成功返回包装在函数中的json: 如何访问/解析返回的函数包装的JSON? 问题答案: 更新:从Angular 1.6开始 您不能再使用JSON_CALLBACK字符串作为占位符来指定回调参数值应放在何处 您现在必须像这样定义回调: 通过更改/访问/声明参数,默认为 注意:您还必须确保将URL添加到受信任/白名单中: 或通过以下方式明确信任: 被弃
问题内容: 我是使用Swift语言进行iOS开发的初学者。我有一个包含以下数据的JSON文件。 我想解析此文件,并且必须返回包含JSON文件中数据的字典。这是我写的方法。 当我修改此方法以返回字典时,它总是返回nil。如何修改此方法。 问题答案: 您不能执行异步任务。您必须改用回调。 添加这样的回调: 解析器方法签名: 并在您要“返回”的数据可用的地方调用补全: 现在,您可以将此方法与结尾的闭包一
问题内容: 我试图解析一个字符串,以分隔字符串中的列表。我目前有字符串: 有什么方法可以解析字符串,以便字典键是列表的第一个元素,而键的值是元素的下一个。例如: 问题答案: insted的的,你可以有列表: 您可以使用从字符串解析Python数据结构
问题内容: 我收到此响应的结果是对服务器的GET请求 我只想从上述json响应中提取的值。 我正在使用此代码来获得此响应 我的问题是,我该如何解析并获取only 标签的值。谢谢 问题答案: 您可以解析当前的json字符串以从中获取它:
问题内容: 我正在尝试使用C#从rest api json响应中提取一个值。 我有以下代码: 在“响应”消息中,我得到了一个json内容,如下所示: 如何从返回的json响应结果消息中提取以下嵌套值“ id”:“ 521cfcd840926a0b3500449e”? 我正在使用C#。 问题答案: 1>添加此namspace。使用Newtonsoft.Json.Linq; 2>使用此源代码。