Skip to content

Commit 422869a

Browse files
authored
Merge pull request #36 from rubytogether/segiddins/fix-lambda
Fix lambda binary running
2 parents 633791b + d94c028 commit 422869a

File tree

1 file changed

+38
-34
lines changed

1 file changed

+38
-34
lines changed

src/bin/kirby-s3.rs

+38-34
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ extern crate serde_json;
44
extern crate kirby;
55

66
use aws_lambda_events::event::s3::S3Event;
7+
use aws_lambda_events::sns::SnsEventObj;
78
use flate2::read::GzDecoder;
89
use lambda_runtime::tracing::{self, info, warn};
910
use lambda_runtime::{Error, LambdaEvent, service_fn};
@@ -13,7 +14,7 @@ use rusoto_s3::*;
1314
use std::io::BufRead;
1415
use std::io::BufReader;
1516
use std::io::Cursor;
16-
use std::io::Read;
17+
use tokio::io::AsyncReadExt;
1718

1819
use kirby::Options;
1920
use kirby::stream_stats;
@@ -35,8 +36,9 @@ async fn read_object(bucket_name: &str, key: &str) -> Box<dyn BufRead> {
3536
result
3637
.body
3738
.unwrap()
38-
.into_blocking_read()
39+
.into_async_read()
3940
.read_to_end(&mut bytes)
41+
.await
4042
.expect("Couldn't read object body stream");
4143

4244
if key.ends_with("gz") {
@@ -58,45 +60,47 @@ async fn write_object(bucket_name: &str, key: &str, body: &str) -> rusoto_s3::Pu
5860
client.put_object(req).await.expect("Couldn't PUT object")
5961
}
6062

61-
async fn func(event: LambdaEvent<S3Event>) -> Result<(), Error> {
63+
async fn func(event: LambdaEvent<SnsEventObj<S3Event>>) -> Result<(), Error> {
6264
let opts = Options {
6365
paths: vec![],
6466
verbose: false,
6567
unknown: false,
6668
};
6769

6870
for record in event.payload.records {
69-
let (bucket_name, url_key) = match (&record.s3.bucket.name, &record.s3.object.key) {
70-
(Some(bucket_name), Some(url_key)) => (bucket_name, url_key),
71-
_ => {
72-
warn!("missing bucket name or key for record {:?}", record);
73-
continue;
74-
}
75-
};
76-
77-
let key = percent_decode(url_key.as_bytes()).decode_utf8()?;
78-
info!(
79-
"{} downloading {}/{}",
80-
time::now_utc().rfc3339(),
81-
bucket_name,
82-
&key
83-
);
84-
let reader = read_object(bucket_name, &key).await;
85-
86-
info!("{} calculating stats...", time::now_utc().rfc3339());
87-
let content = stream_stats(reader, &opts);
88-
89-
let result_key = [&key, ".json"]
90-
.concat()
91-
.replace("fastly_json", "fastly_stats");
92-
info!(
93-
"{} uploading results to {}",
94-
time::now_utc().rfc3339(),
95-
&result_key
96-
);
97-
write_object(bucket_name, &result_key, &json!(content).to_string()).await;
98-
99-
info!("{} done with {}", time::now_utc().rfc3339(), &key);
71+
for record in record.sns.message.records {
72+
let (bucket_name, url_key) = match (&record.s3.bucket.name, &record.s3.object.key) {
73+
(Some(bucket_name), Some(url_key)) => (bucket_name, url_key),
74+
_ => {
75+
warn!("missing bucket name or key for record {:?}", record);
76+
continue;
77+
}
78+
};
79+
80+
let key = percent_decode(url_key.as_bytes()).decode_utf8()?;
81+
info!(
82+
"{} downloading {}/{}",
83+
time::now_utc().rfc3339(),
84+
bucket_name,
85+
&key
86+
);
87+
let reader = read_object(bucket_name, &key).await;
88+
89+
info!("{} calculating stats...", time::now_utc().rfc3339());
90+
let content = stream_stats(reader, &opts);
91+
92+
let result_key = [&key, ".json"]
93+
.concat()
94+
.replace("fastly_json", "fastly_stats");
95+
info!(
96+
"{} uploading results to {}",
97+
time::now_utc().rfc3339(),
98+
&result_key
99+
);
100+
write_object(bucket_name, &result_key, &json!(content).to_string()).await;
101+
102+
info!("{} done with {}", time::now_utc().rfc3339(), &key);
103+
}
100104
}
101105

102106
Ok(())

0 commit comments

Comments
 (0)