Skip to content

Commit 953b2d2

Browse files
authored
Fix EventBridge event structures. (#755)
According to the docs, the detail is always a JSON object: https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-events-structure.html Signed-off-by: David Calavera <david.calavera@gmail.com>
1 parent 07430f1 commit 953b2d2

File tree

3 files changed

+24
-66
lines changed

3 files changed

+24
-66
lines changed
Lines changed: 14 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -1,34 +1,15 @@
11
use chrono::{DateTime, Utc};
22
use serde::de::DeserializeOwned;
33
use serde::{Deserialize, Serialize};
4-
use serde_with::serde_as;
54

6-
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
7-
#[serde(rename_all = "kebab-case")]
8-
pub struct EventBridgeEvent {
9-
#[serde(default)]
10-
pub version: Option<String>,
11-
#[serde(default)]
12-
pub id: Option<String>,
13-
pub detail_type: String,
14-
pub source: String,
15-
#[serde(default)]
16-
pub account: Option<String>,
17-
#[serde(default)]
18-
pub time: Option<DateTime<Utc>>,
19-
#[serde(default)]
20-
pub region: Option<String>,
21-
#[serde(default)]
22-
pub resources: Option<Vec<String>>,
23-
#[serde(default)]
24-
pub detail: Option<String>,
25-
}
26-
27-
#[serde_with::serde_as]
5+
/// Parse EventBridge events.
6+
/// Deserialize the event detail into a structure that's `DeserializeOwned`.
7+
///
8+
/// See https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-events-structure.html for structure details.
289
#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)]
2910
#[serde(bound(deserialize = "T: DeserializeOwned"))]
3011
#[serde(rename_all = "kebab-case")]
31-
pub struct EventBridgeEventObj<T: Serialize> {
12+
pub struct EventBridgeEvent<T: Serialize> {
3213
#[serde(default)]
3314
pub version: Option<String>,
3415
#[serde(default)]
@@ -43,7 +24,6 @@ pub struct EventBridgeEventObj<T: Serialize> {
4324
pub region: Option<String>,
4425
#[serde(default)]
4526
pub resources: Option<Vec<String>>,
46-
#[serde_as(as = "serde_with::json::JsonString")]
4727
#[serde(bound(deserialize = "T: DeserializeOwned"))]
4828
pub detail: T,
4929
}
@@ -53,35 +33,24 @@ pub struct EventBridgeEventObj<T: Serialize> {
5333
mod test {
5434
use super::*;
5535

56-
use serde_json;
57-
5836
#[test]
5937
fn example_eventbridge_obj_event() {
6038
#[derive(Serialize, Deserialize, Debug, Eq, PartialEq)]
61-
struct CustomStruct {
62-
a: String,
63-
b: String,
39+
#[serde(rename_all = "kebab-case")]
40+
struct Ec2StateChange {
41+
instance_id: String,
42+
state: String,
6443
}
6544

45+
// Example from https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/monitoring-instance-state-changes.html
6646
let data = include_bytes!("../../fixtures/example-eventbridge-event-obj.json");
67-
let parsed: EventBridgeEventObj<CustomStruct> = serde_json::from_slice(data).unwrap();
47+
let parsed: EventBridgeEvent<Ec2StateChange> = serde_json::from_slice(data).unwrap();
6848

69-
assert_eq!(parsed.detail.a, "123");
70-
assert_eq!(parsed.detail.b, "456");
71-
72-
let output: String = serde_json::to_string(&parsed).unwrap();
73-
let reparsed: EventBridgeEventObj<CustomStruct> = serde_json::from_slice(output.as_bytes()).unwrap();
74-
assert_eq!(parsed, reparsed);
75-
}
76-
77-
#[test]
78-
fn example_eventbridge_event() {
79-
let data = include_bytes!("../../fixtures/example-eventbridge-event.json");
80-
let parsed: EventBridgeEvent = serde_json::from_slice(data).unwrap();
81-
assert_eq!(parsed.detail, Some(String::from("String Message")));
49+
assert_eq!("i-abcd1111", parsed.detail.instance_id);
50+
assert_eq!("pending", parsed.detail.state);
8251

8352
let output: String = serde_json::to_string(&parsed).unwrap();
84-
let reparsed: EventBridgeEvent = serde_json::from_slice(output.as_bytes()).unwrap();
53+
let reparsed: EventBridgeEvent<Ec2StateChange> = serde_json::from_slice(output.as_bytes()).unwrap();
8554
assert_eq!(parsed, reparsed);
8655
}
8756
}
Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
{
2-
"version": "0",
3-
"id": "6a7e8feb-b491-4cf7-a9f1-bf3703467718",
2+
"id": "7bf73129-1428-4cd3-a780-95db273d1602",
43
"detail-type": "EC2 Instance State-change Notification",
54
"source": "aws.ec2",
6-
"account": "111122223333",
7-
"time": "2017-12-22T18:43:48Z",
8-
"region": "us-west-1",
5+
"account": "123456789012",
6+
"time": "2021-11-11T21:29:54Z",
7+
"region": "us-east-1",
98
"resources": [
10-
"arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0"
9+
"arn:aws:ec2:us-east-1:123456789012:instance/i-abcd1111"
1110
],
12-
"detail": "{\"a\":\"123\",\"b\":\"456\"}"
13-
}
11+
"detail": {
12+
"instance-id": "i-abcd1111",
13+
"state": "pending"
14+
}
15+
}

lambda-events/src/fixtures/example-eventbridge-event.json

Lines changed: 0 additions & 13 deletions
This file was deleted.

0 commit comments

Comments
 (0)