使用 AWSSDK.S3 将文件上传到带有 .net-core 的 IBM COS(兼容 S3)

Using AWSSDK.S3 to upload files to IBM COS (S3 compatible) with .net-core

我有一些代码使用 AWSSDK.S3 将数据上传到 S3,没什么神秘的。

由于 IBM 声称它是 Cloud Object Storage to be S3 compatible,因此只需更改位于 appsettings.json?

的 ServiceURL,就可以使用 AWSSDK.S3 将文件上传到 IBM COS

以前有人这样做过吗?

我不确定 appsettings.json 但是是的,如果您将 ServiceURL 设置为用于创建客户端的配置,它应该可以透明地工作。显然,COS 不支持的任何 AWS 功能都无法使用,并且任何 COS 扩展(如 API key auth 或 Key Protect 等)都将不可用。

类似于:

AmazonS3Config S3Config = new AmazonS3Config {ServiceURL = "https://s3.us.cloud-object-storage.appdomain.cloud"};

string accessKeyId = "<accesskey>";
string secretAccessKey = "<secretkey>"; 

BasicAWSCredentials credentials = new BasicAWSCredentials(accessKeyId, secretAccessKey); 

AmazonS3Client client = new AmazonS3Client(credentials, S3Config);

我能够在 Net Core 3.1.17 后端上使用 AWSSDK.S3。 我的目标是使用 IBM COS(云对象存储)服务:从中读取、写入和删除文件。 使用 AWSDK.S3 是因为目前没有来自 IBM 或其他人的 nuget 包可以帮助我们(开发人员),所以有 2 种方法:

  • 通过 IBM COS 服务(应符合 S3)的 REST API 手动实现所有这些功能(读、写、删除)
  • 尝试使用符合 S3 标准的 AWSSDK.S3 包

多亏了之前的回答,我做了一些研究和改进,这些是使它即使在 Microsoft 的依赖注入下也能工作的步骤。

  1. 在 IBM Cloud 平台中,创建服务凭证,包括 HMAC 凭证。这是一个重要的步骤,它允许您使用 AccessKeyId 和 SecretAccessKey 创建凭据,否则您将看不到它。
  2. 现在在 appsettings.json 添加一个 JSON 这样的
{
   "CosLogs":{
      "ServiceURL":"https://s3.eu-de.cloud-object-storage.appdomain.cloud",
      "AccessKeyId":"youaccessKeyIdTakenFromCredentialServiceDetail",
      "SecretAccessKey":"yourSecreatAccessKeyTakenFromCredentialServiceDetail"
   }
}

请记住,可以从 IBMCLoud endpoint documentation 检索 ServiceUrl,这取决于您决定在何处查找资源的 region/regions。 就我而言,因为我使用的是欧盟德国,所以我的 serviceUrl 是:s3.eu-de.cloud-object-storage.appdomain.cloud

  1. 在Startup.cs中添加以下内容
var awsOptions = configuration.GetAWSOptions("CosLogs");
var accessKeyId = configuration.GetValue<string>("CosLogs:AccessKeyId");
var secretAccessKey = configuration.GetValue<string>("CosLogs:SecretAccessKey");
awsOptions.Credentials = new BasicAWSCredentials(accessKeyId,secretAccessKey);
services.AddDefaultAWSOptions(awsOptions);
services.AddAWSService<IAmazonS3>();
  1. 使用 DI 在 类 上使用它。示例:
/// <summary>
///     The S3 Client (COS is S3 compatible)
// </summary>
private readonly IAmazonS3 s3Client;

public CosService(IAmazonS3 s3Client, ILogger<CosService> logger)
        {            
            this.s3Client = s3Client;
            this.logger = logger;
        }

public async Task DoCosCallAsync(CancellationToken cancellationToken){
  var bucketList= await s3Client.ListBucketsAsync(cancellationToken);
}

已安装的相关包:

  • NetCore 3.1.1x
  • AWSSDK.S3 3.7.1.5
  • AWSSDK.Extensions.NETCore.Setup 3.7.0.1