Azure Key Vault Secrets Spring Boot Starter 0.1.5

Sep 04 2020

이전 버전의 Azure Key Vault Secrets Spring Boot Starter-0.1.5를 사용하고 있습니다. 또한 아래와 같이 이전 버전의 spring-boot-starter도 사용하고 있습니다.

 <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.1.15.RELEASE</version>
  </parent>

  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter-web-services</artifactId>
    </dependency>

Azure keyvault에 대한 코드 변경 사항은 없습니다. application.properties에서 아래에 추가했습니다.

azure.keyvault.uri=<<Keyvault URL>>
azure.client-id=<<Keyvault client Id>>
azure.client-key=<<Keyvault Key>>

이제 Spring boot starter 및 azure keyvault 버전을 아래와 같이 업그레이드했습니다.

 <parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.3.RELEASE</version>
  </parent>

    <dependency>
      <groupId>com.microsoft.azure</groupId>
      <artifactId>azure-keyvault-secrets-spring-boot-starter</artifactId>
      <version>2.3.3</version>
      <scope>runtime</scope>
    </dependency>

application.properties

azure.keyvault.uri=<<Keyvault URL>>
azure.keyvault.enabled=true
azure.client-id=<<Client-ID>>
azure.client-key=<<Cleint key>>

아래 오류로 실패했습니다. 최신 버전으로 업그레이드하는 경우 수행해야 할 작업을 도와 주시겠습니까?

