当前位置: 首页 > 知识库问答 >
问题:

在AWS Lambda中解析字典响应

弓宏茂
2023-03-14

我正在尝试创建一个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

共有1个答案

童华池
2023-03-14

好的,修复了问题。这将遍历整个记录列表,然后对每个列表值的字典进行筛选,从而找到所有出现的“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>使用此源代码。