tracing_s3/
config.rs

1use aws_credential_types::Credentials;
2use aws_sdk_s3::Client;
3use aws_types::region::Region;
4use dotenv::dotenv;
5use std::env;
6
7#[derive(Debug)]
8pub struct CurrentLogObject {
9    pub path: String,
10    pub size: usize,
11}
12
13#[derive(Debug)]
14pub struct Config {
15    pub aws_client: Client,
16    pub bucket: String,
17    pub prefix: String,
18    pub object_size_limit_mb: usize,
19    pub cron_interval_in_ms: usize,
20}
21
22pub struct ObjectSizeLimitMb(pub usize);
23pub struct CronIntervalInMs(pub usize);
24pub struct Bucket<'a>(pub Option<&'a str>);
25pub struct Prefix<'a>(pub &'a str);
26pub struct Endpoint<'a>(pub Option<&'a str>);
27
28impl Config {
29    pub async fn new<'a>(
30        aws_region: Option<&str>,
31        aws_access_key: Option<&str>,
32        aws_secret_access_key: Option<&str>,
33        bucket: Bucket<'a>,
34        prefix: Prefix<'a>,
35        endpoint: Endpoint<'a>,
36        object_size_limit_mb: ObjectSizeLimitMb,
37        cron_interval_in_ms: CronIntervalInMs,
38    ) -> anyhow::Result<Self> {
39        dotenv().ok();
40        let region = Region::new(
41            aws_region
42                .unwrap_or(&env::var("S3_TRACING_AWS_REGION").unwrap_or("us-east-1".to_string()))
43                .to_string(),
44        );
45        let bucket = match bucket.0 {
46            Some(bucket) => bucket.to_string(),
47            None => env::var("S3_TRACING_BUCKET")?,
48        };
49        let aws_access_key = match aws_access_key {
50            Some(access_key) => access_key.to_string(),
51            None => env::var("S3_TRACING_AWS_ACCESS_KEY_ID")?,
52        };
53        let aws_secret_access_key = match aws_secret_access_key {
54            Some(secret_access_key) => secret_access_key.to_string(),
55            None => env::var("S3_TRACING_AWS_SECRET_ACCESS_KEY")?,
56        };
57        let credentials =
58            Credentials::new(aws_access_key, aws_secret_access_key, None, None, "AWS");
59        // let cred_provider = SharedCredentialsProvider::new(credentials);
60        let mut config_builder = aws_sdk_s3::Config::builder()
61            .behavior_version_latest()
62            .credentials_provider(credentials.clone())
63            .express_credentials_provider(credentials)
64            .region(region);
65        config_builder = match endpoint.0 {
66            Some(endpoint) => config_builder.endpoint_url(endpoint),
67            None => config_builder,
68        };
69        let config = config_builder.build();
70        let aws_client = Client::from_conf(config);
71        Ok(Self {
72            aws_client,
73            bucket,
74            prefix: prefix.0.to_string(),
75            object_size_limit_mb: object_size_limit_mb.0,
76            cron_interval_in_ms: cron_interval_in_ms.0,
77        })
78    }
79}