aws eventbridge sandbox和本地测试事件匹配以及发送自定义事件
参考资料
-
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
sandbox测试事件
eventbridge 接受来自 aws服务、eventbridge 和自定义事件的事件。规则仅匹配所需的事件并将这些事件转发给目标。
确定事件的格式
- 提供 EventBridge 沙盒工具来帮助用户创建和验证事件模式
事件模式匹配
-
要匹配 JSON 结构中的下一级字段,请使用大括号 { }
-
要从 JSON 事件匹配的字符串必须位于方括号 [ ]
有两种方式测试事件模式
- sandbox工具测试
- awscli测试
sandbox工具测试

awscli测试
创建事件模式和编写具体事件
{
"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 json
client = 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 datetime
client = 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}}

浙公网安备 33010602011771号