将 .net 上的 AWS 开发工具包与 localstack 结合使用(TransferUtility/S3 - 设置端点)

Ben*_*Ben 5 .net c# amazon-s3 amazon-web-services localstack

我正在运行 localstack ( https://github.com/localstack/localstack ),并且能够使用 aws s3 cli 将文件上传到其中。

我想要做的是将 .NET AWS ADK 与 localstack 结合使用。我想要以下代码将文件上传到 localstack 中:

        using (var tfu = new TransferUtility())
        {
            await tfu.UploadAsync(new TransferUtilityUploadRequest
            {
                Key = key,
                BucketName = bucketName,
                ContentType = document.ContentType,
                Headers = { ["Content-Disposition"] = "attachment; filename=\"test.txt\"" },
                InputStream = stream
            });
        }
Run Code Online (Sandbox Code Playgroud)

我的问题是我不知道如何设置端点以便 SDK 使用 localstack 而不是 aws。显然,您可以AWSEndpointDefinition按照 AWS SDK 文档中所述在 appSettings.config 中进行设置,例如:

<add key="AWSEndpointDefinition" value="C:\Dev\localstack\endpoints.json"/>

但是我不知道这个 endpoints.json 配置应该是什么样子。我尝试使用这个文件:

https://raw.githubusercontent.com/aws/aws-sdk-net/master/sdk/src/Core/endpoints.json

当我这样做时,一旦我新建一个TransferUtility类,我就会得到一个空引用异常 - 这是在我将任何内容指向我的本地堆栈设置之前。

AWS ASK 的版本是 3.3.0。

另一件需要注意的事情是,在文档中的某些地方,暗示配置应该是 xml 文件而不是 json,但是,当我尝试使用 xml 文件时,我在更新时会遇到不同的异常:' TransferUtilityInvalid输入字符串中的字符“<”

小智 5

您可以通过创建 S3 客户端并将其传递给 TransferUtility 构造函数来轻松覆盖它。

var config = new AmazonS3Config { ServiceURL = "http://localhost:4572" };
var s3client = new AmazonS3Client(config);
Run Code Online (Sandbox Code Playgroud)

如果您的本地堆栈对 S3 使用不同的端口,请不要忘记替换 URL。

希望这可以帮助。