You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@arrow.apache.org by tu...@apache.org on 2022/08/20 15:53:54 UTC

[arrow-rs] branch master updated: Build AmazonS3builder from environment variables (#2361) (#2536)

This is an automated email from the ASF dual-hosted git repository.

tustvold pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/arrow-rs.git


The following commit(s) were added to refs/heads/master by this push:
     new 4949a3d02 Build AmazonS3builder from environment variables (#2361) (#2536)
4949a3d02 is described below

commit 4949a3d026bc15dd8320063d9e06fe048d26c6e8
Author: Quentin <am...@gmail.com>
AuthorDate: Sat Aug 20 17:53:50 2022 +0200

    Build AmazonS3builder from environment variables (#2361) (#2536)
    
    * 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
---
 object_store/src/aws/mod.rs | 78 +++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 78 insertions(+)

diff --git a/object_store/src/aws/mod.rs b/object_store/src/aws/mod.rs
index 06d20ccc9..2a1308346 100644
--- a/object_store/src/aws/mod.rs
+++ b/object_store/src/aws/mod.rs
@@ -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());
@@ -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!();