Переопределить имя хоста S3 для предварительно назначенных URL-адресов в Minio.NET? - PullRequest
0 голосов
/ 29 октября 2019

Я работаю над проектом, в котором мы запускаем сервер S3 (MinIO) в контейнере Docker вместе с API и базой данных. Эти три службы работают в сети Docker.

В сети Docker сервер S3 отображается с произвольным IP-адресом (например, 172.18.0.3), а также доступен по его имени контейнера (для этого примера мыпросто скажу s3). Из вне сети сервер S3 доступен через порт 9000, но доступ к нему может потребоваться либо по фактическому IP-адресу компьютера разработчика (например, 192.168.1.5), либо через localhost, если доступ осуществляется непосредственно на компьютере разработчика. ,

В моем сценарии пользовательское приложение использует библиотеку MinIO.NET для отправки файла на сервер S3 в контейнере, а затем добавляет запись в базу данных, включая предопределенный URL-адрес, созданный MinIO.NET. API отслеживает базу данных и видит добавление, а затем пытается использовать предварительно назначенный URL-адрес для извлечения файла для его обработки. Проблема заключается в том, что имя хоста внутри и за пределами контейнерной сети различается, и API не может получить файл, поскольку подпись не совпадает.

(Примечание. Мы используем S3потому что в конечном итоге мы намерены использовать его на общедоступных серверах S3, где эта проблема может не возникать. Эта проблема характерна для сред разработки / тестирования.)

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

  1. Требовать, чтобы кто-либо отправлял сообщения на сервер S3, чтобы добавить s3 в свой файл hosts, чтобы клиент MinIO работал вне контейнерасеть может получить доступ к серверу S3 с правильным именем хоста. Это некрасиво, недостаточно широко поддерживается и требует от людей понимания, как редактировать защищенный файл в Windows. Bad.

  2. Подкласс класса V4Authenticator в библиотеке MinIO.NET, добавление некоторого параметра для переопределения хоста при генерации подписи. (Библиотека .NET, по-видимому, отвечает за генерацию подписи, а не сам сервер MinIO.) Проблема в том, что код MinIO.NET не соответствует принципам DI, поэтому мне пришлось бы в конечном итоге раскошелиться на весь репозиторий, чтобы сделать это,поскольку код инициализации непосредственно создает объекты V4Authenticator. (Код использует интерфейс IAuthenticator, но похоже, что он используется для модульного тестирования, а не для целей DI)

  3. Скопируйте / вставьте код, который генерирует предварительно заданный URL-адрес. Кажется, немного лучше, но библиотека работает напрямую с объектами HttpRequest, чтобы извлечь заголовки и тому подобное, необходимое для подписи. Опять же, это может в конечном итоге потребовать некоторой глубокой переписки или модификации (разветвления) библиотеки MinIO.NET, просто чтобы она открыла доступ к этим объектам HttpRequest для моего собственного кода.

  4. Пропустите MinIO.NET полностью и просто напишите мою собственную библиотеку. Очень утомительно и не идеально, не говоря уже о потенциально небезопасных (?)

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

Есть идеи?

...