You need to enable JavaScript to run this app.
文档中心
对象存储

对象存储

复制全文
下载 pdf
存储桶复制
PutBucketReplication(Rust SDK)
复制全文
下载 pdf
PutBucketReplication(Rust SDK)
put_bucket_replication 接口用于为存储桶设置跨区域或同区域复制规则,本文介绍如何通过 Rust SDK 的 put_bucket_replication 接口配置对象复制。​
注意事项​
  • 您需要根据实际情况,填写示例代码中的地域和访问域名,详细介绍,请参见 地域和访问域名。​
  • 为了防止密钥泄露,本文示例代码需要从环境变量中读取 Access Key ID 和 Secret Access Key。因此使用 SDK 前,您需要配置长期访问凭证,详细介绍,请参见 配置长期访问凭证。​
  • 分层桶不支持调用 put_bucket_replication。​
  • 跨账号复制前,需先授予源桶读权限与目标桶写权限。​
权限说明​
火山引擎主账号默认拥有全部权限,但是 IAM 用户默认没有任何权限。如果您需要使用子账号执行 put_bucket_replication 操作,火山引擎主账号需通过 IAM策略和桶策略为该子账号授予以下权限:​
tos:PutBucketReplication​
代码示例​
创建复制规则时指定多个前缀​
​
use async_trait::async_trait;​
use futures_core::future::BoxFuture;​
use std::env;​
use std::future::Future;​
use std::time::Duration;​
use tokio::runtime::Handle;​
use ve_tos_rust_sdk::common::init_tracing_log;​
use ve_tos_rust_sdk::asynchronous::bucket::BucketAPI;​
use ve_tos_rust_sdk::asynchronous::tos;​
use ve_tos_rust_sdk::asynchronous::tos::AsyncRuntime;​
use ve_tos_rust_sdk::bucket::{PutBucketReplicationInput, ReplicationRule, Destination };​
use ve_tos_rust_sdk::enumeration::{StatusType};​
​
#[derive(Debug, Default)]​
pub struct TokioRuntime {}​
​
#[async_trait]​
impl AsyncRuntime for TokioRuntime {​
type JoinError = tokio::task::JoinError;​
async fn sleep(&self, duration: Duration) {​
tokio::time::sleep(duration).await;​
}​
​
fn spawn<'a, F>(&self, future: F) -> BoxFuture<'a, Result<F::Output, Self::JoinError>>​
where​
F: Future + Send + 'static,​
F::Output: Send + 'static,​
{​
Box::pin(Handle::current().spawn(future))​
}​
​
fn block_on<F: Future>(&self, future: F) -> F::Output {​
Handle::current().block_on(future)​
}​
}​
​
#[tokio::main]​
async fn main() {​
let _guard = init_tracing_log("info", "temp/logs", "app.log");​
​
let ak = env::var("TOS_ACCESS_KEY").unwrap_or("".to_string());​
let sk = env::var("TOS_SECRET_KEY").unwrap_or("".to_string());​
let endpoint = "https://tos-cn-beijing.volces.com";​
let region = "cn-beijing";​
let client = tos::builder::<TokioRuntime>()​
.connection_timeout(3000)​
.request_timeout(10000)​
.max_retry_count(3)​
.ak(ak)​
.sk(sk)​
.region(region)​
.endpoint(endpoint)​
.build().unwrap();​
​
// 指定多个前缀的复制规则​
let mut input = PutBucketReplicationInput::new("source-bucket", "ServiceRoleforReplicationAccessTOS");​
let mut rule = ReplicationRule::new("multi-prefix-rule");​
rule.set_status(StatusType::StatusEnabled);​
rule.set_historical_object_replication(StatusType::StatusEnabled);​
rule.set_prefix_set(vec!["prefix1/".to_string(), "prefix2/".to_string()]);​
let dest = Destination::new("target-bucket", "cn-beijing");​
rule.set_destination(dest);​
input.add_rule(rule);​
​
let result = client.put_bucket_replication(&input).await;​
match result {​
Ok(_) => println!("带多个前缀的复制规则设置成功"),​
Err(e) => eprintln!("带多个前缀的复制规则设置失败: {:?}", e)​
}​
}​
​
​
设置复制规则的存储类型和继承策略​
​
use async_trait::async_trait;​
use futures_core::future::BoxFuture;​
use std::env;​
use std::future::Future;​
use std::time::Duration;​
use tokio::runtime::Handle;​
use ve_tos_rust_sdk::common::init_tracing_log;​
use ve_tos_rust_sdk::asynchronous::bucket::BucketAPI;​
use ve_tos_rust_sdk::asynchronous::tos;​
use ve_tos_rust_sdk::asynchronous::tos::AsyncRuntime;​
use ve_tos_rust_sdk::bucket::{PutBucketReplicationInput, ReplicationRule, Destination };​
use ve_tos_rust_sdk::enumeration::{StatusType, StorageClassType, StorageClassInheritDirectiveType};​
​
#[derive(Debug, Default)]​
pub struct TokioRuntime {}​
​
#[async_trait]​
impl AsyncRuntime for TokioRuntime {​
type JoinError = tokio::task::JoinError;​
async fn sleep(&self, duration: Duration) {​
tokio::time::sleep(duration).await;​
}​
​
fn spawn<'a, F>(&self, future: F) -> BoxFuture<'a, Result<F::Output, Self::JoinError>>​
where​
F: Future + Send + 'static,​
F::Output: Send + 'static,​
{​
Box::pin(Handle::current().spawn(future))​
}​
​
fn block_on<F: Future>(&self, future: F) -> F::Output {​
Handle::current().block_on(future)​
}​
}​
​
#[tokio::main]​
async fn main() {​
let _guard = init_tracing_log("info", "temp/logs", "app.log");​
​
let ak = env::var("TOS_ACCESS_KEY").unwrap_or("".to_string());​
let sk = env::var("TOS_SECRET_KEY").unwrap_or("".to_string());​
let endpoint = "https://tos-cn-beijing.volces.com";​
let region = "cn-beijing";​
let client = tos::builder::<TokioRuntime>()​
.connection_timeout(3000)​
.request_timeout(10000)​
.max_retry_count(3)​
.ak(ak)​
.sk(sk)​
.region(region)​
.endpoint(endpoint)​
.build().unwrap();​
​
// 设置存储类型和继承策略的复制规则​
let mut input = PutBucketReplicationInput::new("source-bucket", "ServiceRoleforReplicationAccessTOS");​
let mut rule = ReplicationRule::new("storage-class-rule");​
rule.set_status(StatusType::StatusEnabled);​
rule.set_historical_object_replication(StatusType::StatusEnabled);​
let mut dest = Destination::new("target-bucket", "cn-beijing");​
dest.set_storage_class(StorageClassType::StorageClassIa);​
dest.set_storage_class_inherit_directive(StorageClassInheritDirectiveType::StorageClassIDSourceObject);​
rule.set_destination(dest);​
input.add_rule(rule);​
​
let result = client.put_bucket_replication(&input).await;​
match result {​
Ok(_) => println!("带存储类型和继承策略的复制规则设置成功"),​
Err(e) => eprintln!("带存储类型和继承策略的复制规则设置失败: {:?}", e)​
}​
}​
​
​
设置存储桶的跨区域复制规则​
​
use async_trait::async_trait;​
use futures_core::future::BoxFuture;​
use std::env;​
use std::future::Future;​
use std::time::Duration;​
use tokio::runtime::Handle;​
use ve_tos_rust_sdk::common::init_tracing_log;​
use ve_tos_rust_sdk::asynchronous::bucket::BucketAPI;​
use ve_tos_rust_sdk::asynchronous::tos;​
use ve_tos_rust_sdk::asynchronous::tos::AsyncRuntime;​
use ve_tos_rust_sdk::bucket::{PutBucketReplicationInput, ReplicationRule, Destination};​
use ve_tos_rust_sdk::enumeration::StatusType;​
​
#[derive(Debug, Default)]​
pub struct TokioRuntime {}​
​
#[async_trait]​
impl AsyncRuntime for TokioRuntime {​
type JoinError = tokio::task::JoinError;​
async fn sleep(&self, duration: Duration) {​
tokio::time::sleep(duration).await;​
}​
​
fn spawn<'a, F>(&self, future: F) -> BoxFuture<'a, Result<F::Output, Self::JoinError>>​
where​
F: Future + Send + 'static,​
F::Output: Send + 'static,​
{​
Box::pin(Handle::current().spawn(future))​
}​
​
fn block_on<F: Future>(&self, future: F) -> F::Output {​
Handle::current().block_on(future)​
}​
}​
​
#[tokio::main]​
async fn main() {​
let _guard = init_tracing_log("info", "temp/logs", "app.log");​
​
let ak = env::var("TOS_ACCESS_KEY").unwrap_or("".to_string());​
let sk = env::var("TOS_SECRET_KEY").unwrap_or("".to_string());​
let endpoint = "https://tos-cn-beijing.volces.com";​
let region = "cn-beijing";​
let client = tos::builder::<TokioRuntime>()​
.connection_timeout(3000)​
.request_timeout(10000)​
.max_retry_count(3)​
.ak(ak)​
.sk(sk)​
.region(region)​
.endpoint(endpoint)​
.build().unwrap();​
​
// 设置跨区域复制规则​
let mut input = PutBucketReplicationInput::new("source-bucket", "ServiceRoleforReplicationAccessTOS");​
let mut rule = ReplicationRule::new("cross-region-rule");​
rule.set_status(StatusType::StatusEnabled);​
rule.set_historical_object_replication(StatusType::StatusEnabled);​
let dest = Destination::new("target-bucket", "cn-shanghai");​
rule.set_destination(dest);​
input.add_rule(rule);​
​
let result = client.put_bucket_replication(&input).await;​
match result {​
Ok(_) => println!("跨区域复制规则设置成功"),​
Err(e) => eprintln!("跨区域复制规则设置失败: {:?}", e)​
}​
}​
​
​
相关文档​
关于 PutBucketReplication 的 API 文档,请参见 PutBucketReplication。​
​
最近更新时间:2025.12.22 16:33:48
这个页面对您有帮助吗?
有用
有用
无用
无用