Использование AWS SDK в.net с локальным стеком (TransferUtility/S3 - настройка конечной точки)

У меня запущен 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
            });
        }

Моя проблема в том, что я не знаю, как установить конечные точки, чтобы локальный стек использовался SDK, а не aws. Видимо, вы можете установить AWSEndpointDefinition в appSettings.config, как указано в документации AWS SDK, например:

<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 класс, я получаю исключение нулевой ссылки - это прежде, чем я укажу что-либо на мою настройку localstack.

Версия AWS ASK - 3.3.0.

Следует также отметить, что в некоторых местах в документации подразумевается, что конфиг должен быть XML-файлом, а не JSON, однако, когда я пытаюсь использовать XML-файл, я получаю другое исключение при обновлении TransferUtility: 'Недопустимый символ'<'во входной строке'

2 ответа

Вы можете легко переопределить его, создав клиент S3 и передав его конструктору TransferUtility.

var config = new AmazonS3Config { ServiceURL = "http://localhost:4572" };
var s3client = new AmazonS3Client(config);

Не забудьте заменить URL, если ваш локальный стек использует другой порт для S3.

Надеюсь это поможет.

Я знаю, что это более старый пост, но для тех, кто все еще ищет решение или попал в эту ветку, я хотел бы представить инструмент, который может помочь.

Я поддерживаю проект LocalStack.NET, который представляет собой тонкую оболочку AWS SDK.NET. Он предназначен для автоматической настройки целевых конечных точек для использования LocalStack, что упрощает интеграцию приложений .NET с LocalStack.

Благодаря LocalStack.NET вам не нужно вручную задавать конфигурации конечных точек. Библиотека позаботится об этом за вас. Вот простой пример того, как вы можете его использовать:

      public void ConfigureServices(IServiceCollection services)
{
    // Add framework services.
    services.AddMvc();

    services.AddLocalStack(Configuration)
    services.AddDefaultAWSOptions(Configuration.GetAWSOptions());
    services.AddAwsService<IAmazonS3>();
}

Это автоматически устанавливает конечную точку по умолчанию LocalStack для S3. Библиотека также поддерживает другие сервисы AWS, предоставляемые LocalStack.

Более подробное руководство о том, как начать работу с LocalStack.NET, вы можете посмотреть в документации по началу работы .

Кроме того, недавно я подготовил демонстрационное приложение , демонстрирующее бессерверную архитектуру с использованием .NET, AWS и LocalStack. Это может дать дополнительную информацию об интеграции .NET с LocalStack.

Я надеюсь, что это поможет будущим читателям и всем, кто хочет интегрировать .NET с LocalStack.

Другие вопросы по тегам