13 : 36 : 59.270 [main] ERROR org.springframework.boot.SpringApplication-응용 프로그램 실행 실패 java.lang.IllegalStateException : com.microsoft.azure.keyvault.spring.KeyVaultEnvironmentPostProcessorHelper.addKeyVaultPropertySource (KeyVaultEnvironmentPostProcessorHelper.java에서 KeyVault 속성 소스를 구성하지 못했습니다. : 110) at com.microsoft.azure.keyvault.spring.KeyVaultEnvironmentPostProcessor.postProcessEnvironment (KeyVaultEnvironmentPostProcessor.java:47) at org.springframework.boot.context.config.ConfigFileApplicationListener.onApplicationEnvironmentPreparedEvent (ConfigFileApplicationListener.java:200) at org.springframework. org.springframework.context.event.SimpleApplicationEventMulticaster.doInvokeListener (SimpleApplicationEventMulticaster.java:172)의 boot.context.config.ConfigFileApplicationListener.onApplicationEvent (ConfigFileApplicationListener.java:188) at org.springframework.context.event.SimpleApplicationEventMulticaster.invokeListener (SimpleApplicationEventMulticaster. jav a : 165) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent (SimpleApplicationEventMulticaster.java:139) at org.springframework.context.event.SimpleApplicationEventMulticaster.multicastEvent (SimpleApplicationEventMulticaster.java:127) at org.springframework.boot.context org.springframework.boot.SpringApplicationRunListeners.environmentPrepared (SpringApplicationRunListeners.java:53)의 .event.EventPublishingRunListener.environmentPrepared (EventPublishingRunListener.java:80) at org.springframework.boot.SpringApplication.prepareEnvironment (SpringApplication.java:345) com의 org.springframework.boot.SpringApplication.run (SpringApplication.java:1226)에서 org.springframework.boot.SpringApplication.run (SpringApplication.java:1237)에서 springframework.boot.SpringApplication.run (SpringApplication.java:308) .honeywell.CaaS.GatewayManagerAPI.webapi.SpringBootMain.main (SpringBootMain.java:47) 원인 : java.lang.RuntimeException : 최대 재시도 횟수가 3 회를 초과했습니다. 오류 세부 정보 : 네트워크에 연결할 수 없습니다. com.azure.core.http.policy.RetryPolicy.lambda에서 연결$attemptAsync$reactor.core.publisher.FluxOnErrorResume의 1 (RetryPolicy.java:119)$ResumeSubscriber.onError(FluxOnErrorResume.java:88) at reactor.core.publisher.MonoFlatMap$Reactor.core.publisher.MonoFlatMap의 FlatMapMain.onError (MonoFlatMap.java:165)$FlatMapMain.onError(MonoFlatMap.java:165) at reactor.core.publisher.MonoFlatMap$Reactor.core.publisher.MonoFlatMap의 FlatMapMain.secondError (MonoFlatMap.java:185)$FlatMapInner.onError(MonoFlatMap.java:251) at reactor.core.publisher.MonoPeekTerminal$Reactor.core.publisher.MonoPeekTerminal의 MonoTerminalPeekSubscriber.onError (MonoPeekTerminal.java:251)$MonoTerminalPeekSubscriber.onError(MonoPeekTerminal.java:251) at reactor.core.publisher.FluxPeekFuseable$reactor.core.publisher.FluxPeekFuseable의 PeekFuseableConditionalSubscriber.onError (FluxPeekFuseable.java:545)$PeekFuseableConditionalSubscriber.onError(FluxPeekFuseable.java:545) at reactor.core.publisher.Operators.error(Operators.java:196) at reactor.core.publisher.FluxFlatMap.trySubscribeScalarMap(FluxFlatMap.java:134) at reactor.core.publisher.MonoFlatMap.subscribeOrReturn(MonoFlatMap.java:53) at reactor.core.publisher.InternalMonoOperator.subscribe(InternalMonoOperator.java:57) at reactor.core.publisher.MonoDefer.subscribe(MonoDefer.java:52) at reactor.core.publisher.MonoFlatMap$Reactor.core.publisher.FluxMapFuseable의 FlatMapMain.onNext (MonoFlatMap.java:150)$MapFuseableSubscriber.onNext(FluxMapFuseable.java:121) at reactor.core.publisher.FluxMapFuseable$Reactor.core.publisher.FluxPeekFuseable의 MapFuseableSubscriber.onNext (FluxMapFuseable.java:121)$PeekFuseableSubscriber.onNext(FluxPeekFuseable.java:203) at reactor.core.publisher.Operators$Reactor.core.publisher.MonoSingle의 MonoSubscriber.complete (Operators.java:1782)$SingleSubscriber.onComplete(MonoSingle.java:171) at reactor.core.publisher.Operators$reactor.core.publisher.MonoFlatMapMany의 ScalarSubscription.request (Operators.java:2346)$FlatMapManyMain.onSubscribeInner(MonoFlatMapMany.java:143) at reactor.core.publisher.MonoFlatMapMany$Reactor.core.publisher.SerializedSubscriber.onNext (SerializedSubscriber.java:99)의 FlatMapManyMain.onNext (MonoFlatMapMany.java:182) at reactor.core.publisher.FluxRetryWhen$RetryWhenMainSubscriber.onNext(FluxRetryWhen.java:162) at reactor.core.publisher.MonoCreate$Reactor.netty.http.client.HttpClientConnect의 DefaultMonoSink.success (MonoCreate.java:156)$HttpIOHandlerObserver.onStateChange(HttpClientConnect.java:432) at reactor.netty.ReactorNetty$Reactor.netty.resources.PooledConnectionProvider의 CompositeConnectionObserver.onStateChange (ReactorNetty.java:518)$DisposableAcquire.onStateChange(PooledConnectionProvider.java:561) at reactor.netty.resources.PooledConnectionProvider$io.netty의 reactor.netty.channel.ChannelOperationsHandler.channelRead (ChannelOperationsHandler.java:96)에있는 reactor.netty.http.client.HttpClientOperations.onInboundNext (HttpClientOperations.java:594)의 PooledConnection.onStateChange (PooledConnectionProvider.java:448) .channel.AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext.java:379) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext.java:365) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead (AbstractChannelHandlerContext.java:357) at io. netty.channel.CombinedChannelDuplexHandler$DelegatingChannelHandlerContext.fireChannelRead(CombinedChannelDuplexHandler.java:436) at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:324) at io.netty.handler.codec.ByteToMessageDecoder.fireChannelRead(ByteToMessageDecoder.java:311) at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:425) at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:276) at io.netty.channel.CombinedChannelDuplexHandler.channelRead(CombinedChannelDuplexHandler.java:251) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) at io.netty.handler.ssl.SslHandler.unwrap(SslHandler.java:1526) at io.netty.handler.ssl.SslHandler.decodeNonJdkCompatible(SslHandler.java:1287) at io.netty.handler.ssl.SslHandler.decode(SslHandler.java:1324) at io.netty.handler.codec.ByteToMessageDecoder.decodeRemovalReentryProtection(ByteToMessageDecoder.java:501) at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:440) at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:276) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:379) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:365) at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:357) at io.netty.channel.DefaultChannelPipeline$HeadContext.channelRead (DefaultChannelPipeline.java:1410) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext.java:379) at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead (AbstractChannelHandlerContext.java:365) at io.netty.channel io.netty.channel.nio.AbstractNioByteChannel의 .DefaultChannelPipeline.fireChannelRead (DefaultChannelPipeline.java:919)$NioByteUnsafe.read(AbstractNioByteChannel.java:163) at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:714) at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:650) at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:576) at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:493) at io.netty.util.concurrent.SingleThreadEventExecutor$4. io.netty.util.internal.ThreadExecutorMap에서 (SingleThreadEventExecutor.java:989) 실행$2.run(ThreadExecutorMap.java:74) at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) at java.lang.Thread.run(Thread.java:748) Caused by: java.net.SocketException: Network is unreachable: connect at java.net.DualStackPlainSocketImpl.waitForConnect(Native Method) at java.net.DualStackPlainSocketImpl.socketConnect(DualStackPlainSocketImpl.java:85) at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:172) at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) at java.net.Socket.connect(Socket.java:606) at sun.net.NetworkClient.doConnect(NetworkClient.java:175) at sun.net.www.http.HttpClient.openServer(HttpClient.java:463) at sun.net.www.http.HttpClient.openServer(HttpClient.java:558) at sun.net.www.http.HttpClient.(HttpClient.java:242) at sun.net.www.http.HttpClient.New(HttpClient.java:339) at sun.net.www.http.HttpClient.New(HttpClient.java:357) at sun.net.www.protocol.http.HttpURLConnection.getNewHttpClient(HttpURLConnection.java:1226) at sun.net.www.protocol.http.HttpURLConnection.plainConnect0(HttpURLConnection.java:1162) at sun.net.www.protocol.http.HttpURLConnection.plainConnect(HttpURLConnection.java:1056) at sun.net.www.protocol.http.HttpURLConnection.connect(HttpURLConnection.java:990) at com.azure.identity.implementation.IdentityClient.lambda$checkIMDSAvailable $ 14 (IdentityClient.java:463) at reactor.core.publisher.MonoCallable.call (MonoCallable.java:91) at reactor.core.publisher.FluxFlatMap.trySubscribeScalarMap (FluxFlatMap.java:126)

