Bhu*_*esh 2 python lambda json amazon-web-services
我正在尝试实现一个功能,该功能将从 cloudwatch 获取事件并打印结果。我能够获得该事件,但我想从该 JSON 中提取一个特定的键。
import json
def lambda_handler(event, context):
print("Received event: " + json.dumps(event, indent=2))
message = event['Records'][0]['Sns']['Message']
print(message)
Run Code Online (Sandbox Code Playgroud)
"Records": [
{
"EventVersion": "1.0",
"EventSubscriptionArn": "arn:aws:sns:us-east-1:xxxxxxxxxxxxx:bhuvi:XXXXXXXXXXXXXXXXXXXXXXXXXX",
"EventSource": "aws:sns",
"Sns": {
"SignatureVersion": "1",
"Timestamp": "2018-01-13T19:18:44.369Z",
"Signature": "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx",
"SigningCertUrl": "https://sns.us-east-1.amazonaws.com/SimpleNotificationService-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX.pem",
"MessageId": "4b76b0ea-5e0f-502f-81ec-e23e03dbaf01",
"Message": "{\"AlarmName\":\"test\",\"AlarmDescription\":\"test\",\"AWSAccountId\":\"xxxxxxxxxxxxx\",\"NewStateValue\":\"ALARM\",\"NewStateReason\":\"Threshold Crossed: 1 out of the last 1 datapoints [2.6260535333900545 (13/01/18 19:13:00)] was greater than or equal to the threshold (1.0) (minimum 1 datapoint for OK -> ALARM transition).\",\"StateChangeTime\":\"2018-01-13T19:18:44.312+0000\",\"Region\":\"US East (N. Virginia)\",\"OldStateValue\":\"OK\",\"Trigger\":{\"MetricName\":\"CPUUtilization\",\"Namespace\":\"AWS/RDS\",\"StatisticType\":\"Statistic\",\"Statistic\":\"AVERAGE\",\"Unit\":null,\"Dimensions\":[{\"name\":\"DBInstanceIdentifier\",\"value\":\"myrds\"}],\"Period\":300,\"EvaluationPeriods\":1,\"ComparisonOperator\":\"GreaterThanOrEqualToThreshold\",\"Threshold\":1.0,\"TreatMissingData\":\"\",\"EvaluateLowSampleCountPercentile\":\"\"}}",
"MessageAttributes":
{}
,
"Type": "Notification",
"UnsubscribeUrl": "https://sns.us-east-1.amazonaws.com/?xcsgagrgrwgwrg",
"TopicArn": "arn:aws:sns:us-east-1:xxxxxxxxxxxxx:bhuvi",
"Subject": "ALARM: \"test\" in US East (N. Virginia)"
}
}
]
}
Run Code Online (Sandbox Code Playgroud)
message = event['Records'][0]['Sns']['Message']
print(message)
Run Code Online (Sandbox Code Playgroud)
结果
{
"AlarmName": "test",
"AlarmDescription": "test",
"AWSAccountId": "xxxxxxxxxxxxx",
"NewStateValue": "ALARM",
"NewStateReason": "Threshold Crossed: 1 out of the last 1 datapoints [2.6260535333900545 (13/01/18 19:13:00)] was greater than or equal to the threshold (1.0) (minimum 1 datapoint for OK -> ALARM transition).",
"StateChangeTime": "2018-01-13T19:18:44.312+0000",
"Region": "US East (N. Virginia)",
"OldStateValue": "OK",
"Trigger": {
"MetricName": "CPUUtilization",
"Namespace": "AWS/RDS",
"StatisticType": "Statistic",
"Statistic": "AVERAGE",
"Unit": null,
"Dimensions": [
{
"name": "DBInstanceIdentifier",
"value": "myrds"
}
],
"Period": 300,
"EvaluationPeriods": 1,
"ComparisonOperator": "GreaterThanOrEqualToThreshold",
"Threshold": 1,
"TreatMissingData": "",
"EvaluateLowSampleCountPercentile": ""
}
Run Code Online (Sandbox Code Playgroud)
我想从此消息窗格中提取一些值。
例如:我想提取名称。所以我尝试了下面的命令,但不幸的是它不起作用。谁可以帮我这个事?

message = event['Records'][0]['Sns']['Message']['Trigger']['Dimensions']['name']
print(message)
Run Code Online (Sandbox Code Playgroud)
{
"stackTrace": [
[
"/var/task/lambda_function.py",
14,
"lambda_handler",
"message = event['Records'][0]['Sns']['Message']['Trigger']['Dimensions']['name']"
]
],
"errorType": "TypeError",
"errorMessage": "string indices must be integers"
}
Run Code Online (Sandbox Code Playgroud)
所以有3个问题:
问题 1:在您的示例事件中,['Records'][0]['Sns']['Message']是strJSON 格式。这意味着您需要解析为这样的字典:
message = event['Records'][0]['Sns']['Message']
message = json.loads(message)
Run Code Online (Sandbox Code Playgroud)
问题 2: message['Trigger']['Dimensions']是 alist但您试图访问它,就像它是dict. 因此,您只需要将代码更改为:
message = message['Trigger']['Dimensions'][0]['name']
Run Code Online (Sandbox Code Playgroud)
问题 3: Message是 astr这意味着您需要验证它是普通的str还是 json str(否则您将遇到多个结构和类型的问题)。为此,您的代码可能如下所示:
message = event['Records'][0]['Sns']['Message']
if isinstance(message, str):
try:
message = json.loads(message)
except Exception as e:
print(e) # Or do nothing, this is just to log the error
elif isinstance(message, list):
message = message[0]
# Maybe evaluate bool, tuple, etc other types
print('RESPONSE', message['Trigger']['Dimensions'][0]['name'] if isinstance(message, dict) else message)
Run Code Online (Sandbox Code Playgroud)
但是,我也建议使其更具可扩展性,迭代您知道的元素list。并且出于安全原因(试图避免空指针异常),请使用get()具有默认值的函数。http://www.tutorialspoint.com/python/dictionary_get.htm。尝试创建一个函数来解析结构并使其可重用。
祝你好运!
| 归档时间: |
|
| 查看次数: |
9438 次 |
| 最近记录: |