關於 RustFS
由於 RustFS 是完全兼容 S3 的對象存儲系統,因此可以通過對 S3 的 Rust SDK 做一些封裝來構建適用於 RustFS 的 Rust SDK,通過 SDK 對 RustFS 進行操作,包括存儲桶/對象的創建和刪除、文件的上傳和下載等。
前提條件
- 一個可用的 RustFS 實例(可參考安裝指南進行安裝)。
- 訪問密鑰(可參考訪問密鑰管理進行創建)。
RustFS Rust SDK 構造
將 region、access_key_id、secret_access_key 以及 endpoint_url 構造為一個 Config 數據結構,並從環境變量讀取對應信息:
pub struct Config {
pub region: String,
pub access_key_id: String,
pub secret_access_key: String,
pub endpoint_url: String,
}
impl Config {
pub fn from_env() -> Result<Self> {
let region = env::var("RUSTFS_REGION")?;
let access_key_id = env::var("RUSTFS_ACCESS_KEY_ID")?;
let secret_access_key = env::var("RUSTFS_SECRET_ACCESS_KEY")?;
let endpoint_url = env::var("RUSTFS_ENDPOINT_URL")?;
Ok(Config {
region,
access_key_id,
secret_access_key,
endpoint_url,
})
}
}
利用上述構造好的 Config,藉助 aws_sdk_s3::Client 構造 RustFS Client:
let config = Config::from_env()?;
let credentials = Credentials::new(
config.access_key_id,
config.secret_access_key,
None,
None,
"rustfs",
);
let region = Region::new(config.region);
let endpoint_url = config.endpoint_url;
let shard_config = aws_config::defaults(BehaviorVersion::latest())
.region(region)
.credentials_provider(credentials)
.endpoint_url(endpoint_url)
.load()
.await;
let rustfs_client = Client::new(&shard_config);
接着使用構造好的 rustfs_client 進行響應的操作。
創建存儲桶
match rustfs_client
.create_bucket()
.bucket("your-bucket-name")
.send()
.await
{
Ok(_) => {
println!("Bucket created successfully");
}
Err(e) => {
println!("Error creating bucket: {:?}", e);
return Err(e.into());
}
}
刪除存儲桶
match rustfs_client
.delete_bucket()
.bucket("cn-east-1rust-sdk")
.send()
.await
{
Ok(_) => {
println!("Bucket deleted successfully");
}
Err(e) => {
println!("Error deleting bucket: {:?}", e);
return Err(e.into());
}
}
列出存儲桶
match rustfs_client.list_buckets().send().await {
Ok(res) => {
println!("Total buckets number is {:?}", res.buckets().len());
for bucket in res.buckets() {
println!("Bucket: {:?}", bucket.name());
}
}
Err(e) => {
println!("Error listing buckets: {:?}", e);
return Err(e.into());
}
}
列出對象
match rustfs_client
.list_objects_v2()
.bucket("rust-sdk-demo")
.send()
.await
{
Ok(res) => {
println!("Total objects number is {:?}", res.contents().len());
for object in res.contents() {
println!("Object: {:?}", object.key());
}
}
Err(e) => {
println!("Error listing objects: {:?}", e);
return Err(e.into());
}
}
上傳文件
let data = fs::read("/file-path/1.txt").await.expect("can not open the file");
match rustfs_client
.put_object()
.bucket("rust-sdk-demo")
.key("1.txt")
.body(ByteStream::from(data))
.send()
.await
{
Ok(res) => {
println!("Object uploaded successfully, res: {:?}", res);
}
Err(e) => {
println!("Error uploading object: {:?}", e);
return Err(e.into());
}
}
下載對象
match rustfs_client
.get_object()
.bucket("rust-sdk-demo")
.key("1.txt")
.send()
.await
{
Ok(res) => {
println!("Object downloaded successfully, res: {:?}", res);
}
Err(e) => {
println!("Error downloading object: {:?}", e);
return Err(e.into());
}
}
其他的使用,大家可以自行探索,如果藉助 Vibe Coding,就更簡單了!