답변

PamelaPeng Sep 07 2020 at 09:45

azure.keyvault.tenant-idapplication.properties 의 속성을 놓친 것 같습니다 .

이 오류 java.lang.IllegalStateException : Failed to configure KeyVault property source를 재현했습니다 . 보다:

azure.keyvault.tenant-id=<your-tenant-id>파일을 추가 한 후 . 효과가있다:


나는 참조 푸른 키 볼트의 봄 부팅 스타터를 사용하는 방법 과 샘플 . 작동하게하려면 애플리케이션에 Key Vault의 액세스 정책에서 비밀을 가져오고 나열 할 수있는 권한이 있는지 확인하십시오.

application.properties

azure.keyvault.enabled=true
azure.keyvault.uri=https://{your-azure-keyvault}.vault.azure.net/
azure.keyvault.client-id=put-your-azure-client-id-here
azure.keyvault.client-key=put-your-azure-client-key-here
azure.keyvault.tenant-id=put-your-azure-tenant-id-here

pom.xml

<parent>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-parent</artifactId>
    <version>2.3.3.RELEASE</version>
    <relativePath/> <!-- lookup parent from repository -->
</parent>

<properties>
    <java.version>11</java.version>
    <azure.version>2.3.3</azure.version>
</properties>

<dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>com.microsoft.azure</groupId>
            <artifactId>azure-spring-boot-bom</artifactId>
            <version>${azure.version}</version>
            <type>pom</type>
            <scope>import</scope>
        </dependency>
    </dependencies>
</dependencyManagement>

DemoKeyVaultApplication.java

@SpringBootApplication
@RestController
public class DemoKeyVaultApplication implements CommandLineRunner {

   @Value("${test1}")
   private String testSecretName;

   
    public static void main(final String[] args) {
        SpringApplication.run(DemoKeyVaultApplication.class, args);
    }

    public void run(final String... varl) throws Exception {        
        System.out.println("testSecretName stored in Azure Key Vault: " + testSecretName);
    }
}