#[cfg(all(feature = "async", feature = "credentials-sts"))]
use std::env;
#[cfg(all(feature = "async", feature = "credentials-sts"))]
use s3::{AsyncTlsRootStore, Auth, Client, CredentialsTlsRootStore};
#[cfg(all(feature = "async", feature = "credentials-sts"))]
fn request_tls_root_store_from_env() -> AsyncTlsRootStore {
match env::var("S3_TLS_ROOT_STORE")
.unwrap_or_default()
.to_ascii_lowercase()
.as_str()
{
"webpki" => AsyncTlsRootStore::WebPki,
"system" => AsyncTlsRootStore::System,
_ => AsyncTlsRootStore::BackendDefault,
}
}
#[cfg(all(feature = "async", feature = "credentials-sts"))]
fn credentials_tls_root_store_from_env() -> CredentialsTlsRootStore {
match env::var("S3_CREDENTIALS_TLS_ROOT_STORE")
.unwrap_or_default()
.to_ascii_lowercase()
.as_str()
{
"webpki" => CredentialsTlsRootStore::WebPki,
"system" => CredentialsTlsRootStore::System,
_ => CredentialsTlsRootStore::BackendDefault,
}
}
#[cfg(all(feature = "async", feature = "credentials-sts"))]
#[allow(clippy::result_large_err)]
#[tokio::main]
async fn main() -> Result<(), s3::Error> {
let endpoint = match env::var("S3_TEST_ENDPOINT") {
Ok(v) => v,
Err(_) => {
eprintln!("Set S3_TEST_ENDPOINT to run this example (e.g. http://127.0.0.1:9000).");
return Ok(());
}
};
let region = env::var("S3_TEST_REGION").unwrap_or_else(|_| "us-east-1".to_string());
let credentials_tls_root_store = credentials_tls_root_store_from_env();
let auth =
match Auth::from_web_identity_env_with_tls_root_store(credentials_tls_root_store).await {
Ok(v) => v,
Err(err) => {
eprintln!("Web identity credentials are not available: {err}");
return Ok(());
}
};
let request_tls_root_store = request_tls_root_store_from_env();
eprintln!(
"Using request TLS root store: {request_tls_root_store:?}; credentials TLS root store: {credentials_tls_root_store:?}"
);
eprintln!(
"Set S3_TLS_ROOT_STORE and S3_CREDENTIALS_TLS_ROOT_STORE to system|webpki|backend-default."
);
let client = Client::builder(&endpoint)?
.region(region)
.auth(auth)
.tls_root_store(request_tls_root_store)
.build()?;
let buckets = client.buckets().list().send().await?;
for bucket in buckets.buckets {
println!("{}", bucket.name);
}
Ok(())
}
#[cfg(not(all(feature = "async", feature = "credentials-sts")))]
fn main() {
eprintln!("This example requires `async` + `credentials-sts`.");
eprintln!("Try: cargo run --example async_auth_web_identity --features credentials-sts");
}