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    #[allow(clippy::too_many_arguments)]
30    pub async fn new<'a>(
31        aws_region: Option<&str>,
32        aws_access_key: Option<&str>,
33        aws_secret_access_key: Option<&str>,
34        bucket: Bucket<'a>,
35        prefix: Prefix<'a>,
36        endpoint: Endpoint<'a>,
37        object_size_limit_mb: ObjectSizeLimitMb,
38        cron_interval_in_ms: CronIntervalInMs,
39    ) -> anyhow::Result<Self> {
40        dotenv().ok();
41        let region = Region::new(
42            aws_region
43                .unwrap_or(&env::var("S3_TRACING_AWS_REGION").unwrap_or("us-east-1".to_string()))
44                .to_string(),
45        );
46        let bucket = match bucket.0 {
47            Some(bucket) => bucket.to_string(),
48            None => env::var("S3_TRACING_BUCKET")?,
49        };
50        let aws_access_key = match aws_access_key {
51            Some(access_key) => access_key.to_string(),
52            None => env::var("S3_TRACING_AWS_ACCESS_KEY_ID")?,
53        };
54        let aws_secret_access_key = match aws_secret_access_key {
55            Some(secret_access_key) => secret_access_key.to_string(),
56            None => env::var("S3_TRACING_AWS_SECRET_ACCESS_KEY")?,
57        };
58        let credentials =
59            Credentials::new(aws_access_key, aws_secret_access_key, None, None, "AWS");
60        // let cred_provider = SharedCredentialsProvider::new(credentials);
61        let mut config_builder = aws_sdk_s3::Config::builder()
62            .behavior_version_latest()
63            .credentials_provider(credentials.clone())
64            .express_credentials_provider(credentials)
65            .region(region);
66        config_builder = match endpoint.0 {
67            Some(endpoint) => config_builder.endpoint_url(endpoint),
68            None => config_builder,
69        };
70        let config = config_builder.build();
71        let aws_client = Client::from_conf(config);
72        Ok(Self {
73            aws_client,
74            bucket,
75            prefix: prefix.0.to_string(),
76            object_size_limit_mb: object_size_limit_mb.0,
77            cron_interval_in_ms: cron_interval_in_ms.0,
78        })
79    }
80}