From 69fcc94751bfc315ac32cd84eddb64461ae73fe8 Mon Sep 17 00:00:00 2001 From: "R. Tyler Croy" Date: Sat, 26 Aug 2023 23:19:50 -0700 Subject: [PATCH] Switch to looking for the all ObjectCreated events In the case of objects replicated from an S3 snapshot, those show up with `ObjectCreated:CompletedMultipartUpload` --- Cargo.toml | 1 + src/main.rs | 41 ++++++----------------------------------- 2 files changed, 7 insertions(+), 35 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 634cfdc..e73149d 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -16,6 +16,7 @@ chrono = "0.4.26" handlebars = "4.3.7" lambda_runtime = "0.8.1" +log = "0.4.20" pretty_env_logger = "0.5.0" routefinder = "0.5.3" serde_json = "1.0.105" diff --git a/src/main.rs b/src/main.rs index 11e176d..f5476b0 100644 --- a/src/main.rs +++ b/src/main.rs @@ -2,8 +2,9 @@ use aws_lambda_events::event::s3::{S3Entity, S3Event}; use aws_sdk_s3::Client as S3Client; use handlebars::Handlebars; use lambda_runtime::{run, service_fn, Error, LambdaEvent}; +use log::*; use routefinder::Router; -use tracing::*; +//use tracing::*; use std::collections::HashMap; @@ -22,7 +23,7 @@ async fn function_handler(event: LambdaEvent, client: &S3Client) -> Res for entity in entities_from(event.payload)? { debug!("Processing {entity:?}"); - if let Some(source_key) = entity.object.url_decoded_key { + if let Some(source_key) = entity.object.key { let parameters = add_builtin_parameters(captured_parameters(&router, &source_key)?); let output_key = hb.render("output", ¶meters)?; info!("Copying {source_key:?} to {output_key:?}"); @@ -70,25 +71,12 @@ async fn main() -> Result<(), Error> { */ fn entities_from(event: S3Event) -> Result, anyhow::Error> { - let expected_event = Some("ObjectCreated:Put".into()); Ok(event .records .into_iter() - // only bother with the record if the eventName is `objectCreated:Put` // only bother with the record if the key is present - .filter(|record| record.event_name == expected_event && record.s3.object.key.is_some()) - .map(|record| { - let mut entity = record.s3; - info!("Mapping the entity: {entity:?}"); - /* - * For whatever reasson aws_lambda_events doesn't properly make this url_decoded_key - * actually available - */ - if let Ok(decoded) = urlencoding::decode(&entity.object.key.as_ref().unwrap()) { - entity.object.url_decoded_key = Some(decoded.into_owned()); - } - entity - }) + .filter(|r| r.s3.object.key.is_some()) + .map(|r| r.s3) .collect()) } @@ -159,24 +147,7 @@ mod tests { let event = load_test_event()?; let objects = entities_from(event)?; assert_eq!(objects.len(), 1); - assert!(objects[0].object.url_decoded_key.is_some()); - - if let Some(key) = &objects[0].object.url_decoded_key { - assert_eq!(key, "test/key"); - } else { - assert!(false, "Failed to decode the key properly"); - } - - Ok(()) - } - - #[test] - fn entities_from_with_nonput() -> Result<(), anyhow::Error> { - let mut event = load_test_event()?; - event.records[0].event_name = Some("s3:ObjectRemoved:Delete".into()); - - let objects = entities_from(event)?; - assert_eq!(objects.len(), 0); + assert!(objects[0].object.key.is_some()); Ok(()) }