Skip to content

Commit

Permalink
Build AmazonS3builder from environment variables (#2361) (#2536)
Browse files Browse the repository at this point in the history
* Build AmazonS3Builder from env (#2361)

* clippy: use Self instead of AmazonS3Builder

* rustdoc: remove unnecessary bare_url

* Save the current environment setup

* fmt: missing use in documentation
  • Loading branch information
amrltqt committed Aug 20, 2022
1 parent 65cae43 commit 4949a3d
Showing 1 changed file with 78 additions and 0 deletions.
78 changes: 78 additions & 0 deletions object_store/src/aws/mod.rs
Expand Up @@ -347,6 +347,48 @@ impl AmazonS3Builder {
Default::default()
}

/// Fill the [`AmazonS3Builder`] with regular AWS environment variables
///
/// Variables extracted from environment:
/// * AWS_ACCESS_KEY_ID -> access_key_id
/// * AWS_SECRET_ACCESS_KEY -> secret_access_key
/// * AWS_DEFAULT_REGION -> region
/// * AWS_ENDPOINT -> endpoint
/// * AWS_SESSION_TOKEN -> token
/// # Example
/// ```
/// use object_store::aws::AmazonS3Builder;
///
/// let s3 = AmazonS3Builder::from_env()
/// .with_bucket_name("foo")
/// .build();
/// ```
pub fn from_env() -> Self {
let mut builder: Self = Default::default();

if let Ok(access_key_id) = std::env::var("AWS_ACCESS_KEY_ID") {
builder.access_key_id = Some(access_key_id);
}

if let Ok(secret_access_key) = std::env::var("AWS_SECRET_ACCESS_KEY") {
builder.secret_access_key = Some(secret_access_key);
}

if let Ok(secret) = std::env::var("AWS_DEFAULT_REGION") {
builder.region = Some(secret);
}

if let Ok(endpoint) = std::env::var("AWS_ENDPOINT") {
builder.endpoint = Some(endpoint);
}

if let Ok(token) = std::env::var("AWS_SESSION_TOKEN") {
builder.token = Some(token);
}

builder
}

/// Set the AWS Access Key (required)
pub fn with_access_key_id(mut self, access_key_id: impl Into<String>) -> Self {
self.access_key_id = Some(access_key_id.into());
Expand Down Expand Up @@ -574,6 +616,42 @@ mod tests {
}};
}

#[test]
fn s3_test_config_from_env() {
let aws_access_key_id = env::var("AWS_ACCESS_KEY_ID")
.unwrap_or("object_store:fake_access_key_id".into());
let aws_secret_access_key = env::var("AWS_SECRET_ACCESS_KEY")
.unwrap_or("object_store:fake_secret_key".into());

let aws_default_region = env::var("AWS_DEFAULT_REGION")
.unwrap_or("object_store:fake_default_region".into());

let aws_endpoint =
env::var("AWS_ENDPOINT").unwrap_or("object_store:fake_endpoint".into());
let aws_session_token = env::var("AWS_SESSION_TOKEN")
.unwrap_or("object_store:fake_session_token".into());

// required
env::set_var("AWS_ACCESS_KEY_ID", &aws_access_key_id);
env::set_var("AWS_SECRET_ACCESS_KEY", &aws_secret_access_key);
env::set_var("AWS_DEFAULT_REGION", &aws_default_region);

// optional
env::set_var("AWS_ENDPOINT", &aws_endpoint);
env::set_var("AWS_SESSION_TOKEN", &aws_session_token);

let builder = AmazonS3Builder::from_env();
assert_eq!(builder.access_key_id.unwrap(), aws_access_key_id.as_str());
assert_eq!(
builder.secret_access_key.unwrap(),
aws_secret_access_key.as_str()
);
assert_eq!(builder.region.unwrap(), aws_default_region);

assert_eq!(builder.endpoint.unwrap(), aws_endpoint);
assert_eq!(builder.token.unwrap(), aws_session_token);
}

#[tokio::test]
async fn s3_test() {
let config = maybe_skip_integration!();
Expand Down

0 comments on commit 4949a3d

Please sign in to comment.