Skip to content

Commit 9eb9126

Browse files
committed
Add support for copying to an output bucket directly
1 parent 12da109 commit 9eb9126

File tree

3 files changed

+27
-16
lines changed

3 files changed

+27
-16
lines changed

Cargo.toml

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,26 @@
11
[package]
22
name = "lambda-s3-restructure"
3-
version = "0.4.0"
3+
version = "0.5.0"
44
edition = "2021"
55
homepage = "https://github.com/buoyant-data/lambda-s3-restructure"
66
authors = [
77
"R Tyler Croy <[email protected]>",
88
]
99

1010
[dependencies]
11-
anyhow = "1.0.75"
11+
anyhow = "=1"
1212
aws-config = { version = "1.5", features = ["behavior-version-latest"]}
13-
aws-sdk-s3 = "1.49"
14-
aws_lambda_events = { version = "0.15.1", default-features = false, features = ["sns", "sqs", "s3"] }
15-
chrono = "0.4.31"
13+
aws-sdk-s3 = "=1"
14+
aws_lambda_events = { version = "0.16", default-features = false, features = ["sns", "sqs", "s3"] }
15+
chrono = "0.4"
1616
liquid = "0.26"
1717
serde = { version = "=1", features = ["rc"] }
18-
lambda_runtime = "0.13.0"
19-
regex = "1.10"
20-
routefinder = "0.5.3"
21-
serde_json = "1.0.105"
18+
lambda_runtime = "0.13"
19+
regex = "=1"
20+
routefinder = "0.5"
21+
serde_json = "=1"
2222
tokio = { version = "1.40", features = ["macros"] }
2323
tracing = { version = "0.1", features = ["log"] }
2424
tracing-subscriber = { version = "0.3", default-features = false, features = ["fmt", "env-filter", "tracing-log"] }
25-
urlencoding = "2.1.3"
25+
urlencoding = "2.1"
2626
url = { version = "2.3", features = ["serde"] }

README.adoc

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,10 @@ The following environment variables must be set for the function to run properly
6666
| _required byt empty by default_
6767
| A link:https://crates.io/crates/liquid[liquid] template which produces a compatible path for outputting the file into the S3 bucket.
6868

69+
| `OUTPUT_BUCKET`
70+
| _optional_
71+
| A _different_ bucket than the source bucket to execute the copy object into
72+
6973
| `EXCLUDE_REGEX`
7074
|
7175
| optional regular expression for keys to exclude from consideration

src/main.rs

Lines changed: 13 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,8 @@ async fn function_handler(
6363
let input_pattern =
6464
std::env::var("INPUT_PATTERN").expect("You must define INPUT_PATTERN in the environment");
6565
let exclude_regex: Option<Regex> = std::env::var("EXCLUDE_REGEX")
66-
.map(|ex| Regex::new(ex.as_ref()).expect("Failed to compile EXCLUDE_REGEX")).ok();
66+
.map(|ex| Regex::new(ex.as_ref()).expect("Failed to compile EXCLUDE_REGEX"))
67+
.ok();
6768
let output_template = std::env::var("OUTPUT_TEMPLATE")
6869
.expect("You must define OUTPUT_TEMPLATE in the environment");
6970

@@ -91,10 +92,11 @@ async fn function_handler(
9192
let output_key = template.render(&parameters)?;
9293
info!("Copying {source_key:?} to {output_key:?}");
9394
if let Some(bucket) = entity.bucket.name {
94-
debug!("Sending a copy request for {bucket} with {source_key} to {output_key}");
95+
let output_bucket = std::env::var("OUTPUT_BUCKET").unwrap_or(bucket.clone());
96+
debug!("Sending a copy request for {output_bucket} with {bucket}/{source_key} to {output_key}");
9597
let result = client
9698
.copy_object()
97-
.bucket(&bucket)
99+
.bucket(&output_bucket)
98100
.copy_source(format!("{bucket}/{source_key}"))
99101
.key(output_key)
100102
.send()
@@ -291,16 +293,21 @@ mod tests {
291293

292294
#[test]
293295
fn test_exclude_regex() {
294-
let exclude = Some(Regex::new(r#"^path\/to\/table.*"#).expect("Failed to compile regular expression"));
296+
let exclude = Some(
297+
Regex::new(r#"^path\/to\/table.*"#).expect("Failed to compile regular expression"),
298+
);
295299
let keys = vec![
296300
"path/to/alpha",
297301
"path/to/bravo/foo.parquet",
298302
"path/to/table",
299303
"path/to/table/foo.parquet",
300304
];
301305

302-
let filtered: Vec<_> = keys.iter().filter(|k| !should_exclude(exclude.as_ref(), k)).map(|k| k.clone()).collect();
306+
let filtered: Vec<_> = keys
307+
.iter()
308+
.filter(|k| !should_exclude(exclude.as_ref(), k))
309+
.map(|k| k.clone())
310+
.collect();
303311
assert_ne!(filtered, keys);
304312
}
305313
}
306-

0 commit comments

Comments
 (0)