参考资料
如何为 EventBridge 规则创建自定义事件模式?
https://docs.aws.amazon.com/cli/latest/reference/events/put-events.html
https://awscli.amazonaws.com/v2/documentation/api/latest/reference/events/test-event-pattern.html
eventbridge 接受来自 aws服务、eventbridge 和自定义事件的事件。规则仅匹配所需的事件并将这些事件转发给目标。
确定事件的格式
事件模式匹配
要匹配 JSON 结构中的下一级字段,请使用大括号 { }
要从 JSON 事件匹配的字符串必须位于方括号 [ ]
有两种方式测试事件模式
创建事件模式和编写具体事件
{"source": ["com.mycompany.myapp"]
}
编写具体事件
{"id": "1","source": "com.mycompany.myapp","detail-type": "myDetailType","account": "123456789012","region": "us-east-1","time": "2017-04-11T20: 11: 04Z"
}
测试事件模式
aws events test-event-pattern --event-pattern "{\"source\":[\"com.mycompany.myapp\"]}" --event "{\"id\":\"1\",\"source\":\"com.mycompany.myapp\",\"detail-type\":\"myDetailType\",\"account\":\"123456789012\",\"region\":\"us-east-1\",\"time\":\"2017-04-11T20:11:04Z\"}"
写成shell函数
// from felix
function transfer(){cat $1 | tr -d '\n' | tr -d '[:blank:]' | sed 's/\"/\\\"/gi'
}
eval $(echo "aws events test-event-pattern --event-pattern \"`transfer /tmp/pattern`\" --event \"`transfer /tmp/event`\" ")
使用python编写相同逻辑测试
import boto3
import jsonclient = boto3.client('events')pattern_raw = {"source": ["com.mycompany.myapp"]
}event_raw = {"id": "1","source": "com.mycompany.myapp","detail-type": "myDetailType","account": "123456789012","region": "us-east-1","time": "2017-04-11T20: 11: 04Z"
}event = json.dumps(event_raw)
pattern = json.dumps(pattern_raw)response = client.test_event_pattern(EventPattern = pattern,Event = event
)print("The pattern match event: "+str(response["Result"]))
创建匹配模式
{"source": ["aws.health"],"detail-type": ["AWS Health Event"]
}
编写自定义事件
[{"id": "1","source": "com.mycompany.myapp","detail-type": "myDetailType","account": "123456789012","region": "cn-north-1","time": "2017-04-11T20: 11: 04Z"}
]
使用cli发送自定义事件
aws events put-events --entries file://event.json
直接发送出现以下报错
$ aws events put-events --entries file://test-custom.json
Parameter validation failed:
Unknown parameter in Entries[0]: "id", must be one of: Time, Source, Resources, DetailType, Detail, EventBusName, TraceHeader
Unknown parameter in Entries[0]: "source", must be one of: Time, Source, Resources, DetailType, Detail, EventBusName, TraceHeader
Unknown parameter in Entries[0]: "detail-type", must be one of: Time, Source, Resources, DetailType, Detail, EventBusName, TraceHeader
Unknown parameter in Entries[0]: "account", must be one of: Time, Source, Resources, DetailType, Detail, EventBusName, TraceHeader
Unknown parameter in Entries[0]: "region", must be one of: Time, Source, Resources, DetailType, Detail, EventBusName, TraceHeader
Unknown parameter in Entries[0]: "time", must be one of: Time, Source, Resources, DetailType, Detail, EventBusName, TraceHeader
根据提示将字段修改为以下
[{"Source": "aws.health","DetailType": "AWS Health Event","Detail": "{\"key1\": \"value1\", \"key2\": \"value2\"}"}
]
再次发送
{"FailedEntryCount": 1,"Entries": [{"ErrorCode": "NotAuthorizedForSourceException","ErrorMessage": "Not authorized for the source."}]
}
该提示表明,我们没有没有权限“冒充”aws服务发送事件,只能发送自定义事件。修改为以下
[{"Source": "personal","DetailType": "AWS Health Event","Detail":"{\"key1\": \"value1\", \"key2\": \"value2\"}"}
]
将cw logs配置为目标,查看收到的事件,自动补全了剩余字段
{"version": "0","id": "bc9185cc-a0db-1144-3e22-bbdd98865e92","detail-type": "AWS Health Event","source": "personal","account": "xxxxxxxx","time": "2023-03-17T09:11:33Z","region": "cn-north-1","resources": [],"detail": {"key1": "value1","key2": "value2"}
}
由于shell发送过于繁琐,因此这里用python再写一遍
import boto3
import json
import datetimeclient = boto3.client('events')time = datetime.datetime(2023, 2, 17)
event1 = {'Time': time,'Source': 'personal','Resources': ["resource1","resource2"],'DetailType': 'AWS Health Event','Detail': "{ \"key1\": \"value3\", \"key2\": \"value4\" }",}event2 = {'Time': time,'Source': 'personal','Resources': ["resource3","resource4"],'DetailType': "AWS Health Event",'Detail': "{ \"key1\": \"value3\", \"key2\": \"value4\" }",}response = client.put_events(Entries=[event1,event2],
)print(response)
发送请求
$ python3 -u "putevetn.py"
{'FailedEntryCount': 0, 'Entries': [{'EventId': 'e0a2a439-3bce-aaaa-1ea1-40a7969ae00b'}, {'EventId': 'd67ffddf-3632-49ce-2c22-f74b162f8342'}], 'ResponseMetadata': {'RequestId': 'f211ba61-ba44-4bfa-8270-d52fd6b4d250', 'HTTPStatusCode': 200, 'HTTPHeaders': {'x-amzn-requestid': 'f211ba61-ba44-4bfa-8270-d52fd6b4d250', 'content-type': 'application/x-amz-json-1.1', 'content-length': '136', 'date': 'Fri, 2 Mar 2023 01:25:12 GMT'}, 'RetryAttempts': 0}}
下一篇:面试准备之数据库基础准备1