Как загрузить spring application.yml из S3

#java #spring-boot #amazon-s3 #spring-boot-test

#java #spring-загрузка #amazon-s3 #spring-boot-test

Вопрос:

У меня есть куча файлов свойств spring application.yml в корзине S3 для другой среды. Я хочу загрузить файлы свойств из корзины S3, чтобы гарантировать конфигурацию без состояния.

 // Config Object
@Configuration
@ConfigurationProperties(prefix = "yaml")
public class YamlFooProperties {
    private String name;
    private List<String> aliases;
    // standard getter and setters
}

// foo.yml file located in S3 bucket
yaml:
  name: foo
  aliases:
    - abc
    - xyz
  

Как заставить мое приложение spring-boot загружать эти свойства и делать их доступными при запуске приложения?

Я использую версию spring-boot 2.2.6.RELEASE и Java 11.

Комментарии:

1. Согласно baeldung.com/spring-reloading-properties#reloading-from-file можно ввести свойства из файла, используя –spring.config.location=file://{path to file}. Can it assist?

Ответ №1:

Метод 1: напишите несколько очень простых сценариев запуска, которые сначала извлекают (скажем curl ) из S3 в локальный файл (скажем s3-config.yaml ), а затем запускают ваше приложение в обычном режиме.

Метод 2. Если вы используете Kubernetes (что является хорошей идеей для развертывания систем), вы можете использовать другие способы, такие как ConfigMap или Helm для развертывания вашего приложения, чтобы удовлетворить вашу потребность в «гарантии конфигурации без состояния».

Метод 3: Если вам нужна только Java (без скрипта, без k8s и т. Д.), Вы можете записать какой-нибудь простой Java-код, который извлекает файл из S3, а затем вызвать запуск вашего SpringBootApplication с этими данными.

Комментарии:

1. Нам нужно решение на Java, где приложение делает это, т.е. загружает файл свойств

2. Шаг 3 был бы правильным, однако я не уверен, как это сделать. Должен быть простой способ загрузить внешний ресурс из s3 и заполнить объект конфигурации при запуске

3. @breaktop S3 должен предоставить вам Java API (например, пакет maven). Тогда внутри этого API должен быть один метод, скажем, S3.downloadFile("my_url") который загрузит ваши данные s3 в память или локальный файл. Таким образом, вам нужно будет всего лишь написать несколько строк кода для извлечения этого файла yaml.

4. После загрузки файла, как бы вы настроили объект конфигурации. Я имею в виду, как бы вы объединили значения объектов из файла yml. Я погуглил, но не смог этого сделать

5. @breaktop Вы можете поместить его на локальный диск, скажем my-downloaded-file.yaml , а затем передать его Spring. О том, как его передать, самый наивный способ (могут существовать лучшие способы) — установить переменные среды.

Ответ №2:

Вам не нужно хранить конфигурации в s3. Опция по умолчанию, которую предлагает Spring Cloud, — это хранилище с поддержкой git, которое мне кажется более выгодным. Тем не менее, существует также поддержка S3.

https://cloud.spring.io/spring-cloud-config/reference/html/#_aws_s3_backend

Таким образом, ваш сервер конфигурации EnvironmentRepository настроен на использование корзины S3 в качестве основного хранилища.

Комментарии:

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

2. Правильно ли, что для этого вам нужен экземпляр сервера Spring Cloud Config?