使用 C# 从 Azure Blob 复制到 AWS S3

Posted

技术标签:

【中文标题】使用 C# 从 Azure Blob 复制到 AWS S3【英文标题】:Copy from Azure Blob to AWS S3 using C# 【发布时间】:2018-04-02 08:53:15 【问题描述】:

请注意,这是我第一次在 C# 中做任何事情,所以请善待,我可能犯了一些非常基本的错误。 (是的,我知道我不应该对密钥进行硬编码,但会在代码执行我想要的操作时修复它)。

我正在尝试创建一个 Azure 函数,它将任何新项目从 Blob 存储复制到 AWS S3。我已经设法使用本文中的代码从 blob 复制到 blob:https://cmatskas.com/copy-azure-blob-data-between-storage-accounts-using-functions/

我已尝试修改该代码以保存到 AWS S3 存储桶。虽然此代码成功编译并为我提供了成功的日志条目,但它不会复制任何文件。有什么想法吗?

using System;
using System.IO;
using Amazon.S3;
using Amazon.S3.Model;
using Amazon.S3.Transfer;
using Microsoft.Azure;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;

public async static void Run(CloudBlockBlob myBlob, TraceWriter log) 

    await CopyBlob(myBlob, log);


private async static Task CopyBlob(CloudBlockBlob myBlob, TraceWriter log)

    var existingBucketName = "bucketname";
    var keyName = "backup";
    var accessKey = "key";
    var secretKey = "secretkey";

    TransferUtility fileTransferUtility = new TransferUtility(new AmazonS3Client(accessKey,secretKey,Amazon.RegionEndpoint.eu-west-2));

    log.Info("Starting Copy");

    try
        using (var stream = await myBlob.OpenReadAsync())
        
            await fileTransferUtility.UploadAsync(stream, existingBucketName, keyName);
        
        log.Info("Copy completed");

    
    catch(Exception ex)
        log.Error(ex.Message);
        log.Info("Copy failed");
    
    finally
        log.Info("Operation completed");
    

编辑:让它适用于将来发现此问题的任何人。

using System;
using System.IO;
using Amazon.S3;
using Amazon.S3.Model;
using Amazon.S3.Transfer;
using Microsoft.Azure;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Blob;

public async static void Run(CloudBlockBlob myBlob, TraceWriter log) 

    await CopyBlob(myBlob, log);


private async static Task CopyBlob(CloudBlockBlob myBlob, TraceWriter log)

    var existingBucketName = "bucketname";
    var keyName = myBlob.Name;
    var accessKey = "accesskey";
    var secretKey = "secretkey";

    TransferUtility fileTransferUtility = new TransferUtility(new AmazonS3Client(accessKey,secretKey,Amazon.RegionEndpoint.eu-west-2));

    log.Info("Starting Copy");

    try
        using (var stream = await myBlob.OpenReadAsync())
        
            await fileTransferUtility.UploadAsync(stream,existingBucketName,keyName);
        
        log.Info("Copy completed");

    
    catch(Exception ex)
        log.Error(ex.Message);
        log.Info("Copy failed");
    
    finally
        log.Info("Operation completed");
    

【问题讨论】:

您在日志中看到Copy completed 吗? 是的,得到以下日志输出:2017-10-21T19:07:39.907 Function started (Id=a4d8faee-1612-46cc- 8134-1c0b74ec4c2f) 2017-10-21T19:07:40.466 Starting Copy 2017-10-21T19:07:40.466 Function completed (Success, Id=a4d8faee- 1612-46cc-8134-1c0b74ec4c2f, Duration=565ms) 2017-10-21T19:07:41.123 Copy completed 2017-10-21T19:07:41.123 Operation completed 【参考方案1】:

您应该会看到有关此问题的警告,但您的 void 方法可能会导致此处出现问题。

请将您的功能代码更新为以下内容:

public async static Task Run(CloudBlockBlob myBlob, TraceWriter log) 

    await CopyBlob(myBlob, log);

注意从 voidTask 的变化

【讨论】:

以上是关于使用 C# 从 Azure Blob 复制到 AWS S3的主要内容,如果未能解决你的问题,请参考以下文章

C#:使用 Azure.Storage.Blobs 客户端库将 blob 从一个容器移动到另一个容器

使用 Nodejs 将文件从 Azure 存储 blob(容器)复制到 Azure 文件共享

Azure 数据湖:将数据从 Blob 移动到 ADLS 时面临问题

无法将数据从 Snowflake 复制到 Azure Blob

Azure - 复制多个 blob 的触发器

使用 @azure/storage-blob 将 blob 从一个存储帐户复制到另一个