108 lines
2.7 KiB
Rust
108 lines
2.7 KiB
Rust
//! Use aws-sdk-s3 directly against post3 (without the post3-sdk wrapper).
|
|
//! Shows the raw configuration needed.
|
|
//!
|
|
//! Prerequisites: post3-server running on localhost:9000
|
|
//! mise run up && mise run dev
|
|
//!
|
|
//! Run:
|
|
//! cargo run -p post3-sdk --example aws_sdk_direct
|
|
|
|
use post3_sdk::aws_sdk_s3;
|
|
|
|
#[tokio::main]
|
|
async fn main() -> anyhow::Result<()> {
|
|
let endpoint = std::env::var("POST3_ENDPOINT")
|
|
.unwrap_or_else(|_| "http://localhost:9000".to_string());
|
|
|
|
// Configure aws-sdk-s3 manually for post3
|
|
let creds = aws_sdk_s3::config::Credentials::new(
|
|
"test", // access key (any value works when auth is disabled)
|
|
"test", // secret key
|
|
None, // session token
|
|
None, // expiry
|
|
"example", // provider name
|
|
);
|
|
|
|
let config = aws_sdk_s3::Config::builder()
|
|
.behavior_version_latest()
|
|
.region(aws_sdk_s3::config::Region::new("us-east-1"))
|
|
.endpoint_url(&endpoint)
|
|
.credentials_provider(creds)
|
|
.force_path_style(true) // Required: post3 uses path-style, not virtual-hosted
|
|
.build();
|
|
|
|
let client = aws_sdk_s3::Client::from_conf(config);
|
|
|
|
// Create bucket
|
|
println!("Creating bucket...");
|
|
client
|
|
.create_bucket()
|
|
.bucket("direct-bucket")
|
|
.send()
|
|
.await?;
|
|
|
|
// Put object
|
|
println!("Putting object...");
|
|
client
|
|
.put_object()
|
|
.bucket("direct-bucket")
|
|
.key("greeting.txt")
|
|
.body(Vec::from(&b"Hello from aws-sdk-s3!"[..]).into())
|
|
.send()
|
|
.await?;
|
|
|
|
// Get object
|
|
let resp = client
|
|
.get_object()
|
|
.bucket("direct-bucket")
|
|
.key("greeting.txt")
|
|
.send()
|
|
.await?;
|
|
let body = resp.body.collect().await?.into_bytes();
|
|
println!("Got: {}", String::from_utf8_lossy(&body));
|
|
|
|
// List objects
|
|
let list = client
|
|
.list_objects_v2()
|
|
.bucket("direct-bucket")
|
|
.send()
|
|
.await?;
|
|
println!("Objects:");
|
|
for obj in list.contents() {
|
|
println!(
|
|
" {} ({} bytes)",
|
|
obj.key().unwrap_or("?"),
|
|
obj.size().unwrap_or(0)
|
|
);
|
|
}
|
|
|
|
// Head object
|
|
let head = client
|
|
.head_object()
|
|
.bucket("direct-bucket")
|
|
.key("greeting.txt")
|
|
.send()
|
|
.await?;
|
|
println!(
|
|
"Head: size={}, etag={:?}",
|
|
head.content_length().unwrap_or(0),
|
|
head.e_tag()
|
|
);
|
|
|
|
// Cleanup
|
|
client
|
|
.delete_object()
|
|
.bucket("direct-bucket")
|
|
.key("greeting.txt")
|
|
.send()
|
|
.await?;
|
|
client
|
|
.delete_bucket()
|
|
.bucket("direct-bucket")
|
|
.send()
|
|
.await?;
|
|
println!("Done!");
|
|
|
|
Ok(())
|
|
}
|