Amazon s3 如果找不到环境变量,如何从文件回退到凭据?

Amazon s3 如果找不到环境变量,如何从文件回退到凭据?,amazon-s3,rust,rusoto,Amazon S3,Rust,Rusoto,如果找不到环境变量,我如何回退以使用已解析文件(config.yml)中的凭据?对于测试,我使用: 外部板条箱rusoto_核心; 外部板条箱rusoto_s3; 使用rusoto_core::credential::ChainProvider; 使用rusoto_core::request::HttpClient; 使用rusoto_core::Region; 使用rusoto_s3::{s3,S3Client}; 使用std::time::{Duration,Instant}; fn mai

如果找不到环境变量,我如何回退以使用已解析文件(
config.yml
)中的凭据?对于测试,我使用:

外部板条箱rusoto_核心;
外部板条箱rusoto_s3;
使用rusoto_core::credential::ChainProvider;
使用rusoto_core::request::HttpClient;
使用rusoto_core::Region;
使用rusoto_s3::{s3,S3Client};
使用std::time::{Duration,Instant};
fn main(){
让mut chain=ChainProvider::new();
设置_超时(持续时间:从_毫秒(200));
让s3client=s3client::使用(
HttpClient::new().expect(“未能创建请求调度程序”),
链条
地区::UsEast1,
);
让我们开始=瞬间::现在();
println!(“在{:?}启动”,启动);
匹配s3client.list_bucket().sync(){
Err(e)=>println!(“列出存储桶时出错:{}”,e),
Ok(bucket)=>println!(“找到的bucket:{:?}”,bucket),
};
println!((“take{:?}”,Instant::now().duration_-since(start));
}
它可以工作,但需要环境变量
AWS\u ACCESS\u KEY\u ID
AWS\u SECRET\u ACCESS\u KEY
。我想对其进行扩展,以便在没有定义环境变量的情况下,可以使用解析文件中的键:

// parse config file
let file = std::fs::File::open("config.yml").expect("Unable to open file");
let yml: Config = match serde_yaml::from_reader(file) {
    Err(err) => {
        println!("Error: {}", err);
        return;
    }
    Ok(yml) => yml,
};
例如,
config.yml
可以是这样的:

---
endpoint: s3.provider
access_key: ACCESS_KEY_ID
secret_key: SECRET_ACCESS_KEY
要使用
config.yml
中的凭据,我可以向
链添加哪些内容,可能类似于:

let config_provider = StaticProvider::new_minimal(yml.access_key, yml.secret_key);

如何优先考虑环境,如果找不到,则使用由
静态提供程序提供的凭据

链提供程序实际上必须检查AWS凭据。第三个是位于用户主目录中的AWS配置文件。但其格式是预先确定的

如果您坚持使用自己的YAML文件,您可以像这样将
EnvironmentProvider
StaticProvider
链接在一起:

/#futures01={package=“futures”,version=“0.1.28”}
//#rusoto_core=“0.41.0”
//#rusoto_s3=“0.41.0”
//#rusoto_凭证=“0.41.1”
使用futures01::future::future;
使用rusoto_core::request::HttpClient;
使用rusoto_core::Region;
使用rusoto_凭证::{
AwsCredentials,
证书错误,
环境提供者,
提供证书,
静态提供者,
};
使用rusoto_s3::{s3,S3Client};
使用std::time::Instant;

struct MyChainProvider为MyChainProvider提供WSCredentials我如何扩展
MyChainProvider
以使用类似
MyChainProvider::new(access\u key,secret\u key)
的内容将密钥作为参数传递,以便以后我可以使用
Box::new(StaticProvider::new\u minimal(self.access\u key,self.secret\u key).credendials())
with out由于需求冲突,无法推断合适的生存期
我更新为
futures=“0.3.0”
并且现在就得到了这个错误:
键入Future=Box;<124^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^必须指定关联类型'Output',有什么想法吗?@nbari很快就加入了
1.39.0
的行列,不是吗?不幸的是,
futures-0.1.x
futures-0.3.0
是不兼容的,而
rusoto
本身仍然依赖于
0.1.x
版本。恐怕您必须先等待更新。@edwardw这不完全正确,您可以同时使用futures 0.3.x和0.1.x,0.3.x甚至包含可选的兼容性功能。更多信息请参见此处:@Raniz good point。我在代码片段中重命名了依赖项,以明确它使用了期货的分支
0.1
。还可以方便地与
0.3
版本一起使用。