feat: add post3 s3 proxy for postgresql
Signed-off-by: kjuulh <contact@kjuulh.io>
This commit is contained in:
107
crates/post3-sdk/examples/aws_sdk_direct.rs
Normal file
107
crates/post3-sdk/examples/aws_sdk_direct.rs
Normal file
@@ -0,0 +1,107 @@
|
||||
//! 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(())
|
||||
}
|
||||
Reference in New Issue
Block a user