$ {VAULT_SCHEME} не работает в bootstrap .properties - PullRequest
0 голосов
/ 02 мая 2020

Я настроил приложение весенней загрузки для получения свойств из моей среды, но странно, я сталкиваюсь с ошибкой при запуске моего приложения. Я добавил свойства в свой ~/.bash_profile, а также добавил source ~/.bash_profile после добавления их в профиль.

Вот так выглядят мои bootstrap .properties:

spring.application.name=gamification
spring.cloud.vault.enabled=${VAULT_ENABLE:true}
spring.cloud.vault.fail-fast=false
spring.cloud.vault.token=${VAULT_TOKEN}
spring.cloud.vault.scheme=${VAULT_SCHEME}
spring.cloud.vault.host=${VAULT_HOST}
spring.cloud.vault.port=${VAULT_PORT:8200}

Я получаю эту ошибку:

Caused by: org.springframework.beans.BeanInstantiationException: Failed to instantiate [org.springframework.cloud.vault.config.VaultReactiveBootstrapConfiguration]: Constructor threw exception; nested exception is java.lang.IllegalArgumentException: Scheme must be http or https
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:216) ~[spring-beans-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.beans.factory.support.SimpleInstantiationStrategy.instantiate(SimpleInstantiationStrategy.java:117) ~[spring-beans-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.beans.factory.support.ConstructorResolver.instantiate(ConstructorResolver.java:310) ~[spring-beans-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    ... 30 common frames omitted
Caused by: java.lang.IllegalArgumentException: Scheme must be http or https
    at org.springframework.util.Assert.isTrue(Assert.java:118) ~[spring-core-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    at org.springframework.vault.client.VaultEndpoint.setScheme(VaultEndpoint.java:167) ~[spring-vault-core-2.2.0.RELEASE.jar:2.2.0.RELEASE]
    at org.springframework.cloud.vault.config.VaultConfigurationUtil.createVaultEndpoint(VaultConfigurationUtil.java:91) ~[spring-cloud-vault-config-2.2.2.RELEASE.jar:2.2.2.RELEASE]
    at org.springframework.cloud.vault.config.VaultReactiveBootstrapConfiguration.<init>(VaultReactiveBootstrapConfiguration.java:110) ~[spring-cloud-vault-config-2.2.2.RELEASE.jar:2.2.2.RELEASE]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_231]
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_231]
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_231]
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_231]
    at org.springframework.beans.BeanUtils.instantiateClass(BeanUtils.java:203) ~[spring-beans-5.2.4.RELEASE.jar:5.2.4.RELEASE]
    ... 32 common frames omitted

Я добавил точку отладки в конечную точку Vault и нашел это: Here as you can see, the VAULT_HOST is being taken as VAULT_HOST instead of the value of that environment variable, and same with the VAULT_SCHEME

Здесь, как вы можете видеть, VAULT_HOST принимается за VAULT_HOST вместо значения этой переменной среды, и то же самое с VAULT_SCHEME

[EDIT] Добавление конфигурации хранилища bash_profile:

export VAULT_ENABLE=true
export VAULT_SCHEME=http
export VAULT_HOST=vault-1.dev.lokal
export VAULT_PORT=8200
export VAULT_TOKEN=5F97X

[EDIT # 2]

Попробовал решение, предложенное @Gopinath I am getting environment as null when trying to autowire it Я получаю окружение как нулевое при попытке его автоматического подключения

Ответы [ 2 ]

0 голосов
/ 02 мая 2020

Я сделал это: я сделал скрипт оболочки с именем setenv.sh и поместил его под ним:

#!/bin/bash

launchctl setenv VAULT_ENABLE true
launchctl setenv VAULT_SCHEME http
launchctl setenv VAULT_HOST vault-1.dev.lokal
launchctl setenv VAULT_PORT 8200
launchctl setenv VAULT_TOKEN 5F97X

И затем, перед запуском приложения, я запустил скрипт оболочки с

sudo sh setenv.sh

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

0 голосов
/ 02 мая 2020

Причина проблемы root может быть найдена из этого сообщения об ошибке:

org.springframework.core.convert.ConverterNotFoundException: 

No converter found capable of converting 
from type [java.lang.String] 
to type [org.springframework.cloud.vault.config.VaultProperties$Config]

Приведенное выше сообщение указывает, что объект VaultProperties не может быть инициализирован с использованием предоставленного строкового параметра.

Вот ссылка на документацию и инструкции по настройке VaultProperties:

https://spring.io/guides/gs/vault-config/

Дополнительная информация, помогающая понять хранилище:

Ссылки:

Хранилище Spring Cloud: https://cloud.spring.io/spring-cloud-vault/ Хранилище Хашикорпа: https://www.vaultproject.io

Что такое хранилище?

Хранилище - это безопасное место для хранения секретной информации. Hashicorp Vault - это один инструмент, который предлагает функции хранилища для облачных приложений.

Что такое Spring Boot Vault?

Для приложений Spring Boot обычно требуется секретная информация для работы. Вот некоторые примеры секретной информации:

  1. Пароль базы данных
  2. Личный ключ
  3. Ключ API

Обычно входные параметры передаются в Spring загрузить приложение через файл «application.properties» или «bootstrap .properties». Использование такого файла свойств представляет угрозу безопасности, если в нем непосредственно упоминаются секретные данные.

Spring Boot Vault устраняет этот риск. Он извлекает секретную информацию из хранилища и передает ее приложению во время запуска.

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

Как настроить хранилище?

Шаг 1: Установить и запустить HashiCorp Vault из https://www.vaultproject.io/downloads.html:

Шаг 2: После установки Vault проверьте, работает ли он, запустив его в окне консоли.

> vault server --dev --dev-root-token-id="spring-boot-vault-demo"

==> Vault server configuration:
    Api Address: http://127.0.0.1:8200
                         Cgo: disabled
             Cluster Address: https://127.0.0.1:8201
                  Listener 1: tcp (addr: "127.0.0.1:8200", cluster address: "127.0.0.1:8201", max_request_duration: "1m30s", max_request_size: "33554432", tls: "disabled")
                   Log Level: info
                       Mlock: supported: false, enabled: false
               Recovery Mode: false
                     Storage: inmem
                     Version: Vault v1.4.1

    WARNING! dev mode is enabled! 
    .....

    You may need to set the following environment variable:

    PowerShell:
        $env:VAULT_ADDR="http://127.0.0.1:8200"
    cmd.exe:
        set VAULT_ADDR=http://127.0.0.1:8200

    The unseal key and root token are displayed below in case you want to
    seal/unseal the Vault or re-authenticate.

    Unseal Key: +Dihvgj/oRN2zo6/97ZqpWt086/CFRZEPkuauDu4uQo=
    Root Token: spring-boot-vault-demo

Шаг 3: Сохраните некоторые секретные данные в хранилище, выполнив эти команды в отдельном окне команд:

> set VAULT_ADDR=http://127.0.0.1:8200

> set VAULT_TOKEN=spring-boot-vault-demo

> vault kv put secret/spring-boot-vault-demo password=££££$$$$%%%%
    Key              Value
    ---              -----
    created_time     2020-05-02T09:59:41.2233332Z
    deletion_time    n/a
    destroyed        false
    version          1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...