From 363dbcbc0e1d875f0385a3015c13eaf8ba8c77a9 Mon Sep 17 00:00:00 2001 From: "nich.morgan" Date: Wed, 20 Sep 2023 11:28:06 -0300 Subject: [PATCH 1/5] Eventbridge Event Processor --- lambda-events/Cargo.toml | 7 +- lambda-events/src/event/eventbridge/mod.rs | 87 +++++++++++++++++++ lambda-events/src/event/mod.rs | 3 + .../example-eventbridge-event-obj.json | 13 +++ .../fixtures/example-eventbridge-event.json | 13 +++ 5 files changed, 122 insertions(+), 1 deletion(-) create mode 100644 lambda-events/src/event/eventbridge/mod.rs create mode 100644 lambda-events/src/fixtures/example-eventbridge-event-obj.json create mode 100644 lambda-events/src/fixtures/example-eventbridge-event.json diff --git a/lambda-events/Cargo.toml b/lambda-events/Cargo.toml index 27b577cb..971b2dca 100644 --- a/lambda-events/Cargo.toml +++ b/lambda-events/Cargo.toml @@ -30,7 +30,10 @@ chrono = { version = "0.4.23", default-features = false, features = [ "serde", "std", ], optional = true } -query_map = { version = "^0.7", features = ["serde", "url-query"], optional = true } +query_map = { version = "^0.7", features = [ + "serde", + "url-query", +], optional = true } flate2 = { version = "1.0.24", optional = true } [features] @@ -72,6 +75,7 @@ default = [ "sns", "sqs", "streams", + "eventbridge", ] activemq = [] @@ -112,3 +116,4 @@ ses = ["chrono"] sns = ["chrono", "serde_with"] sqs = ["serde_with"] streams = [] +eventbridge = ["chrono", "serde_with"] diff --git a/lambda-events/src/event/eventbridge/mod.rs b/lambda-events/src/event/eventbridge/mod.rs new file mode 100644 index 00000000..7809f1e2 --- /dev/null +++ b/lambda-events/src/event/eventbridge/mod.rs @@ -0,0 +1,87 @@ +use chrono::{DateTime, Utc}; +use serde::de::DeserializeOwned; +use serde::{Deserialize, Serialize}; +use serde_with::serde_as; + +#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] +#[serde(rename_all = "kebab-case")] +pub struct EventBridgeEvent { + #[serde(default)] + pub version: Option, + #[serde(default)] + pub id: Option, + pub detail_type: String, + pub source: String, + #[serde(default)] + pub account: Option, + #[serde(default)] + pub time: Option>, + #[serde(default)] + pub region: Option, + #[serde(default)] + pub resources: Option>, + #[serde(default)] + pub detail: Option, +} + +#[serde_with::serde_as] +#[derive(Clone, Debug, Default, Deserialize, Eq, PartialEq, Serialize)] +#[serde(bound(deserialize = "T: DeserializeOwned"))] +#[serde(rename_all = "kebab-case")] +pub struct EventBridgeEventObj { + #[serde(default)] + pub version: Option, + #[serde(default)] + pub id: Option, + pub detail_type: String, + pub source: String, + #[serde(default)] + pub account: Option, + #[serde(default)] + pub time: Option>, + #[serde(default)] + pub region: Option, + #[serde(default)] + pub resources: Option>, + #[serde_as(as = "serde_with::json::JsonString")] + #[serde(bound(deserialize = "T: DeserializeOwned"))] + pub detail: T, +} + +#[cfg(test)] +#[cfg(feature = "eventbridge")] +mod test { + use super::*; + + use serde_json; + + #[test] + fn example_eventbridge_obj_event() { + #[derive(Serialize, Deserialize, Debug, Eq, PartialEq)] + struct CustomStruct { + a: String, + b: String, + } + + let data = include_bytes!("../../fixtures/example-eventbridge-event-obj.json"); + let parsed: EventBridgeEventObj = serde_json::from_slice(data).unwrap(); + + assert_eq!(parsed.detail.a, "123"); + assert_eq!(parsed.detail.b, "456"); + + let output: String = serde_json::to_string(&parsed).unwrap(); + let reparsed: EventBridgeEventObj = serde_json::from_slice(output.as_bytes()).unwrap(); + assert_eq!(parsed, reparsed); + } + + #[test] + fn example_eventbridge_event() { + let data = include_bytes!("../../fixtures/example-eventbridge-event.json"); + let parsed: EventBridgeEvent = serde_json::from_slice(data).unwrap(); + assert_eq!(parsed.detail, Some(String::from("String Message"))); + + let output: String = serde_json::to_string(&parsed).unwrap(); + let reparsed: EventBridgeEvent = serde_json::from_slice(output.as_bytes()).unwrap(); + assert_eq!(parsed, reparsed); + } +} diff --git a/lambda-events/src/event/mod.rs b/lambda-events/src/event/mod.rs index 1aa56697..bc876159 100644 --- a/lambda-events/src/event/mod.rs +++ b/lambda-events/src/event/mod.rs @@ -136,3 +136,6 @@ pub mod sqs; /// AWS Lambda event definitions for streams. #[cfg(feature = "streams")] pub mod streams; + +#[cfg(feature = "eventbridge")] +pub mod eventbridge; diff --git a/lambda-events/src/fixtures/example-eventbridge-event-obj.json b/lambda-events/src/fixtures/example-eventbridge-event-obj.json new file mode 100644 index 00000000..97c5e0ae --- /dev/null +++ b/lambda-events/src/fixtures/example-eventbridge-event-obj.json @@ -0,0 +1,13 @@ +{ + "version": "0", + "id": "6a7e8feb-b491-4cf7-a9f1-bf3703467718", + "detail-type": "EC2 Instance State-change Notification", + "source": "aws.ec2", + "account": "111122223333", + "time": "2017-12-22T18:43:48Z", + "region": "us-west-1", + "resources": [ + "arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0" + ], + "detail": "{\"a\":\"123\",\"b\":\"456\"}" +} diff --git a/lambda-events/src/fixtures/example-eventbridge-event.json b/lambda-events/src/fixtures/example-eventbridge-event.json new file mode 100644 index 00000000..793ca8dc --- /dev/null +++ b/lambda-events/src/fixtures/example-eventbridge-event.json @@ -0,0 +1,13 @@ +{ + "version": "0", + "id": "6a7e8feb-b491-4cf7-a9f1-bf3703467718", + "detail-type": "EC2 Instance State-change Notification", + "source": "aws.ec2", + "account": "111122223333", + "time": "2017-12-22T18:43:48Z", + "region": "us-west-1", + "resources": [ + "arn:aws:ec2:us-west-1:123456789012:instance/i-1234567890abcdef0" + ], + "detail": "String Message" +} From bce30ba0d83da0ceeb4e60d9258f346ad173700c Mon Sep 17 00:00:00 2001 From: Morgan Nicholson <55922364+nichmorgan@users.noreply.github.com> Date: Thu, 12 Oct 2023 16:25:21 -0300 Subject: [PATCH 2/5] cfg feature fix --- lambda-events/src/event/mod.rs | 1 + lambda-events/src/lib.rs | 3 +++ 2 files changed, 4 insertions(+) diff --git a/lambda-events/src/event/mod.rs b/lambda-events/src/event/mod.rs index bc876159..6ac57c5d 100644 --- a/lambda-events/src/event/mod.rs +++ b/lambda-events/src/event/mod.rs @@ -137,5 +137,6 @@ pub mod sqs; #[cfg(feature = "streams")] pub mod streams; +/// AWS Lambda event definitions for EventBridge. #[cfg(feature = "eventbridge")] pub mod eventbridge; diff --git a/lambda-events/src/lib.rs b/lambda-events/src/lib.rs index 564debd7..7591572d 100644 --- a/lambda-events/src/lib.rs +++ b/lambda-events/src/lib.rs @@ -159,3 +159,6 @@ pub use event::sqs; /// AWS Lambda event definitions for streams. #[cfg(feature = "streams")] pub use event::streams; + +#[cfg(feature = "eventbridge")] +pub use event::eventbridge; From 771e0a079e4a01d20c24195883166052ed20311f Mon Sep 17 00:00:00 2001 From: Morgan Nicholson <55922364+nichmorgan@users.noreply.github.com> Date: Thu, 12 Oct 2023 16:26:02 -0300 Subject: [PATCH 3/5] feature comment --- lambda-events/src/lib.rs | 1 + 1 file changed, 1 insertion(+) diff --git a/lambda-events/src/lib.rs b/lambda-events/src/lib.rs index 7591572d..83b66713 100644 --- a/lambda-events/src/lib.rs +++ b/lambda-events/src/lib.rs @@ -160,5 +160,6 @@ pub use event::sqs; #[cfg(feature = "streams")] pub use event::streams; +/// AWS Lambda event definitions for EventBridge. #[cfg(feature = "eventbridge")] pub use event::eventbridge; From 47aa6391776723785c14cc8d2ee1a55699199680 Mon Sep 17 00:00:00 2001 From: erso Date: Wed, 18 Oct 2023 07:10:38 -0300 Subject: [PATCH 4/5] Removed whitespace --- lambda-events/Cargo.toml | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lambda-events/Cargo.toml b/lambda-events/Cargo.toml index 971b2dca..107d953f 100644 --- a/lambda-events/Cargo.toml +++ b/lambda-events/Cargo.toml @@ -30,10 +30,7 @@ chrono = { version = "0.4.23", default-features = false, features = [ "serde", "std", ], optional = true } -query_map = { version = "^0.7", features = [ - "serde", - "url-query", -], optional = true } +query_map = { version = "^0.7", features = [ "serde","url-query",], optional = true } flate2 = { version = "1.0.24", optional = true } [features] From 1165ba67e4fccba81a488bddf9297da9810f79e2 Mon Sep 17 00:00:00 2001 From: Morgan Nicholson <55922364+nichmorgan@users.noreply.github.com> Date: Thu, 19 Oct 2023 10:08:13 -0300 Subject: [PATCH 5/5] makefile fix --- Makefile | 1 + 1 file changed, 1 insertion(+) diff --git a/Makefile b/Makefile index 544d08b7..58eb2a9c 100644 --- a/Makefile +++ b/Makefile @@ -101,6 +101,7 @@ check-event-features: cargo test --package aws_lambda_events --no-default-features --features sns cargo test --package aws_lambda_events --no-default-features --features sqs cargo test --package aws_lambda_events --no-default-features --features streams + cargo test --package aws_lambda_events --no-default-features --features eventbridge fmt: cargo +nightly fmt --all \ No newline at end of file