aws eventbridge sandbox和本地测试事件匹配以及发送自定义事件

参考资料

sandbox测试事件

eventbridge 接受来自 aws服务、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}}
posted @ 2023-03-17 17:29  zhaojie10  阅读(11)  评论(0)    收藏  举报  来源